カードゲームをどのようにデザインしますか?


10

私のカードゲームには良いアーキテクチャが思いつきません。ゲームの通常の設計方法を理解するのに助けが必要です。

まず、ゲームのルールについて説明します。

ゲームのルール

セットアップ
  • 4人のプレーヤーがいて、各2人がチームを形成します。
  • 各プレイヤーは12枚のシャッフルカードを取得します
  • テーブル(川)に4枚の盲目カードがあります
  • プレイヤーの注文はこんな感じ

ここに画像の説明を入力してください

賭け
  • 各プレーヤーは、100から160までの現在の賭けより大きい数をパスまたは選択できます
  • 賭けは最初のプレーヤーから始まり、チームが合格するまでサークルします
  • プレイヤーがパスすると、もうベットすることはできません
  • ベッティングラウンドに勝ったチームは、ゲームに勝つために、少なくとも自分のベットに等しいポイントを集める必要があります。
  • ベッティングラウンドに敗れたチームは、チームが目標を達成することを許可してはなりません。

  • ベッティングラウンドに勝ったチームがすべてのポイントを取得した場合、他のチームは自分のベットに等しいマイナスのポイントを取得します

  • ベッティングラウンドに敗れたチームがすべてのポイントを集めた場合、他のチームはダブルのマイナスポイントを獲得します

ゲームの流れとポイントの収集

  • ベッティングラウンドに勝ったプレーヤー(キング)は、テーブルに残っているカードを4枚受け取ります。
  • その後、4枚のカードのセットを、プレイすることなくチームカードバンクに保存できます。
  • 王は定規スーツとしてスーツを選び、他の人にそれを知らせます
  • キングは手札のカードをテーブルに置くことからゲームを開始します。他の各プレーヤーはこの順序でプレイする必要があります
    • 手札に同じカードのスーツがある場合、それらのカードの1つをプレイする必要があります。
    • 彼らが持っていない場合、彼らは他のスーツをプレイすることができます
  • 他のすべてのプレーヤーがハンドをプレーした後、ラウンドの勝者は次のようになります。
    • すべてのカードが同じ場合に最も高いカードを持っている人
    • 「ルーラー」カードがある場合、最も高いカード
  • ラウンドの勝者はカードを集めて銀行に置きます
  • 前のラウンドに勝ったプレーヤーは次のラウンドを開始します
  • これはみんなの手が空になるまで続きます

カウントポイント

  • 各ラウンドでの勝利は5ポイントです。これは、4枚のカードごとに少なくとも5点あることを意味します。
  • バンクにエースが10、5いると、それぞれ5ポイントが加算されます

私のデザイン

クラス

class Card {
   string suit;
   string rank
}
class Deck {
  List cards = [];
  List suits = ['S', 'H', 'D', 'C'];
  List ranks = ['1', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
  private void init(){..}
  void shuffle(){...}
}

class Game{
  Deck deck = new Deck();
  Player player1;
  Player player2;
  Player player3;
  Player player4;
  int _isOn = 0;

  Game(this.player1, this.player2, this.player3, this.player4){
    deck.makeCards();
    deck.shuffle();
    start();
  }

  void start(){
    player1.cards.addAll( deck.cards.getRange(0, 12) );
    player2.cards.addAll( deck.cards.getRange(12, 24) );
    player3.cards.addAll( deck.cards.getRange(24, 36) );
    player4.cards.addAll( deck.cards.getRange(36, 48) );
    deck.cards.removeRange(0, 48);
  }

  String toJson(){
  }

  String toString(){
  }
}
class Player{
  String name;
  int points;
  List cards = [];

  Player(this.name, {this.points});

  String toJson(){}

  String toString(){}
}

私の問題

これらすべてのクラスを定義したので、この定義をデータベース(Mongoなど)にバインドしてゲームフローを制御する方法がわかりません。

  • そのすべてのロジックはどこに行くべきですか?
  • サーバー/クライアントシナリオでどのように状態を保持する必要がありますか?

注意:

私はDartを使用してこれをプログラミングしていますが、回答をDartで作成する必要はありません。


誰かがあなたのコードを見て、それを出発点として使用している場合、ランクでAまたは1を選択する必要がありますが、両方は含めないでください。
ベン・

回答:


10

あなたはここで古典的な間違いを犯しています。誰かがカードゲーム用のウェブアプリケーションを作るようにあなたに言いました、そしてあなたはそれを一度にすべて作る方法を決定しようとしています。研究により、一度に心の中ですぐに利用できる情報は7つしか保持できないことがわかっているため、このアプローチは最高のプログラマーをも混乱させます。もっと上手にジャグリングしようとすると、集中力が必要になり、それを維持することは期待できません。

むしろ、誰かがあなたのカードゲームをプレイするためにあなたのライブラリーを呼び出すつもりであるように、カードゲームライブラリーを書くことにもっと集中するようにしてください。あなたのモデルは素晴らしいスタートを切ったようです。これは良いことですが、Game発信者がmake moveなどを使用できるインターフェイスを作成する必要があります。

したがって、ゲームには次のような新しいメソッドがいくつかあると思います。

getPlayers()        // Get all player info
getCurrentPlayer()  // Get information about the active player in his turn (hand, money to bet with, etc.)
fold()              // Current player folds and current player changes
bet(float amount)   // Current player bets and current player changes

つまり、ゲームを実行するために知っておくべきことはすべて、オブジェクトを使用して行うことができますGameこれが完了したら、ステップ2に進みます。

着信要求を受け取り、それらを適用しGame、出力をユーザーに返すことのみを目的とする別のクラスを作成します。Game出力をJSON に変換する場合はGame、それがGame

この情報を永続化するために、MongoDBへのインターフェースを提供する別のクラスを作成できます。このクラスは、の存在を知らないだろうGameし、どちらでしょうGame、このクラスの存在を知りません。

つまり、個々のコンポーネントに焦点を当てれば、大丈夫です。プログラムを作成する際に考慮しなければならない側面が多すぎると、うまくいかなくなります。賢明な教授が私にかつて言ったように、「あなたがプロジェクトのために書いた最初のプログラムが最後までに完全に書き直されるという事実を知り、受け入れてください。


余談ですが、その数は人によって3から9の範囲です-私がどれだけ警戒しているかに応じて4または5を行うことができます。通常のテストは、一連のドットを見て、それらを精神的にグループ化せずに個別に認識できる数を把握することです。6で、たとえば、自動的に3 + 3にグループ化し始め、簡単に再び分離することはできません。 。
イズカタ2013

@Izkata面白いですね。これについてのテストがあることに気づきませんでした。リンクはありますか?
ニール

1
en.wikipedia.org/wiki/…がソースだと思います。
AakashM 2013

1

そのすべてのロジックはどこに行くべきですか?

あなたのGameクラスにそれを置くことから始めます。

これは、限られた数の状態を持つルールベースのゲームです。ステートマシンとしてモデル化します。状態パターンは非常に役立ちます。

最終的には、そのFSMを個別のクラスに抽出する必要がありますが、今のところは気にする必要はありません。

サーバー/クライアントシナリオでどのように状態を保持する必要がありますか?

これは、セットアップについての知識がなければ答えることはできません。ゲームオブジェクトと状態をデータベースにシリアル化すると、毎回うまくいく場合があります。


以下は、state / FSMに関する付随する部分です。この場合は、ゲームに焦点を当てた本からです。gameprogrammingpatterns.com
shmup
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.