0

シンプルなブラックジャックゲームのスコアを計算しようとしています。カードの状況に応じて、エース カードを 1 または 11 としてカウントするタイミングをコンピューターが選択できるようにしたいのですが、この状況をハードコーディングしたくありません。

どうすればいいですか?

これは、ディーラー/プレイヤー ハンド クラスでスコアをカウントする方法です。

public int calcScore()
{
    int score = 0;
    Link current = first;

    while(current != null)
    {
        score = score + current.card.getValue();
        current = current.next;
    }

    return score;
}

これは、Card クラスでカードの値を指定する方法です。

public int getValue()
{
    int value = 0;

    if (rank == 1)
        value = 11;
    else if (rank == 11 || rank == 12 || rank == 13)
        value = 10;
    else
        value = rank;

    return value;
}
4

5 に答える 5

3

問題は、計算で現在の合計が何であるかを知る必要があるため、次のようにコーディングすることです。

public int getValue(int currentTotal) {
    int value = 0;

    if (rank == 1 && currentTotal < 11)
        value = 11;
    else if (rank == 1)
        value = 1;
    else if (rank == 11 || rank == 12 || rank == 13)
        value = 10;
    else
        value = rank;

    return value;
}

私はそれを徹底的に考えたわけではありませんが、バストする唯一の方法は 21 をヒットした場合であるため、複数のエースをチェックする必要はないと確信しています。それがうまくいかない場合は、カウントされたエースの数の累積合計を渡し、より複雑なロジックを使用する必要があります。

于 2012-11-22T19:16:41.947 に答える
2

カードの値を決定するためのすべてのロジックをカード オブジェクトに入れることはできないと思います。なぜなら、すべてのカードの値をカウントするまでは、ace=11 がハンドをバストにするかどうかわからないからです。その場合、エースは魔法のように 1 に変わります。

カードがgetMinValue()と を持つようにデザインを変更しgetMaxValue()ます。getValue()カードがエースの場合、getMinValue は 1 を返し、getMaxValue は 11 を返すことを除いて、どちらもまったく同じように機能します。

ここで、最初に getMaxValue を使用してスコアを計算するように calcScore を再設計します。ハンドがバストになった場合は、getMaxValue と getMinValue のより複雑な計算を行います。

このように、カード クラスはブラックジャックをカプセル化する必要はありませんがbusiness logic、ゲーム レベルでルールを処理できる十分な情報を提供します。

于 2012-11-22T19:25:55.843 に答える
1

すでに答えがあることは知っていますが、質問は一般的な方法であり、すべてがJavaにあります。これが答えの疑似コードロジックです。

エースが 1 に等しいスコアを計算する

  1. 可変スコアを設定する
  2. 手を通す
  3. カードの値に等しい変数を設定します
  4. number が 10 より大きい場合は 10 に設定
  5. 合計スコアに新しい数字を追加する

エースをチェック

  1. isThereAnAce の変数を false に設定します
  2. デッキをループして、isThereAnAce が true に設定されているカードが少なくとも 1 つある場合は、エースのカードがあるかどうかを確認します。

ロジックを実行する

  1. isThereAnAce が true で、現在のスコアが 12 未満の場合、スコアに 10 を追加します
于 2013-08-23T17:34:07.183 に答える
0

あなたができることの1つは、カードオブジェクトまたはそれを呼び出しているもので、現在の合計に応じて値を返すことです。したがって、カードから取得値に合計を入力するだけで、エースを持っている場合は、1 または 11 を与えるかどうかを決定できます。

もう 1 つの方法で、おそらく最も簡単な方法は、get value 関数で合計を確認することです。

public int getValue(int currentVal)
{
    int value = 0;

    if (rank == 1 && currentVal < 11)
        value = 11;
    else if(rank == 1)
        value = 1;
    else if (rank == 11 || rank == 12 || rank == 13)
        value = 10;
    else
        value = rank;

    return value;
}

どちらも機能しますが、どのようにしたいかによって異なります。

于 2012-11-22T19:47:43.920 に答える
0

fgbが提案したように、皆さんが私にくれたヒントと、SOに関する別の投稿からのいくつかのヒントを念頭に置いていたので、これを思いつきました。

必要なときにカードを 1 回カウントするのではなく、Hand クラスの挿入メソッド内にあるカードをカウントします。

これにより、カードを数えて、エースとして 1 を使用するか 11 を使用するかを決定できます。

public void insert(Card card)
{
    Link newLink = new Link(card);
    newLink.next = first;

    if (card.rank == 1 && cardTotal + card.getValue() > 21)
        cardTotal = cardTotal + (card.getValue() - 10);
    else
        cardTotal = cardTotal + card.getValue();

    first = newLink;
}

問題は、プレイヤーが 1 または 11 をいつ使用するかを決定する必要があるかどうかですが、それについては後で心配します。

手伝ってくれてありがとう。

于 2012-11-22T21:05:02.440 に答える