プログラムの 中身 を 詳 しくみてみよう
黒と白を 交互 に 置 いていくリバーシを作りましょう。
このプログラムでは 実際 の 盤面 の 周 りに1マス 増 やした 仮想 の 盤面 を使います。
一般的 なリバーシの 盤面 は8×8マスであり、 このとき 仮想 の 盤面 は10×10マスになります。
1つのマスを表すスプライト(マス)をつくり、 実際 の 盤面 のマスの数(8×8=64)だけクローンを 並 べて 実現 します。
-
概要
-
用語の 説明
概要
大まかな 内容
をクリックして開始します。
開始時には 盤面 の中央の4つのマスに黒、白の石が2つずつ 置 かれます。
黒、白の 順 に 交互 にマスに石を 置 いていきます。 ただし、すでに 置 いている自分の石とこれから 置 く自分の石で 相手の石を 挟 むことができるマスにしか石を 置 くことはできません。
縦 、横、 斜 めの8方向のどれか1つの方向で相手の石を 挟 むことができれば石を 置 くことができます。
置 いた石とすでに 置 いてある自分の石で 挟 んでいる相手の石が 裏 返って自分の石になります。
例 えばゲーム開始時であれば黒が 置 けるのは次の図の1~4のいずれかのマスだけです (この 外側 のマスもすべて 置 けません)。
1もしくは2に黒の石を 置 いたら左上の白の石が 裏 返って黒になります。 3もしくは4に黒の石を 置 いたら右下の白の石が 裏 返って黒になります。
このプログラムではそのターンで 裏 返した石がわかるように色を少し 変 えています。
- 次のターンの石( 対戦 相手の石)が 置 かれたら 通常 の色になります。
石が 置 けるマスがない時のみ、PASSボタンを 押 して石を 置 かずに相手のターンにします。 (このプログラムでは 置 ける場所があるかないかを 判定 する 処理 をしていないため、 置 ける場所があった場合でもPASSボタンを 押 すと相手のターンになってしまいます)。
パスは何度でもすることができます。黒、白のどちらも 置 けるマスがなくなったら終了です。
RESULTボタンを 押 すと、黒、白のそれぞれの石の数を 表示 します。
もう一度RESULTボタンを 押 すと 表示 が消えます。ゲームの 途中 でも石の数を 表示 することができます。
マス

