先日、すごくためになりそうなツイートを見た。
ゲームに限らないけど、プログラムする前にペーパークラフトから入る人の有能率すごい高い気がする。
— 尾野(しっぽ) (@tail_y) March 30, 2016
最近、マルバツゲームを元にBDDやってみようと始めたところ、無計画ゆえに案の定停滞してしまった。 ここはひとつ有能な人の手法を利用しようと思った次第。
手探り状態のとき
マルバツゲームは空いてるマスにマルとバツを埋めていくゲームだ。
マスが3x3に集まったものをFieldとして定義したは良いものの、 肝心のマスがどうあればマルで、どうあればバツとするかの定義に迷ってしまった。
そこで書いたコードが以下である。
enum SQUARE_STATE { EMPTY, CIRCLE, CROSS, } class Square { state:SQUARE_STATE; }
目前の書きかけのコードとぼんやりとした想像だけで進めた結果、こういうコードを書いてしまう。
これを元に動作を実装すると以下のような感じだろうか。
class Game { field; setState(x, y){ var state = this.getSide(); // CIRCLE or CROSS this.field.setSquareState(x, y, state); } setSquareState(x, y, state){ this.field.getSquare(x, y).set(state); } }
規模が小さいのでまあ別に…って気もする。が、なんだかGameがSquareにべったりな気がして落ち着かない。
とにかくクラフトだ
作ってみた。
見えてくる設計
ざっくり作ってみるだけでも、これは設計のポイントじゃないか、と思えるものがいくつか見えてきた。
- マル・バツはマス目の状態じゃなく、マス目に置けるものに見えた
Puttable
というinterfaceが見えた- (置くものであることを表現したいので英語力ください)
- (Pieceが適切?)
- マス目の状態は"置いてある"か"置いていないか"の2つ
- マスを1つ埋めるとき、GameやFieldが直接マル・バツを意識しなくてもいい
- マスを埋めるモノを持っているのはプレイヤー
Player
というclassが見えた
- ゲーム開始時に、2人のプレイヤーにマル、バツを配り、Gameは誰の手番か管理するほうが自然
- マスを埋めるモノを持っているのはプレイヤー
if設計
紙を自由に動かせるので、違うパターンをすぐに試せるの便利だった。
プレイヤーは1人では
操作するのは結局Webページを開いている1人と考えると、別にマル・バツを配らずに、 ゲーム管理クラス側で管理してもいいんじゃないか。と考えた場合。
マス目クリック時にgame.put(x, y)
と呼ぶだけで済みそう。
そのかわり「今操作するとマル(バツ)を置く」ことを明示したほうがいい。ということが見えた。
最初のコードにそってマス目をクラフトしてみる
「マス目が状態を切り替える」ってつまりこういう事では。 大した作業じゃないけど、微妙にめんどくさかった。
クラフトする時点でめんどくさいのだから、コードにしてもめんどくさいんじゃないかな。
所感・その後
ペーパークラフト最強では。そりゃあ有能な人が使うわけだ。 有能に近づきたい。
現在は「ゲームルール」という「概念」をクラフトなりBDDなりに落としこむ方法を考え中。