私の現在のプロジェクトは、人気のあるカード ゲームのMaoを、コンピューターが「グランド マスター」となる LAN ゲーム (マルチプレイヤー)に移植することです。ルール、デッキ、プレイヤーなどを追跡します。ただし、マオには公式のルールセットはありません。代わりに、プレーヤーがルールを構成します。したがって、私のルール クラスには非常に基本的なプロパティが設定されているため、RuleHandler クラス (そのインスタンスは別のスレッドで実行されます) を使用して、いくつかのプロパティのみからコードを生成できます。
- トリガー(カード(山に置かれたとき)またはテキスト/アクションのいずれか)
- オプションの条件 (つまり、完全なデッキがない場合...)
- ゲーム内の任意の変数に対する 6 つの (ほとんどの) 基本アクション:
- 変数を削除します (カードの削除やプレイヤーの削除など)
'del({variable})'
- 変数に値を設定します (たとえば、プレーヤーの順序 (int) を負の値に設定します (順序が逆になります))。
'{variable} = {value}'
- 2 つの変数を「置換」します (a,b = b,a; 2 人のプレーヤーの手札またはデッキとパイルを切り替えるなど)
'{variable1}, {variable2} = {variable2}, {variable1}'
(本当にただの派手なSet
アクション)
- 新しいオブジェクト (新しいカードなど) を作成する「New」
'{list}.append({class}({parametres}))'
(パラメーターを使用してクラスの新しいオブジェクトを作成し、適切なリストに追加します (パイルまたはデッキへのカード、RuleHandler への新しいルールなど))
- 別のルールのコードを呼び出すだけの呼び出し
'self.rules.get({rule})rule'
(rules は、キーがすべての情報を含むルール オブジェクトであり、値がcompile
-ing 後に生成されたコードであるディクショナリです)
- プレイヤーに何かを言わせるSay
- 単純なワンライナーではなく、クラスの境界を超えています (プレイヤーの接続とチャットを参照)
- 変数を削除します (カードの削除やプレイヤーの削除など)
最後の 1 つは最も複雑で、私が問題を抱えているものです。例として、毛沢東の一般的なルールは、誰かがスーツの「7」を付けた場合、「良い一日をお過ごしください」と言わなければならないというものです. 次のプレーヤーが '7' を置いた場合、'Have a very nice day.' と言わなければなりません。"very's" は、誰かが '7' を入れなくなるまで続けます。ここで、'Thank you very much' と言う必要があります。ここで、'very's' の数は、最後の 'Have a very nice' の「very's」の数です。 day' + 1 し、罰としてその枚数のカードを引きます。複雑なルールですが、そのほとんどは、一時変数と最後に配置されたカードのログを使用して簡単に実現できます。しかし、プレーヤーが正しいフレーズを言うことを確認するコードは、私をつまずかせているものです. 残りのアクションはバックグラウンドで実行され、ユーザー入力は必要ありません。ユーザー入力の待機はサーバー コードの仕事の一部であり、RuleHandler クラスの一部であってはなりません。
Say
アクションが単純で、オブジェクト指向プログラミングの単一責任特性を超えないようにするにはどうすればよいですか?