がクリックされたとき
-
説明
-
それぞれのマスを 配置 し、中央に4つの石を 置 いた 状態 にします。
コードの 詳細
-
盤面 の 設定 を実行して1マスの 幅 や1辺のマスの数などを 設定 します。
初期化 を実行して 各変数 、リストを初期の 状態 にします。
「Start」を受け取ったとき
-
説明
-
Startを受け取ったときに以下を実行します。
コードの 詳細
-
マスを 並 べるを実行して各マスを 配置 します。
石を中央に 置 くを実行して 盤面 の中央に黒を2つ、白を2つ石を 置 きます。
石 更新 を送ります。
盤面 の 設定
-
説明
-
1マスの 幅 や 1辺のマス数を 設定 し、 それをもとに 基準 とする左下のマスの 座標 などを計算します。
コードの 詳細
-
1マスの 幅 を40(px)にします。
1辺のマス数を8にします (これが 実際 に 表示 する 盤面 の1辺のマス数です)。
1辺のマス数( 仮想 )を( 1辺のマス数+2)にします
(これは 仮想 の 盤面 の1辺のマス数です。 実際 の 盤面 のマスが8×8であれば 仮想 の 盤面 のマス数は10×10となります)。
盤面 の中央の 座標 を0とし、 左下 隅 マスのx 座標 を計算します。
-
盤面 の 幅 が「1マスの 幅 × 1辺のマス数」(40×8=320)であり、 左下 隅 マスのx 座標 は 「-( 盤面 の 幅 の半分-1マスの 幅 の半分)」となります。
左下 隅 マスのy 座標 の 値 は 左下 隅 マスのx 座標 の 値 と同じです。
左下 隅 マス( 仮想 )のx 座標 と y 座標 は 左下 隅 マスの 座標 から 1マスの 幅 分だけ 外側 になります。
初期化
-
説明
-
各変数 、リストを 初期化 します。
コードの 詳細
-
オリジナルは 表示 しないため 隠 します。
クローン?をnoにします。
ターンを1(黒)にします。
コスチュームをなしにします。
マスリストの 要素 を 一旦 すべて 削除 します。
仮想 の 盤面 のマスの数だけ マスリストに0を 追加 します。
マスリストの 各要素 が各マスの 状態 を示します。 この時点ではすべてのマスが「なし」の 状態 となります。
マスを 並 べる
-
説明
-
実際 の 盤面 のマスの数(1辺のマス数× 1辺のマス数)だけクローンを作成して 配置 します。
左下 隅 のマスから作り 始 め、右に 並 べていきます。マスを1行分 並 べたらその上にまた左からマスを 並 べます。
仮想 の 盤面 のマス数(1辺のマス数( 仮想 )× 1辺のマス数( 仮想 ))分の 要素 を持つ マスリストを用意し、 それぞれのマスの 状態 を 管理 します。
それぞれのマスの 管理 のしかたは 「 仮想 の 盤面 とそれぞれのマスの 状態 の 管理 」 で 説明 していますので、そちらを見てください。
コードの 詳細
-
マスの 座標 を左下 隅 マスの 座標 にします ( 仮想 の 盤面 の左下 隅 ではなく 実際 の 盤面 の左下 隅 のマスです)。
番号を 1辺のマス数( 仮想 )+2にします (8×8の 盤面 であれば12です)。
まず 以下 のAの 処理 を 1辺のマス数(列数)回くり返し、 実際 の 盤面 の一番下の行のマスを 並 べます。
- A :
自分自身のクローンを作ります。
クローン作成時の 処理 が進んでから次の 処理 に進むように 念 のため0秒待つブロックを 置 いています。
右 隣 の列に 移動 するためにx 座標 を1マスの 幅 だけ 増 やします。
番号を1 増 やします。 -
1行分 並 べ終わったらx 座標 を 左下 隅 マスのx 座標 に 戻 します。
上の行に 移動 するためにy 座標 を 1マスの 幅 だけ 増 やします。
右端 と 左端 の 仮想 のマスを 飛 ばすために 番号を2 増 やします。
これを 1辺のマス数(行数)回くり返し、 1辺のマス数× 1辺のマス数(8×8)のマスを 並 べます。
クローンされたとき
-
説明
-
各マスがクローンされたときにそれぞれがおこなう 処理 です。
実際 の 盤面 のマスの数が8×8=64であれば、64回実行されます。
コードの 詳細
-
表示 します。
マス番号の 値 を 番号にします。
マス番号は このクローンが何番目のマス(どの 位置 のマス)であるかを示します。
x 座標 、 y 座標 を マスのx 座標 、 マスのy 座標 に 保存 しておきます。 これはゲーム中にマスを 誤 って 移動 させてしまった場合でも 石 更新 を受け取ったときに元の 位置 に 戻 せるようにするためです。
このマスが何行目、何列目であるかも マスの行、 マスの列に 保存 しておきます。 現在のプログラムでは使っていませんが、 改造 する場合に使う 可能性 があります。
マスリストの マス番号番目の 値 が このマスの 状態 を示します。
マスリストの マス番号番目の 値 が0の場合はコスチュームを なしにします。
0 以外 の場合、0より大きければ(1 以上 なら)コスチュームを黒にし、 そうでなければ(0より小さければ)コスチュームを白にします。
クローンされたときは0になっているはずですが、 念 のため0 以外 だった場合にどうするのかも書いています。
石を中央に 置 く
-
説明
-
このゲームは 盤面 の中央のマスに黒と白の石を2ずつ 置 いた 状態 で開始します。
実際 の 盤面 のマス数が8x8( 仮想 の 盤面 のマス数が10×10)であれば45番目、 46番目、55番目、56番目の4つのマスに石を 置 きます。
コードの 詳細
-
仮想 の 盤面 の全マス数の2分の1から 仮想 の 盤面 の1辺のマス数の2分の1を引いた 値 を 番号にします。
これは中央の4つのうちの左下のマスの番号です。
マスリストの 番号番目の 値 を1(黒)にします。
次にその右 隣 のマスを白にします。
(マスリストの (番号+1)番目の 値 を-1(白)にします。
番号を (左下のマスの番号+ 仮想 の 盤面 の1辺のマス数)にします。
これは中央の4つのうちの左上のマスの番号です。
マスリストの 番号番目の 値 を-1(白)にします。
次にその右 隣 のマスを黒にします
(マスリストの( 番号+1)番目の 値 を1(黒)にします。
石 更新 を受け取ったとき
-
説明
-
マスリストのそれぞれの 要素 の マスの 状態 をもとに対応するマスのコスチュームを 変更 します。
誤 って 位置 をずらしてしまったマスがあれば元の 位置 に 戻 します。
コードの 詳細
-
マスリストの マス番号番目の 値 (マスの 状態 ) によってコスチュームを 変更 します。
-
マスの 状態 が0の場合、0でない場合にわけ、0でなければ0より大きい場合、 0より小さい場合にわけるというようにしていますが、マスの 状態 =-2の場合、マスの 状態 =-1の場合、 マスの 状態 =0の場合、マスの 状態 =1の場合、 マスの 状態 =2の場合というように 順番 に 確認 していっても同じ 結果 となります。
マスの 座標 がずれてしまっている場合があるので、もとの 座標 に 戻 します。
このスプライトがクリックされたとき
-
説明
-
マスに石がなければ石を 置 けるかどうかを 確認 し、 置 ける場合は石を 置 き、ターンを 替 えます。
すでにマスに石が 置 いてある場合はなにもせずに終了します。
クリックされたマス(クローン)でのみ実行されます。
コードの 詳細
-
このマスにすでに石が 置 いてある場合 (マスリストの マス番号番目の 値 が0 以外 の場合) は何もしないでこのスクリプトを終了します。
0の場合(石が 置 かれていない場合)は 以降 の 処理 をします。
裏 返せる方向リストを空にします。
石を 置 ける?を実行します。 これはクリックしたマスの 周囲 の8方向の 状態 を調べ、このマスに石を 置 けるかどうかを 確認 する 処理 です。
相手の石を 裏 返すことができる方向が1つでもあれば石を 置 くことができます。 裏 返すことができる方向は 裏 返せる方向リストに 追加 されます。
裏 返す方向があった場合( 裏 返せる方向リスト の長さが1 以上 の場合)には石を 置 き、 自分の石で 挟 んだ相手の石を 裏 返してから相手のターンにします。
それは 以下 のAの 処理 でおこないます。
- A :
黒白(仮)→ 確定 を実行します。
これは相手が前回のターンで 裏 返した石を 確定 して 通常 の 状態 にします。
マスリストの マス番号番目の 値 を ターンの 値 にします(自分の色の石を 置 きます)。
各方向を 裏 返すを実行します。 これは各方向の相手の石を 裏 返す 処理 です。 -
石を 置 けないマスだった場合は ポップの音を鳴らして終了します。
石を 置 ける?
-
説明
-
石を 置 きたいマスの左方向、右方向、左上方向、左下方向、上方向、下方向、右上方向、 右下方向の 順 に相手の石を 裏 返せるかどうかを 判定 します。
裏 返せる方向が1つでもあればこのマスに石を 置 くことができます。
方向の 値 は次のようにします。
そのマスの番号に方向の 値 を足すとその方向の1つ 隣 のマスの番号になります。
各方向ごとの 判定 はこの方向で 裏 返せる? で 判定 します。
コードの 詳細
-
確認結果 を0にします。
左方向(-1)に対してこの方向で 裏 返せる? を実行します。
右方向(+1)に対してこの方向で 裏 返せる? を実行します。
方向を 1辺のマス数( 仮想 )-1にします。 これは左上を指しています。
以下 の 処理 を3回くり返し、6つの方向に対して 判定 します。
(左上、左下、上、下、右上、右下の 順 に 判定 しています)
- A :
方向に対して この方向で 裏 返せる?を実行します。(上の行の 判定 )
方向×(-1)に対して この方向で 裏 返せる?を実行します。(下の行の 判定 )
方向を1 増 やします。(方向を1つ右にずらします)
この方向で 裏 返せる?
-
説明
-
指定した方向に対して1マスずつ 確認 していき、 相手の石が1つ 以上 並 び 且 つその先に自分の石があればその間にある相手の石を 裏 返すことができます。
石を 置 きたいマスのすぐ 隣 が自分の石であったり、自分の石にたどりつく前に石がないマスがあったり、 盤面 の 端 まで相手の石が 並 んでいたりした場合はその方向では 裏 返すことができません。
コードの 詳細
-
隣 のマスの番号をマス番号+方向にします。
隣 のマスに石がなければ( 隣 のマスの 状態 が0なら) 確認結果 を0にして終了します。
隣 のマスに石があるなら( 隣 のマスの 状態 が0 以外 なら)Aの 処理 をします。
- A :
隣 のマスにある石が相手の石である場合、Bの 処理 をします。
隣 のマスにある石が相手の石でない場合(自分の石である場合)、Cの 処理 をします。 - B :
確認結果 を1 増 やします。
「1ずつ 変 える」を使っていますが、このプログラムでは「1にする」を使用しても同じ 結果 となります。 「1ずつ 変 える」を使うと 確認結果 の 値 と 並 んでいる相手の石の数が同じとなるので、 この方向に相手の石がいくつ 並 んでいるのかを 確認 することができます。 隣 のマスの番号と方向を使って この方向で 裏 返せる?を実行します (同じ方向のさらに1つ先のマスに対して 判定 します)。 - C :
確認結果 が0より大きければ 裏 返せる方向リストにこの方向を 追加 します。
確認結果 が0の場合は石を 置 きたいマスのすぐ 隣 が 自分の石ということなのでこの方向は 裏 返せないと 判定 し、リストへ 追加 しません。
確認結果 が1 以上 の場合は 途中 に相手の石があったということなので、 この方向は 裏 返すことができると 判定 し、リストへ 追加 します。 -
このプロジェクトは 仮想 のマスを 置 くことで 判定 をしやすくしています。
もし 仮想 のマスを 置 かずに次の図のような 状況 で14のマスに黒の石を 置 けるかを 判定 するとします。
-
マスリストの15番目、 16番目とリストの番号を 単純 に1つずつ 増 やして調べていくと 17番目の黒の石で 挟 めると 判定 してしまいます。 それを 防 ぐためには 端 に 到達 したかのチェックも 必要 となり、やや 複雑 になります。
そこでこのプログラムでは石が 置 かれることがない 仮想 のマスを 実際 の 盤面 の 外側 に 置 くことで、 相手の石が 続 いたまま 端 に着いたか?という 判定 をしなくて 済 むようにしています。
-
27に黒の石を 置 けるかを 判定 する場合、 黒の石がある32のマスにたどり着く前に石がない30の 仮想 のマスがあるので 裏 返すことができないという 判定 結果 となります。
このように 端 のマスであっても 端 以外 のマスと 同じ 判定 のしかたができるようにするために 仮想 のマスを 置 いています。
各方向を 裏 返す
-
説明
-
裏 返せる方向リストに 追加 された方向ごとに 1方向を 裏 返すを実行し、 相手の石を 裏 返して自分の石にしていきます。
コードの 詳細
-
番号を1にし、 裏 返せる方向リスト の長さの数だけAの 処理 をくり返します。
- A :
石を 置 きたいマスの番号と 裏 返せる方向リストの 番号番目の方向を渡して 1方向を 裏 返すを実行します。
番号を1 増 やします。 -
すべての方向を 裏 返したら石 更新 を送ります。
各方向を 裏 返すが実行された時点では マスリスト の中の 値 だけが 更新 されているだけで、 画面上 のマスの 状態 は 変 わっていません。
石 更新 を 受け取ったときの 処理 の中で 実際 にマスのコスチュームを 変更 します。
1方向を 裏 返す
-
説明
-
隣 のマスの石が自分の石であるか、もしくは石がない場合は何もせずに終了します。
隣 のマスが相手の石である場合は自分の石に 変更 し、さらに 隣 のマスの番号を渡して 1方向を 裏 返すを実行します。
コードの 詳細
-
隣 のマスの番号をマス番号+方向にします。
「ターン」×「マスリストの 隣 のマスの番号番目の 値 」が 0 未満 (負の 値 )であれば 隣 のマスには相手の石があると 判断 します。
ターンは 黒なら1、白なら-1です。 隣 のマスに石がなければ「 ターン」×「マスリストの 隣 のマスの番号番目の 値 」は 必 ず0になります。 ターンと 隣 のマスの石の色が同じである場合は同じ 符号 同士の かけ算であり黒×黒、白×白のどちらの場合も正の数(0より大きい)となります。
ターンと 隣 のマスの石の色が 異 なる場合は 異 なる 符号 同士の かけ算であり黒×白、白×黒のどちらの場合も負の数(0より小さい)となります。
隣 のマスの石が相手の石なら「マスリストの 隣 のマスの番号番目の 値 」をターン×2(2または-2)にし、 さらに 隣 のマスの番号を渡して 1方向を 裏 返すを実行します。
これは指定した方向に対して、 自分の色の石に当たるまで相手の石を 裏 返しています(石がないマスに当たった場合も この 処理 を止めるようにしていますが、 実際 には 裏 返すことができる方向に対してのみ 実行するので石がないマスに当たることはありません)。
黒白(仮)→ 確定
-
説明
-
石を 置 いたら、その前のターンで 裏 返した石の 状態 を 確定 します(2から1へ、または-2から-1へ 変更 します)。
コードの 詳細
-
番号を1にし、 マスリストの長さの数だけAの 処理 をくり返します。
- A :
マスリストの 番号番目の 値 が1より大きい場合(2の場合)は
マスリストの 番号番目の 値 を1にします。
マスリストの 番号番目の 値 が-1より小さい場合(-2の場合)は
マスリストの 番号番目の 値 を-1にします。
番号を1 増 やします。 -
すべての2を1へ、-2を-1へ 変更 し終わったら 石 更新 を送ります。
ターン
がクリックされたとき
-
説明
-
コスチュームと 座標 を 設定 します。
コードの 詳細
-
コスチュームを黒にします。
x 座標 を-200、y 座標 を160にします。
石 更新 を受け取ったとき
-
説明
-
ターンの 値 によってコスチュームを黒、 白のどちらかに 設定 します。
コードの 詳細
-
ターンが0 未満 (-1)ならコスチュームを白、 そうでなければ(1なら)コスチュームを黒にします。
PASSボタン

がクリックされたとき
-
説明
-
座標 を 設定 します。
コードの 詳細
-
x 座標 を-200、y 座標 を120にします。
このスプライトがクリックされたとき
-
説明
-
ターンを切り 替 えます。
コードの 詳細
-
ターンを ターン×(-1)にします。
(黒(1)なら白(-1)へ、白(-1)なら黒(1)にします)。 石 更新 を送ります。
RESULTボタン

がクリックされたとき
-
説明
-
座標 を 設定 し、黒、 白を 隠 します。
コードの 詳細
-
x 座標 を-200、y 座標 を84にします。
結果表示 を0にします。
黒を 隠 します。
白を 隠 します。
このスプライトがクリックされたとき
-
説明
-
黒の数と白の数の 表示 / 非表示 を切り 替 えます。
コードの 詳細
-
結果 が 表示 されていない( 結果表示 =0)の場合、 黒と白の数を集計して 表示 します。
-
黒白集計を実行してそれぞれの数を集計します。
黒、白を 表示 します。
結果表示 を1にします。 -
結果 が 表示 されている( 結果表示 =1)の場合、 黒、白を 隠 し、 結果表示 を0にします。
石 更新 を受け取ったとき
-
説明
-
石 更新 を受け取ったら 黒、 白の数を集計しなおします。
コードの 詳細
-
結果 が 表示 されている( 結果表示 =0)の場合のみ、 黒白集計を実行します。
黒白集計
-
説明
-
各マスの 状態 をチェックし、黒の数と白の数を集計します。
コードの 詳細
-
黒を0にします。
白を0にします。
マス番号を1にし、 マスリスト の長さの数だけ 以下 の 処理 をくり返します。
-
「マスリストの マス番号 番目の 値 」が0より大きい(1または2)場合は、 黒を1 増 やします。
「マスリストの マス番号 番目の 値 」が0より小さい(-1または-2)場合は、 白を1 増 やします。 -
黒を1 増 やします。
用語の 説明
マスの 状態
(※) 裏 返したばかりの 状態 。
次のターンが終わったら 確定 して、 通常 の 状態 ()になります。
仮想 の 盤面 とそれぞれのマスの 状態 の 管理
- 実際 の 盤面 (緑のマス)の 周 りに1マス 増 やしたものが 仮想 の 盤面 です。
実際 の 盤面 を8×8マスとした場合、 仮想 の 盤面 は10×10マスとなります。
仮想 の 盤面 のマス数(10×10マスであれば100)の 要素 を持つマスリストで それぞれのマスの 状態 を 管理 します。
仮想 の 盤面 のマスとマスリストの 各要素 は次の図のように対応させます。
Start
主な 動 き
がクリックされたらコスチュームをStartにして 表示 する。
- クリックされたら 各 スプライトへStartを送り、 非表示 にする( 各 スプライト Startを受け取ってゲーム開始)。

がクリックされたとき
-
説明
- ゲームスタートの 準備 をする。
必要な 処理
- 座標 の 初期化
Startの 表示
マウスポインターが上に乗ったとき色を 変 える コードの 詳細
-
x 座標 (横の 表示 位置 )を0、 y 座標 ( 縦 の 表示 位置 )を0にします。
コスチュームをStartにして 表示 します。 (ゲーム終了時は 非表示 になっているため)
マウスポインターがこのスプライトに 触 れているときは色を 変 え、 離 れたら元の色に 戻 します。
このスプライトがクリックされたとき
-
コードの 詳細
-
コード「
がクリックされたとき」が動作しているので、止めます。
各 スプライトにStartを送りゲームを開始します。