新たなフレーム

新たなゲーム用のフレーム HexOthelloFrame を規定します。

# --------------------------------------------------- after -----
class HexOthelloFrame(DefaultFrame):
def initialize(self):
self.panel = HexOthelloPanel()

従来の格子模様の盤面では、六角格子を表現できません。そのため、新たな盤面が必要になります。そこで、新たなパネルとして HexOthelloPanel を用意しました。

新たなパネル:クラス属性

新たなゲーム用のパネル HexOthelloPanel を規定します。

# --------------------------------------------------- after -----
class HexOthelloPanel(GameBoardPanel):
_bounds = (-1, -1), (1, -1), (2, 0)
_bounds = list(_bounds) + [(-x, -y) for x, y in _bounds]


クラス属性 _bounds には、任意のコマに対して(その境界を接するように取り囲む)6つのコマのオフセット座標を保持します。たとえば、座標 (3,2) のコマに対して、_bounds の各要素を適用すると、隣接する6つのコマの座標が得られます。
まず、_bounds の初期値を、3つの座標を列挙したタプルにしています。次に、最初の3つのオフセット座標はそのままをリストにして、残りの3つのオフセット座標は符号を反転したものをリストにして、これらを連結したリストを再設定しています。

新たなパネル:メソッド

(ゲーム用に開発した)既存のフレームワーク GameBoardPanel をもとに、その機能を拡張します。



# --------------------------------------------------- after -----
def locateItems(self):
for x, y in self._items():
self.items.append(NullStone(x, y, None))
for x, y, color in (
(6 , 3, self.black),
(9 , 4, self.black),
(6 , 5, self.black),
(10, 3, self.white),
(7 , 4, self.white),
(10, 5, self.white)):
self.place(HexStone(x, y, color))

〈改訂〉ゲームの初期画面を構成します。まず、後述する補助関数 _items で得られる各座標に(目に見えない)コマ NullStone を配置します。次に、(目に見える)白黒3つずつのコマ HexStone を配置します。

    def _items(self):
s = []
for y, xpoints in enumerate((
range(3, 14, 2),
range(2, 15, 2),
range(1, 16, 2),
range(0, 17, 2),
range(1, 16, 2),
range(0, 17, 2),
range(1, 16, 2),
range(2, 15, 2),
range(3, 14, 2))):
s += [(x, y) for x in xpoints]
return s

〈新規〉locateItems の補助関数として、盤面を構成する有効座標(コマを配置できる位置)を列挙したリスト s を生成します。最小6個から最大9個までのコマを、横方向に配置できます。


Previous|3/5|Next