15

私の子供には、Javaでブラックジャックを書くための宿題がありました。私は彼を少し助けましたが、ほとんどの場合、彼はそれをすべて自分で行い、実際にはかなりうまく機能しています。彼は、それが手の値を計算する方法で私が見なかったエラーさえ見つけました。ただし、彼が対処していない問題があり、私が考えることができるすべてのソリューションは非常に複雑であり、彼がまだ初歩的なJavaスキルで簡単にコーディングできるものをはるかに超えています。

エース。実際、エースは1つだけでなく、4つあり、4つすべてを片手で手に入れることができます。1つまたは複数のエースがあり、それぞれが1つまたは11の価値がある場合、カードの手札の価値をどのようにエレガントに計算しますか。優雅なアルゴリズムがあるはずなのに、見えません。もちろん、それの一部は私が疲れているということかもしれません、しかし多分あなたは助けることができます。

4

7 に答える 7

26

各エースを11として扱います。次に、値が21を超えている間に、手札の各エースの合計から10を引きます。

于 2009-05-08T02:15:43.863 に答える
9

11ポイントでエースを1つだけ使用します。したがって、最後のエースを除くすべてを1として計算し、ポイントが10以下の場合、最後のエースは10としてカウントされます。

于 2009-05-08T02:38:09.813 に答える
5

1エースだけが11としてカウントされます。

したがって、各エースを11として扱う別の方法は、すべてのエースを1として扱うことです。次に、合計値に10を加算し(手持ちのエースに関係なく運ばれます)、それを別の「高」変数(値+ 10)に保持します。 。また、(任意の)エースが出現した場合は〜ace:trueのブール値を作成します。

そして、ディーラーに対してスコアをチェックするとき。プレイヤーの手に(任意の)エースがあるかどうかを確認します。その場合は「高い」値を使用できます。そうでない場合は(エースなし)「低い」値を使用します。

そうすれば、キング+ 9 +エース(おそらく悪い例)は〜low:20&high:30&ace:trueになります-その情報を使用して、30-10が「ゲームに勝つ」かどうかを確認できます。したがって、King + 5 + 5(low:20 high:30 ace:false)は、高い値の30を使用しません。

私はこの方法を使用しているので、いつaltを表示するかがわかります。画面上のエーススコア。3/13(Ace + 2)のように、私がすでに持っているのと同じace:true|falseブール値を使用します。これは確かに最初に与えられたものと同じ答えですが、これは私にはもっと理にかなっています:)

于 2010-09-16T22:13:25.977 に答える
3

すべてのエースを合計値11としてカウントする必要がある場合でも、合計が21を超えたら、手札から10を引きますが、10を引いた回数と、その数を必ずカウントする必要があります。 11(エース)を足す回数、

11を足す>=10を引く-常に満たす必要があります

alorithmの例:

int sum=0;
int ace=0;
int subtract=0;
while(!busted or !stay)
{
  Hitme(value);
  if(value=11)ace++;
  sum+=value;
  if(sum>21) 
  {
      if(ace>=1)
      {
         if(ace>=subtract)
         {
           sum-=10
           subtract++;
         }
         else
         {
            busted;
         }
      }
      else
      {
          busted;
      }
  }
  else
  {
    hit or stay;
    //of course if sum== 21 then force stay

  }
}
于 2009-05-08T02:22:19.867 に答える
2

elundmarkの答えに似ています...

ブラックジャックのハンドバリューを評価するメソッドを持っている可能性があります。常にエースを一点で評価します。手札にエースが含まれている場合は、ハード値(すべてのエースは1、+ 10)とソフト値(すべてのエースは1)を計算します。

ハード値がバストでない場合は、ハード値を返します。ハード値がバストの場合は、ソフト値を返します。


12、A、
ハード値2 + 1 + 1 + 10=14
ソフト値=2+ 1 + 1 = 4

ハード値<21なので、ハード値を返します(手の値は14)

例22
、A、A、8
ハード値= 2 + 1 + 1 + 8 + 10 = 22(バスト)
ソフト値= 2 + 1 + 1 + 8 = 12

ハード値>21なので、ソフト値を返します(手の値は12)

ルールとゲームのプレイ方法に関する従来の考え方では、エースの値は条件付きであり、1または11の2つの値を持つことができます。この概念を実装するのは困難です。プログラマーにとって、すべてのエースを1の値として数え、条件付きでハンドの値に10ポイントを追加する方がはるかに簡単です。そうすれば、カードのランクまたは値の実装を厳格かつ簡単に保つことができます。私は以前、値のコレクションと他のいくつかのメソッドを返すことによってこれを試しました。それは苦痛であり、1つのエースランクだけでは価値がありません。

2/12のように画面にaltを表示したい場合は、整数を返す代わりに、整数を含む「BlackjackValue」オブジェクトと、手の値を評価するメソッドで作成したStringオブジェクトを返します。

于 2012-10-17T20:16:58.463 に答える
0
short aces_count = 0;
short non_aces_sum = 0;
short global_sum = 0;

foreach card in _card:{
    if( card.value != 11 ){ // assuming ace value is 11
        if( card.value > 10 ) 
            non_aces_sum += 10;
        else
            non_aces_sum += card.value
    }else
        aces_count += 1;
}

short aces_sum = 0;
if( aces_count > 0) aces_sum = 11;

for(int i=0 ; i < aces_count - 1; i++){ // - 1 cuz already asigned first ace
    aces_sum += 1; // 2x aces == 22 so max 1 ace has value 11
}
if(aces_sum + non_aces_sum > 21)
    aces_sum = aces_count; // no need for an 11 value ace, so all are 1

global_sum = non_aces_sum + aces_sum;
于 2017-06-26T13:20:13.557 に答える
-1

問題は、それが決定されていないことです。(ルールを理解しているように)エースを1または11として数えることができます。しかし、バストするため、毎回11として数えるわけではありません。

私が考える唯一の解決策は、合計が21未満であるエースの可能な値ごとにスコアを計算することです。

于 2009-05-08T02:12:25.943 に答える