2016-11-10 6 views
0

私は単純なゲームのためにnegamaxを実装しようとしています。合計を21勝に上げるプレーヤー。 3.単純加算ゲームのためのNegamax

私はないんだけど、コンピュータを簡単に0モッズに合計合同になる数を追加することで勝つ必要がありますので、https://en.wikipedia.org/wiki/Negamax#Negamax_base_algorithm

人間のプレイヤーが最初に移動します。私はここに擬似コードを使用してい

ダイナミックムーブの生成を行います。ランダム合計に1を加えたネガマックススコアとネガマスクスコアを比較して、ラン合計に2を加算するだけです。

int total = 0; 

Console.WriteLine("the current total is " + total); 

while (total < 21) { 
    Console.WriteLine("add 1 or 2?"); 
    total += Convert.ToInt32(Console.ReadLine()); 
    Console.WriteLine("you increased the total to " + total); 
    if (total == 21) { 
     Console.WriteLine("you win"); 
     break; 
    } 

    if (negamax(total + 1, 1) > negamax(total + 2, 1)) total++; 
    else total += 2; 

    Console.WriteLine("computer increased the total to " + total); 
    if (total == 21) { 
     Console.WriteLine("computer wins"); 
     break; 
    } 
} 

negamax機能:

static int negamax(int total, int color) { 
    if (total == 21) { 
     return color * 100; 
    } 

    int bestValue = -100; 

    for (int i = 1; i <= 2; i++) { 
     if (total + i <= 21) { 
      int v = -1 * negamax(total + i, -1 * color); 
      bestValue = max(bestValue, v); 
     } 
    } 
    return bestValue; 
} 

マックス方法:AIはちょうど2たびに追加されている理由

static int max(int a, int b) { 
    if (a > b) return a; 
    return b; 
} 

わかりません。

+0

あなたの 'max'メソッドを表示できますか? – stuartd

+0

投稿に追加 –

答えて

1

静的評価機能が正しくありません。

https://en.wikipedia.org/wiki/Negamax#Negamax_base_algorithm negamaxノードの戻り値は、ノードの現在の選手の観点からヒューリスティックスコアあります。

if(合計== 21)、これはノードの現在のプレーヤーにとって常に損失です。したがって、ネガマックスの返品は-100でなければなりません。合計が22の場合など、他のコードエラーもあります。

+0

私は1つ以上の場所で視点が間違っていると考えました。ありがとう。私はそれを働かせた –

0

移動できないプレイヤーは明らかにゲームを失うでしょうか?それはルールを反転させているため もしそうなら、その後、

if (total == 21) { 
    return color * 100; 
} 

は、私には間違って見えます。あなたは動くことができないプレイヤーが勝つと言っています!これらの3つの行を修正してみてください。

+0

この部分は静的な評価関数です。合計が21になったときに勝敗が返されます。 –

+0

私はプレーヤーが動かすことができないポイントに達することはないと思います。ブレークは、21がヒットするとすぐに発生し、21がヒットするたびにnegamax関数は値を返します。 –

関連する問題