2016-06-29 9 views
2

これはTic-Tac-Toeゲームの一部です。 checkmateメソッドは、別の機能(ここでは示されていません)によって使用される文字列を返して、チック - タック - トウを移動します。ここ予期せぬ結果をもたらす条件付きのforeach-if-statment

ボードで、プレイヤは、一番上の行に並んだ二つの部品を有する:

public static char[] board = { '+', '+', 'E', 
           'A', 'S', 'D', 
           'Z', 'X', 'C' }; 

そしてここでは、次の動きを決定するコードは次のとおり

private static string checkmate() 
{  
    List<char[]> dalist = new List<char[]> 
    { 
     new char[3] { board[3], board[4], board[5] }, 
     new char[3] { board[0], board[4], board[8] }, 
     new char[3] { board[2], board[4], board[6] }, 
     new char[3] { board[1], board[4], board[7] }, 

     new char[3] { board[0], board[1], board[2] }, 
     new char[3] { board[6], board[7], board[8] }, 
     new char[3] { board[0], board[3], board[6] }, 
     new char[3] { board[2], board[5], board[8] } 
    }; 

    foreach (var item in dalist) 
    { 
     if (item.Where(x => x == '+').Count() == 2) 
      return new string(item.Where(x => x != '+').ToArray()); 

     else if (item.Where(x => x == '-').Count() == 2) 
      return new string(item.Where(x => x != '-').ToArray()); 

     else if (item.Where(x => x == '+').Count() == 1) 
      return item.Where(x => x != '+').First().ToString(); 

     else 
     { 
      Random random = new Random(); 
      int rList = random.Next(0, 3); 
      int rPosition = random.Next(0, 2); 
      return dalist.ElementAt(rList).GetValue(rPosition).ToString(); 
     } 
    } 
    return "AA"; 
} 

方法A返しますボード上の移動に対応する文字列としての単一の文字。

方法は、チックタックつま先8つの可能入賞パターンのリストを作成し、そしてように順に加工される基板

論理四つの成分に既にあるものに対してそれらを試験することにより、ボードを解析しますforeachループ内のifelse条件式。 現在のメソッドでは、最初のif文でループのブレークアウトと 'E'が返されます。代わりに、プログラムはループ全体を通り、その最後のelse文を返します。 最初のif-conditionの一致を特定できないのはなぜですか?

ループは一致するまでリスト項目のそれぞれをループします。この動きは、相手がチェックメイト動きを有するかどうかを確認し、パスをブロックするチェックメイト動きがない場合) 利用できるものがある場合に当選移動が返され

1)checkmate

3 )link two勝つため又はウィニングパスにリンクする第二片を配置します、これを遮断するためにチェックメイトがない場合

4)プレース初期ランダムに最初の2ラウンド

0のための四隅または中間のいずれかの

答えて

1

可能なすべてのワイニング動作について個別のテストを実行する必要があります。最初の勝利の移動のすべてのテストではなく、2回目の勝利の移動のすべてのテストなどではありません。したがって、各テストの周りにforループをラップし、ループのどれもが一致しない場合はランダムブロックを実行します。

+0

はい、コンピュータから離れて卵を持って、同じ結論に来ました。 – Aarondv1

0

私はあなたを正しく理解していれば、最初のif文が真でなければならないと考えるので、関数は返されます。最初のitem{'+' ,'+', 'E'}だと思います。

これは間違っています。最初のitemdalistを作成したときに最初の文字配列が{ board[3], board[4], board[5] }であるため、{'A', 'S', 'D'}です。

EDIT!

すべての実行パスにreturn文があるので、for-eachループの最初の繰り返しで関数が保証されることがわかりました。したがって、それは{'+' ,'+', 'E'}で決して行に到達しません。

+0

これも私の最初の考えでしたが、最初の条件は決して満たされていないと思います.Dalistの5番目の要素でさえも満たされません。 –

+0

@MongZhuああ、あなたが言っていることを見ています。私はOPがここで何をすることを意味するのか分かりません。foreachの最初のループでは、最後のelseが実行され、関数が戻ります。それで、他のダリストアイテムには決して行きません。どちらの方法でも、ループ内のすべての実行パスは、最初の反復中に関数から戻されます。 – Eli

+0

Eli、Imは、各リスト項目を最初のif-conditinalと照合して調べるので、リスト内の8つの配列すべてがチェックされるまで2番目のelse-if文に移動しません。それは.. – Aarondv1

関連する問題