2009-04-11 14 views
4

Was wäre der beste Weg, um (in einem 2-Spieler-Spiel) Tic Tac Toe zu sehen, der gewonnen hat? Im Moment bin ich mit etwas Ähnliches wie die folgenden:Suchen nach Gewinner in TicTacToe?

if (btnOne.Text == "X" && btnTwo.Text == "X" && btnThree.Text == "X") 
{ 
    MessageBox.Show("X has won!", "X won!"); 
    return; 
} 
else 
// I'm not going to write the rest but it's really just a bunch 
// if statements. 

So wie ich loswerden der mehrere, wenn die?

Antwort

11

Etwas alongs:

rowSum == 3 || columnSum == 3 || diagnolSum == 3 

..?

+0

Sehr mathy, Ich mag es! – Kredns

+0

Schönes Update, ich denke, dass ich mit dieser Methode gehen kann, aber ich werde die Frage unbeantwortet lassen, um zu sehen, ob jemand anderes etwas besser finden kann (wir müssen ihnen eine Chance geben, richtig?). – Kredns

+0

In einen anderen Antwortbeitrag extrahiert. – chakrit

2

Eine weitere einfache Möglichkeit wäre aus sein, die gewinnbar Positionen als Daten in einem Array zu speichern und eine Schleife verwenden, um alle möglichen Gewinnbedingungen statt mehrere ifs Aussagen

// winnable positions 
var winnables = new[] { 
    "012", 
    "345", 
    "678", 
    "036", 
    "147", 
    "258", 
    "048", 
    "246" 
}; 

// extracted from btnOne Two Three.... 
var gameState = new[] { "X", "O", "X", "whatever" }; 


string winner = null; 

// check each winnable positions 
foreach (var position in winnables) { 

    var pos1 = int.Parse(position[0].ToString()); 
    var pos2 = int.Parse(position[1].ToString()); 
    var pos3 = int.Parse(position[2].ToString()); 

    if (gameState[pos1] == gameState[pos2] && 
     gameState[pos2] == gameState[pos3]) 
     winner = gameState[pos1]; 

} 

// do we have a winner? 
if (!string.IsNullOrEmpty(winner)) 
    /* we've got a winner */ 

Grundsätzlich zu überprüfen, nicht btnOne verwenden btnTwo btnThree, verwenden Sie ein richtiges Array von Buttons oder ein Array, das den Spielstatus in einem besser zugänglichen Format speichert und einfacher zu berechnen ist.

+0

Der int.Parse ist zwar ein wenig hässlich ... aber er hilft, die gewinnbare Position einfach zu lesen. – chakrit

3

Wenn Sie Ihre Schaltflächen in einem multidimensionalen Array speichern, können Sie einige Erweiterungsmethoden schreiben, um die Zeilen, Spalten und Diagonalen zu erhalten.

public static class MultiDimensionalArrayExtensions 
{ 
    public static IEnumerable<T> Row<T>(this T[,] array, int row) 
    { 
    var columnLower = array.GetLowerBound(1); 
    var columnUpper = array.GetUpperBound(1); 

    for (int i = columnLower; i <= columnUpper; i++) 
    { 
     yield return array[row, i]; 
    } 
    } 

    public static IEnumerable<T> Column<T>(this T[,] array, int column) 
    { 
    var rowLower = array.GetLowerBound(0); 
    var rowUpper = array.GetUpperBound(0); 

    for (int i = rowLower; i <= rowUpper; i++) 
    { 
     yield return array[i, column]; 
    } 
    } 

    public static IEnumerable<T> Diagonal<T>(this T[,] array, 
              DiagonalDirection direction) 
    { 
    var rowLower = array.GetLowerBound(0); 
    var rowUpper = array.GetUpperBound(0); 
    var columnLower = array.GetLowerBound(1); 
    var columnUpper = array.GetUpperBound(1); 

    for (int row = rowLower, column = columnLower; 
     row <= rowUpper && column <= columnUpper; 
     row++, column++) 
    { 
     int realColumn = column; 
     if (direction == DiagonalDirection.DownLeft) 
     realColumn = columnUpper - columnLower - column; 

     yield return array[row, realColumn]; 
    } 
    } 

    public enum DiagonalDirection 
    { 
    DownRight, 
    DownLeft 
    } 
} 

Und wenn Sie eine TableLayoutPanel mit 3 Reihen und 3 Spalten verwenden, können Sie einfach Ihre Tasten programmierbar erstellen und speichern sie in eine Button[3, 3] Array.

Button[,] gameButtons = new Button[3, 3]; 

for (int row = 0; column <= 3; row++) 
    for (int column = 0; column <= 3; column++) 
    { 
    Button button = new Button(); 
    // button... 
    gameLayoutPanel.Items.Add(button); 
    gameButtons[row, column] = button; 
    } 

Und für einen Gewinner zu überprüfen:

string player = "X"; 
Func<Button, bool> playerWin = b => b.Value == player; 
gameButtons.Row(0).All(playerWin) || 
// ... 
gameButtons.Column(0).All(playerWin) || 
// ... 
gameButtons.Diagonal(DiagonalDirection.DownRight).All(playerWin) || 
// ...