ソリティア(トランプ)の設計

画像1


52(+ジョーカーの枚数)種類の値の位置を変化させる遊び

趣味でゲーム開発をしているsh-labといいます。

この記事ではソリティア(トランプ)※のゲームを作成した際の設計についてまとめました。

※ソリティアは1人でやるゲームのことです。トランプのソリティアだとクロンダイクやゴルフ、ピラミッド等があります。

今回の設計で重要な点は

カードの表と裏→観測者が決める

トランプとは何か→52(+ジョーカーの枚数)種類の値の集合。

ソリティア(トランプ)とは52(+ジョーカーの枚数)種類の値の位置を変化させる遊び

です。

以下、設計の過程についてつらつら書いていきます。

設計方針

今回のソリティア(トランプ)の設計方針は「複数のゲームに対応できるアーキテクチャ」です。

トランプの定義(1回目)

ソリティア(トランプ)を設計するにあたり、まず考えたのはトランプのカードの定義でした。

初期の定義は1〜13(K)の数字とスペード、ハート、ダイヤ、クラブのスートの組み合わせとして定義しました。そして、ジョーカーは数字の0を割り当てていました。

上記の定義だとジョーカーに対応するスートがないため、スートにジョーカーを加え、数字の0の場合はスートはジョーカー(逆もしかり)という制約を設けた定義に変更しました。

表と裏から始まるトランプの定義の迷走

次に考えたのがトランプの表裏です。

まずは、カードに表と裏の状態を持たせることにしました。

そこから迷走が始まりました。

裏の状態のカードに数字とスートがあるのはおかしい→unknownを追加だ→4値論理ってあったな→ジョーカーはジョーカーかどうかの属性をもたせてundefined も追加だ→それならカードの一部が隠れている場合はどうする→(以下略

迷走していく中である文章を思い出しました。

鶏が道路を渡ったのか、道路が鶏を渡ったのかは、あなたの基準系次第である。ALBERT EINSTEIN

そうか、トランプの表と裏は観測者が決めるのか。で「スートにジョーカーを加え、数字の0の場合はスートはジョーカー(逆もしかり)という制約を設けた定義」に戻ってきました(ここまで2週間くらい悩んでいた)。

トランプの定義(2回目)

そこから実装していくなかで、カードは構造体として定義することにしました。

作成中に参加したもくもく会で構造体の話題となり、その会話(構造体は使わない方がいい、どうしても使うならこうつかう等 詳細は省略)の中で「トランプは52(+ジョーカーの枚数)種類の値の集合」という定義にたどり着きました。

トランプのカードは数字とスートで構成されるのでなく、単一の値として存在し、その値から数字とスートが導出できるのです。

位置を変える遊び

トランプのカードの定義ができたので、ゲーム部分の実装を行なっていました。

山札や場札といったクラスを作成し、カードを持たせる変数を作成する中であることに気がつきました。

カードの値から数字やスートが導出できるならカードの位置も導出できる

この気づきを経て

ソリティアとは52(+ジョーカーの枚数)種類の値の位置を変化させる遊びという設計に辿り着きました。

終わり

カードの位置とカードの位置を決定する関数、関数を変更するルールを定義することでソリティア(トランプ)が設計できる「複数のゲームに対応できるアーキテクチャ」に辿り着きました。

作成したコードは

ゲームは



となります。

最後まで読んで頂きありがとうございます。




この記事が気に入ったらサポートをしてみませんか?