リバーシ


プログラムの中身なかみくわしくみてみよう

黒と白を交互こうごいていくリバーシを作りましょう。
このプログラムでは実際じっさい盤面ばんめんまわりに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を送りゲームを開始します。

^