読者です 読者をやめる 読者になる 読者になる

ごらくらいふ

プログラミングしたりゲームしたり

プログラムする前にペーパークラフトするのは

設計 考え方 プログラミング TypeScript

先日、すごくためになりそうなツイートを見た。

最近、マルバツゲームを元にBDDやってみようと始めたところ、無計画ゆえに案の定停滞してしまった。 ここはひとつ有能な人の手法を利用しようと思った次第。

yajamon.hatenablog.com

手探り状態のとき

マルバツゲームは空いてるマスにマルとバツを埋めていくゲームだ。

マスが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にべったりな気がして落ち着かない。

とにかくクラフトだ

f:id:yajamon:20160404181033j:plain

f:id:yajamon:20160404175724j:plain

作ってみた。

見えてくる設計

ざっくり作ってみるだけでも、これは設計のポイントじゃないか、と思えるものがいくつか見えてきた。

  1. マル・バツはマス目の状態じゃなく、マス目に置けるものに見えた
    • Puttableというinterfaceが見えた
      • (置くものであることを表現したいので英語力ください)
      • (Pieceが適切?)
    • マス目の状態は"置いてある"か"置いていないか"の2つ
  2. マスを1つ埋めるとき、GameやFieldが直接マル・バツを意識しなくてもいい
    • マスを埋めるモノを持っているのはプレイヤー
      • Playerというclassが見えた
    • ゲーム開始時に、2人のプレイヤーにマル、バツを配り、Gameは誰の手番か管理するほうが自然

if設計

紙を自由に動かせるので、違うパターンをすぐに試せるの便利だった。

プレイヤーは1人では

f:id:yajamon:20160404182739j:plain

操作するのは結局Webページを開いている1人と考えると、別にマル・バツを配らずに、 ゲーム管理クラス側で管理してもいいんじゃないか。と考えた場合。

マス目クリック時にgame.put(x, y)と呼ぶだけで済みそう。 そのかわり「今操作するとマル(バツ)を置く」ことを明示したほうがいい。ということが見えた。

最初のコードにそってマス目をクラフトしてみる

f:id:yajamon:20160404183301j:plain

「マス目が状態を切り替える」ってつまりこういう事では。 大した作業じゃないけど、微妙にめんどくさかった。

クラフトする時点でめんどくさいのだから、コードにしてもめんどくさいんじゃないかな。

所感・その後

ペーパークラフト最強では。そりゃあ有能な人が使うわけだ。 有能に近づきたい。

現在は「ゲームルール」という「概念」をクラフトなりBDDなりに落としこむ方法を考え中。