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) ||
// ...
Sehr mathy, Ich mag es! – Kredns
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
In einen anderen Antwortbeitrag extrahiert. – chakrit