0
     public void CheckWin()
  {
     if (spillebræt[0, 0] == 'X' && spillebræt[1, 0] == 'X' && spillebræt[2, 0] == 'X')
     {
        Console.WriteLine("Player 1 wins!\nPress ENTER to end game");
        Console.ReadLine();
        Environment.Exit(0);
     }
  } 

Spillebræt = ゲーム盤。Tic Tac Toe の単純なコンソール ベースのゲームの勝者を決定する方法を作成しようとしています。ゲーム ボードの場合、最初は '+' 記号で埋められた 2 次元の char 配列があります。プレイヤー クラスは、2 人のプレイヤー ターンの間でシフトし、毎回勝者が見つかったかどうかを確認します。8 つの可能な解決策があるため、勝者を決定するために多くの if ステートメントを使用できると思いますが、より少ない行スペースを使用する方法を探しています。上記のコードは、私の最初のアプローチを示しています (if ステートメントを使用して考えられるすべてのソリューションをチェックします)。

4

2 に答える 2

0

さまざまなケースをすべて記述することはいつでもできますが、面倒であり、拡張できません (ボードを拡張したい場合はどうすればよいでしょうか?)。

したがって、演習として、より複雑な実装をお勧めします。

Line開始点と終了点を持つクラスを作成します。また、次の行に移動演算子を に実装してLine、回転させます。次に、簡単なルールに従って始点と終点を移動することで、すべての線を循環させることができます。

次に、ボードに線を適用できる演算子をボードに作成し、線のパス上のすべてのボード ケースが同じ符号である場合に true を返します。

このようにして、次のようなものを使用して、ボードの位置が勝っているかどうかを簡単に確認できます。

for (Line l = new Line() ; l.Valid() ; l.MoveToNextLine())
{
    if (board.WinningLine(l))
        return true;
}
return false;

もちろん、その後、 などに置き換えるなど、必要に応じてカスタマイズできますMoveToNextLineoperator ++またend、ループから飛び出して何度も続行しないように、行に状態を設定する必要があります。

決定したMoveToNextLine順序に従って、開始点と終了点を移動するだけです。

これで、ボード上でゲームを拡張したい場合は、n x n非常に簡単であることがわかります。更新するだけMoveToNextLineです。

于 2013-02-25T19:50:22.740 に答える
0

すべての勝者のケースを含むマトリックスを作成し、現在の状態が勝者の状態であるかどうかを確認できます。

        // Example
        var matrix = new[,] { { "O", "+", "+" }, { "O", "+", "+" }, { "O", "+", "+" } };

        var wins = new List<string> {
             "100100100", // 1st column vertical
             "010010010", // 2nd column vertical
             "001001001", // 3rd column vertical
             "111000000", // 1st row horizontal
             "000111000", // 2nd row horizontal
             "000000111", // 3rd row horizontal
             "100010001", // top-left bottom-right diagonal
             "001010100"  // top-right bottom-left diagonal
            };

        // Crosses (X)
        var check = new List<string> {"0", "0", "0", "0", "0", "0", "0", "0", "0"};
        for (var i = 0; i < 3; i++)
            for (var j = 0; j < 3; j++)
                if (matrix[i, j] == "X") check[i*3 + j] = "1";
        if (wins.Contains(string.Join("", check))) { /* crosses win */ }

        // Circles (O)
        check = new List<string> { "0", "0", "0", "0", "0", "0", "0", "0", "0" };
        for (var i = 0; i < 3; i++)
            for (var j = 0; j < 3; j++)
                if (matrix[i, j] == "O") check[i * 3 + j] = "1";
        if (wins.Contains(string.Join("", check))) { /* circles win */ }
于 2013-02-25T19:28:04.317 に答える