2016-12-19 5 views
0

iam connect4ゲーム用のmin maxアルゴリズムを書こうとしましたが、このコードを実行するとループが起こり、移動や結果が返ってこないので、何が問題なのかを知りたいときには、 7個の細胞は私はconnect4ゲームのために私のminmaxアルゴリズムが間違っていることを知りたいですか?

private int score() 
{ 
    int x = check_Winner();//i checked it and it work right ot return 1 if player 1 win or 2 if pc win or 0 in tie 
    if (x == 1) return 10; 
    else if (x == 2) return -10; 
    else return 0; 
} 

public int MinMax(int player_num) 
{ 
    List<pair> possiple_moves = get_possible_moves();// it works will 
    int score_so_far = score(); 
    if (possiple_moves.Count == 0 || score_so_far != 0) 
     return score_so_far; 

    List<int> scores = new List<int>(); 
    List<pair> moves = new List<pair>(); 

    foreach (pair move in possiple_moves) 
    { 
     if (player_num == 1) 
     { 
      cells[move.x, move.y].player_num = 1; 
      scores.Add(MinMax(2)); 
     } 
     else 
     { 
      cells[move.x, move.y].player_num = 2; 
      scores.Add(MinMax(1)); 
     } 
     moves.Add(move); 

     cells[move.x, move.y].player_num = 0; 
    } 

    if (player_num == 1) 
    { 
     int max_score_indx = 0, tmp = int.MinValue; 
     for (int i = 0; i < scores.Count; i++) 
     { 
      if (scores[i] > tmp) 
      { 
       tmp = scores[i]; 
       max_score_indx = i; 
      } 
     } 
     pc_choise = moves[max_score_indx]; 
     return scores[max_score_indx]; 
    } 
    //================== 
    else 
    { 
     int min_score_indx = 0, tmp = int.MaxValue; 
     for (int i = 0; i < scores.Count; i++) 
     { 
      if (scores[i] < tmp) 
      { 
       tmp = scores[i]; 
       min_score_indx = i; 
      } 
     } 
     pc_choise = moves[min_score_indx]; 
     return scores[min_score_indx]; 
    } 
} 
+0

あなたは再帰的に内部から 'MinMax'を呼び出しますそれだけで永遠に続く。 – Equalsk

+0

なぜ、永遠に、停止条件がありますか –

+0

デバッガを使用して 'MinMax'メソッドを実行し、停止条件が決して打撃されない理由を見つけたら、修正できます。 – Equalsk

答えて

0

@Equalskが正しいと、私は信じている:あなたが停止条件を評価するコードに到達する前に、あなたは、foreachループ内からのMinMaxを呼び出しています。だから、get_possible_movesメソッドがNullとは違うものを返すならば、foreach - > MinMax - > foreach - > MinMax - > foreachに陥るでしょう...

+0

いいえ、コードを何度もデバッグします。移動は、サイズがゼロまたはそれは可能なすべての動きを含む,,,私はループのボディと私は最後の動きをした後に可能な動きを計算する関数のファーラインでmin maxを呼び出します –

関連する問題