ソリティア(トランプ)の設計
52(+ジョーカーの枚数)種類の値の位置を変化させる遊び
趣味でゲーム開発をしているsh-labといいます。
この記事ではソリティア(トランプ)※のゲームを作成した際の設計についてまとめました。
※ソリティアは1人でやるゲームのことです。トランプのソリティアだとクロンダイクやゴルフ、ピラミッド等があります。
今回の設計で重要な点は
カードの表と裏→観測者が決める
トランプとは何か→52(+ジョーカーの枚数)種類の値の集合。
ソリティア(トランプ)とは→52(+ジョーカーの枚数)種類の値の位置を変化させる遊び
です。
以下、設計の過程についてつらつら書いていきます。
設計方針
今回のソリティア(トランプ)の設計方針は「複数のゲームに対応できるアーキテクチャ」です。
トランプの定義(1回目)
ソリティア(トランプ)を設計するにあたり、まず考えたのはトランプのカードの定義でした。
初期の定義は1〜13(K)の数字とスペード、ハート、ダイヤ、クラブのスートの組み合わせとして定義しました。そして、ジョーカーは数字の0を割り当てていました。
上記の定義だとジョーカーに対応するスートがないため、スートにジョーカーを加え、数字の0の場合はスートはジョーカー(逆もしかり)という制約を設けた定義に変更しました。
表と裏から始まるトランプの定義の迷走
次に考えたのがトランプの表裏です。
まずは、カードに表と裏の状態を持たせることにしました。
そこから迷走が始まりました。
裏の状態のカードに数字とスートがあるのはおかしい→unknownを追加だ→4値論理ってあったな→ジョーカーはジョーカーかどうかの属性をもたせてundefined も追加だ→それならカードの一部が隠れている場合はどうする→(以下略
迷走していく中である文章を思い出しました。
鶏が道路を渡ったのか、道路が鶏を渡ったのかは、あなたの基準系次第である。ALBERT EINSTEIN
そうか、トランプの表と裏は観測者が決めるのか。で「スートにジョーカーを加え、数字の0の場合はスートはジョーカー(逆もしかり)という制約を設けた定義」に戻ってきました(ここまで2週間くらい悩んでいた)。
トランプの定義(2回目)
そこから実装していくなかで、カードは構造体として定義することにしました。
作成中に参加したもくもく会で構造体の話題となり、その会話(構造体は使わない方がいい、どうしても使うならこうつかう等 詳細は省略)の中で「トランプは52(+ジョーカーの枚数)種類の値の集合」という定義にたどり着きました。
トランプのカードは数字とスートで構成されるのでなく、単一の値として存在し、その値から数字とスートが導出できるのです。
位置を変える遊び
トランプのカードの定義ができたので、ゲーム部分の実装を行なっていました。
山札や場札といったクラスを作成し、カードを持たせる変数を作成する中であることに気がつきました。
「カードの値から数字やスートが導出できるならカードの位置も導出できる」
この気づきを経て
ソリティアとは52(+ジョーカーの枚数)種類の値の位置を変化させる遊びという設計に辿り着きました。
終わり
カードの位置とカードの位置を決定する関数、関数を変更するルールを定義することでソリティア(トランプ)が設計できる「複数のゲームに対応できるアーキテクチャ」に辿り着きました。
作成したコードは
ゲームは
となります。
最後まで読んで頂きありがとうございます。
この記事が気に入ったらサポートをしてみませんか?