If you save your buttons in a multidimensional array, you can write some extension methods to get rows, columns, and diagonals.
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 } }
And if you use a TableLayoutPanel with three rows and three columns, you can easily program your buttons and store them in the Button[3, 3] array Button[3, 3] .
Button[,] gameButtons = new Button[3, 3]; for (int row = 0; column <= 3; row++) for (int column = 0; column <= 3; column++) { Button button = new Button();
And check the winner:
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) || // ...
source share