リバーシの実装方法 - ゲーム部分

いちごパック > いちごリバーシ > リバーシの実装方法 - ゲーム部分

盤面の表現

リバーシを実装するには、まずコンピュータ上で盤面を表現する必要があります。 ここでは盤面を数値の配列で表し、石の置かれていない位置を0、黒石(先攻側)が置かれた場所を1、白石が置かれた場所を2で表すことにします。
盤面のサイズは8x8ですが、探索の際に配列外に行かないように、 周囲に1マスずつ、ダミーの数値として-1を入れることにします。
このとき、盤面は要素数が100の配列で表せます。初期状態での盤面データは次のようになります。
-1-1-1-1-1-1-1-1-1-1
-1 0 0 0 0 0 0 0 0-1
-1 0 0 0 0 0 0 0 0-1
-1 0 0 0 0 0 0 0 0-1
-1 0 0 0 2 1 0 0 0-1
-1 0 0 0 1 2 0 0 0-1
-1 0 0 0 0 0 0 0 0-1
-1 0 0 0 0 0 0 0 0-1
-1 0 0 0 0 0 0 0 0-1
-1-1-1-1-1-1-1-1-1-1
ビット演算を用いて探索を高速化する方法もありますが、ここでは扱いません。
このとき、リバーシの操作は次のように実装できます。
スコア計算盤面データ配列内にある1の要素数と2の要素数を数えます。
石を置けるか調べる操作置く位置が0以外の場合はおけません。0の場合は、置く位置を起点とした8方向を探索します。違う色の石を挟んで同じ色の石が存在する方向が存在すれば置けます。
石を置く操作置く位置を起点とした8方向を探索します。違う色の石を挟んで同じ色の石が存在する場合に、挟んでいる石を同じ色の石に変更します。
石を置ける場所を列挙する操作盤面上のすべての位置に対し、「石を置けるか調べる操作」を試します。

Javascriptによるコード例

いくつかの操作について、Javascriptによるコードの1例を載せます。

要素数100の配列を用いた盤面の初期化

  var board = [];
  var index;

for (index = 0; index < 100; index++) board.push(0); for (index = 0; index < 10; index++) { board[0*10+index] = -1; board[9*10+index] = -1; board[index*10+0] = -1; board[index*10+9] = -1; } board[4*10+4] = 2; board[4*10+5] = 1; board[5*10+4] = 1; board[5*10+5] = 2;

スコア計算

  var xpos, ypos, cur, num_scores;

num_scores = [0,0]; for (ypos = 1; ypos <= 8; ++ypos) { for (xpos = 1; xpos <= 8; ++xpos) { cur = board[ypos*10+xpos]; if (cur == 1) num_scores[0] ++; else if (cur == 2) num_scores[1] ++; } }

石を置く操作

  var dir_x, dir_y, cur;
  var xpos, ypos, count, inv_stone_type = 3 - stone_type;

board[ypos_try*10+xpos_try] = stone_type;
for (dir_y = -1; dir_y <= 1; dir_y++) { for (dir_x = -1; dir_x <= 1; dir_x++) { if (dir_x == 0 && dir_y == 0) continue; xpos = xpos_try + dir_x; ypos = ypos_try + dir_y; count = 0; while (board[ypos*10+xpos] == inv_stone_type) { xpos += dir_x; ypos += dir_y; count++; } if (count > 0 && board[ypos*10+xpos] == stone_type) { xpos = xpos_try + dir_x; ypos = ypos_try + dir_y; while (board[ypos*10+xpos] == inv_stone_type) { board[ypos*10+xpos] = stone_type; xpos += dir_x; ypos += dir_y; } } } }

ゲームとその実装方法

  • いちごリバーシを遊ぶ
  • 実装方法 - ゲーム部分
  • 実装方法 - 思考ルーチン