3

プログラミングのスキルに少し自信がついたので、以前に始めたカード ゲームを再開することにしました。このプログラムの要点は、プログラムの流れ、変数、条件などをある程度理解できたので、OOP の理解を深めたいということです。

だから私はオブジェクト指向設計についてのアドバイスが必要です

私のカード ゲームには 5 つのクラスがあります。

  1. 主要
  2. カード
  3. Deck (カード ArrayList を持つ)
  4. Player (Deck オブジェクトから受け取った Card オブジェクトの Card ArrayList を持っています)
  5. ディーラー

Dealer クラスをインターフェイスにするのが適切な OOP であるかどうか疑問に思っています。すべてのプレイヤーがディーラーの役割を果たすことができるはずですが、言うまでもなく、カードのラウンドごとにディーラーは 1 人しかいません。Player クラスに、ディーラーが実行できるメソッド (dealGame() など) を実装しても問題ありませんか? 特定のラウンドで 8 つの Player オブジェクトのうち 7 つが実装されたメソッドを使用しない場合でも、その時点でディーラーとみなされるには?それとも、dealGame() メソッドを Deck クラスに所属させ、デッキを呼び出してゲームを処理する方がよいでしょうか? これが愚かな質問である場合は申し訳ありませんが、私はOOPの原則について少し大雑把であり、最初から正しく行うことを学ぶためのアドバイスが欲しい.

また、Dealer で Player を拡張することも考えましたが、変更不可能な方法で Dealer オブジェクトとして宣言するのではなく、プレーヤーがその場で Dealer の役割を引き受ける必要があるため、それは間違っていると思います。この場合、Dealer が Player を拡張する場合、ゲームのすべてのプレイヤーを Dealers として宣言する必要があると思います。

だから基本的に私は尋ねています:

  1. これらの 5 つのクラスを使用してカード ゲームを作成する場合、Dealer クラスをインターフェイスにし、残りを通常のクラスにしますか? また、その理由は何ですか?
  2. 私は一般的にOOPで正しい軌道に乗っていますか、それとも完全に迷っていますか?
4

3 に答える 3

4

あなたは良いアプローチをしていますが、まだやるべきことがあります:)。すべてのクラスは問題ありませんが、Delaer はそうではありません。

まず、プレーヤーが 1 ラウンド ディーラーであり、2 番目に他の誰かがディーラーである場合、拡張クラスまたはインターフェイスのポイントが表示されません。

実際、最初はプレイヤーをディーラーにするつもりはありません。

これに対処する最も簡単で最良の方法は、5.Game を作成することです。ゲームにはデッキとすべてのプレーヤーがあり、ディーラーと同様に機能します。プレイヤーの応答を待ったり、必要なときにカードを表示したりします。

本当にプレーヤーをディーラーにしたい場合は、もっと複雑になります:)。Game クラスも必要です。なぜなら、Game誰がディーラーとして開始するかを決定する必要があり、プレイヤーにディーラーの権利を奪ったり与えたりする必要があるからです (まあ、そのポイントはわかりませんが、必要に応じて... :) )。

そして、それを行う方法は?にGamePlayer dealer変数があります。メソッドのようなものが必要なregisterDealer(Player player)場合。Game次に、 と の間で通信するための何らかのインターフェイスが必要ですPlayerPlayerにすべての責任を持たせたい場合はGame、 を使用できますVisitor pattern。(これによりdealer、ゲーム インスタンス内に「忍び込み」、パブリック メソッドで実行できることは何でも実行できます)。

Gameそれ以外の場合は、 に何をすべきか尋ねさせ、dealerプレーヤーの入力を待つことができます。メソッド likedealer.askWhatToDo()を呼び出し、アクションの戻り値を使用して実行する必要があります。入力を検証できます...しかし、私が正しければ、ポーカーで有効な入力は常に1つだけなので、それGame自体が何をすべきかを決定する場合、違いはわかりません...

私が見る唯一の理由はdealer、カードをシャッフルしたり、ベースを上げたり、そのようなことができるかどうかです...または、ポーカープレーヤーとのポーカーゲームをシミュレートしたい場合、ディーラーは実際のように無効なことを行うことができます生活 :)。

于 2013-10-23T23:04:05.277 に答える
1

それは、プログラムがどのように機能するか、各クラスができることを期待すること、および各オブジェクトのライフサイクルがどのように機能するか (たとえば、プレーヤーが後のラウンドでディーラーになることができるか) に大きく依存します。

あなたが書いたものからの私の第一印象は、「プレーヤー」と「ディーラー」が継承する基本クラス「人」が必要だということですが、それは限られた情報からの推測に過ぎません。

于 2013-10-23T23:01:46.567 に答える
1

ディーラーは特別なタイプのプレイヤーではありません。特別な責任を持つのは、一度に 1 つの Player のインスタンスにすぎません。あなたは正しい方向に進んでいると思いますが、プレイしている特定のゲームのクラスを作成したい場合があります。

ポーカー ゲームを書いているとしましょう。その場合、ディーラーはプレイの順序に影響を与えることがあります (スタイルによって異なります)。しかし、War をプレイしている場合、ディーラーはカードを配るだけの人物であり、気にする必要はありません。その場合、「ディーラーは誰か」と「ディーラーがゲームをどのように扱うべきか」という概念は、プレーヤーではなく、ゲーム自体の責任です。

于 2013-10-23T23:03:44.757 に答える