PHPでCUIすごろくをつくるの巻

今年の上半期は「すごろく」のソーシャルゲームを作っていました。
特に意味はないけれど、PHPを忘れないための復習と今年の成果のひとつとしてすごろくを作ってみた。
ただし、あまり時間もないのでCUI && データベースは使わない簡易版で。

すごろくの要素を考える

すごろくにはどういった人物やオブジェクトが出てくるかを考える。
今回考えるのはシンプルに1人プレイ用だ。
・プレイヤー
・盤面
・マス
・サイコロ

すごろくの処理を考える

すごろくはすごくシンプルなゲームで、以下の感じの流れで進んでいく。
1. サイコロをふる。
2. 出た目の数だけ盤面の駒を進める。
3. 止まったマスのイベントをこなす。
ゴールするまで1〜3を繰り返す
4. ゴールする。

今回作るすごろく

・1人プレイ用。
・マスは「チェックマス(スタートとゴール)」「普通のマス(特になにも起きない)」「ラッキーマス(1マス進む)」「バッドマス(はじめに戻る)」の4種類とする。
・インタラクティブにして、それっぽいメッセージを出す。

じゃあ実際に作ってみる

今回は以下のように分けてみた。
・Sugorokuクラス 駒の現在の位置を記録して、「サイコロをふる」インターフェースを提供する。
・Boardクラス 盤面にマスがどのように配置されているかを管理する。
・Massクラス マス情報の管理とマスに止まったときのイベントを処理する。

ソーシャルゲームですごろくを作ったときもこんな構成で作っていたけど、駒の現在位置の情報はユーザーに紐づけてデータベースで管理していた。
盤面の情報やマスの情報もデータベースに入れて管理していたが、不変的な性質のデータなのでわざわざデータベースに入れておく必要なかったなを思っている。

おまけ

データベースで現在の位置を管理する場合を考える。

Usersテーブル

カラム名 その他
id int primary key, auto increment

UserPositionsテーブル

カラム名 その他
id int primary key, auto increment
user_id int
position int

UPDATE戦略

現在位置のデータをUPDATEするやりかた。
UserPositionsテーブルのuser_idにUnique制約をつけておきます。

INSERT戦略

現在位置のデータをどんどんINSERTするやりかた。
今回はUnique制約は必要ないです。

実際この2つを思いついてINSERTを採用した。
特に不自由は感じなかったし、「UserPositionsをある条件で集計してランキングにする」みたいなことをしていたので、別途ログテーブルが必要なくて楽ではあった。
こういうのはどっちが良いとか断言できるほど経験していないので、ソーシャルゲームみたいな大規模なサービスに携わる機会をつくりたいとは思っている。

Pocket

Posted in PHP.

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">