※生き抜きに設計してみるだけで、実際に完成させるかは分かりません。
必要な要素
必須
- 普通の麻雀
- 誘発発動の能力
やりたい
- ルールのカスタマイズ(青天井やローカル役など)
- リプレイ
気が向いたら
- 宇宙麻雀ルール
- 任意発動の能力
- ネット対戦
やるかも?
- 外部ファイルからのキャラ・能力の追加
設計
全般
- 本当色々な能力あるから、ほとんどpublicなプロパティでデータを持つかな・・。
専用用語
公開
その情報が公開されていること。
例えば公開発動の効果は、全プレイヤーがその発動を知ることができる。
非公開
その情報が自分にだけ公開されていること。
例えば非公開発動の効果は、発動した本人のみがその発動を知ることができる。
完全非公開
その情報が誰にも公開されていないこと。自分にも分からない。
例えば完全非公開発動の効果は、誰も発動を知ることができない。
牌の予約
ツモ牌を予約すること。
だって未来予知って相手の鳴きとかも含めての未来を知るはずなのに、相手次第でずれたら困るからね。
能力
例えばジョインジョイントキィなら
能力:一巡先を見る者 変数Xを持つ。 ①配牌時に公開発動する。 変数Xをランダムに決定する。振り分けは1:4/7、2:2/7、3:1/7である。 この効果の発動は無効化されない。 ②自分のツモ後に公開発動する。 X巡先まで牌をランダムに非公開予約する。 ③自分のツモ後に聴牌しているプレイヤーがいる場合、そのプレイヤーを対象に非公開発動する。 自分の手牌に対象プレイヤーの当たり牌があれば対象プレイヤーの手牌を全て知る。
- 何これ怖い。
- 任意発動が出来るなら、半荘で合計10にするように自分で振り分けられるようにするかね?
- 連続した3局で合計4以下って感じの制限の方がいいかも。
あと変な効果といえばテルーあたりは
能力:照魔鏡 ①他プレイヤーが効果を公開発動したとき、1/3の確率でその効果を対象に公開発動する。 対象効果の発動を無効にする。 ②他プレイヤーが効果を非公開発動したとき、1/3の確率でその効果を対象に完全非公開発動する。 対象効果の発動を無効にする。
能力:王者の麻雀 変数Xを持ち、初期値は0である。 ①自分の和了時に公開発動する。 ドラを除いた基本点を計算し、Xより大きければXの値をその基本点にする。 ただし、X以下であればXを0にする。 ②他プレイヤーの和了時に公開発動する。 Xを0にする。 この効果の発動は無効化されない。 ③Xが0以外である場合、配牌時に公開発動する。 基本点がXより大きい和了形の二向聴以下の配牌を得る。
- リザベーションは止められなさそうだから完全非公開発動の効果には作用しないかな。
- 複数テルーの場合の処理はどうしよう。
- 青天井とかローカル役とか対応できるかな?
能力メモ
- 「1/2で発動。○○する。」と「発動。1/2で○○する。」は違う。前者だと他プレイヤーに発動の成否がバレるし、発動がトリガーになってるものの処理も変わる。
詳細設計メモ
乱数
乱数が消費される場所
- 山(ツモ時)
- 能力
能力毎に乱数持ってたら初期化大変すぎ。リプレイしんどい。
シングルトンで山用と能力用で2つRandomを管理すりゃあいいかな。
(山用と分けるのは麻雀打ちとしての妙なこだわり)
役や能力のハードコーディング
- ローカル役や変な能力で色んな物を参照するかもしれないので、外部スクリプトから読み込むように設計するのは難しいかなあ・・・。
- 色々実装して必要な情報がまとまったらまた考えよう。
開発記録
そもそも麻雀の作り方
せっかくだからちょっと書いてみよう → あれ、そもそも麻雀の点数計算ってどう記述すべきなんだろう?
全通り面子分解して役判定していって最高点数取るしかないのかな?
まあ全通りやっても高が知れてるしそれでいいか。
向聴数計算
CPUの思考ルーチンで欲しい。
あと初心者モード作るときにも欲しい。
真面目に計算すると結構コストかかるから、あらかじめ計算してテーブル作っておいた方がいいな。