private WinnerDetails EvaluateWinner(char currentPlayer, List <Coordinates> currentPlayerCoords) { var winnerDetails = new WinnerDetails() { GameWon = false, Message = "" }; // Horizontal winning condition bool horizontalConditions = currentPlayerCoords.Count(c => c.X == 0) >= 3 || currentPlayerCoords.Count(c => c.X == 1) >= 3 || currentPlayerCoords.Count(c => c.X == 2) >= 3; // Vertical winning condition bool verticalConditions = currentPlayerCoords.Count(c => c.Y == 0) >= 3 || currentPlayerCoords.Count(c => c.Y == 1) >= 3 || currentPlayerCoords.Count(c => c.Y == 2) >= 3; // Diagonal winning condition bool diagonalConditionsA = currentPlayerCoords.Contains(CoordinateFactory.New(0, 0)) && currentPlayerCoords.Contains(CoordinateFactory.New(1, 1)) && currentPlayerCoords.Contains(CoordinateFactory.New(2, 2)); bool diagonalConditionsB = currentPlayerCoords.Contains(CoordinateFactory.New(2, 0)) && currentPlayerCoords.Contains(CoordinateFactory.New(1, 1)) && currentPlayerCoords.Contains(CoordinateFactory.New(0, 2)); if (horizontalConditions) { winnerDetails.GameWon = true; winnerDetails.Message = $"{currentPlayer} won horizontally!"; } if (verticalConditions) { winnerDetails.GameWon = true; winnerDetails.Message = $"{currentPlayer} won vertically!"; } if (diagonalConditionsA || diagonalConditionsB) { winnerDetails.GameWon = true; winnerDetails.Message = $"{currentPlayer} won diagonally!"; } return(winnerDetails); }
private void Button_Click(object sender, RoutedEventArgs e) { Button button = (sender as Button); string[] colPlacing = button.Tag.ToString().Split(","); var x = Int32.Parse(colPlacing[0]); var y = Int32.Parse(colPlacing[1]); char currentPlayer = GetCurrentPlayer(); button.Content = currentPlayer; if (_xTurn) { currentPlayerCoords = _coordListX; } else { currentPlayerCoords = _coordListO; } currentPlayerCoords.Add(CoordinateFactory.New(x, y)); var winnerDetails = EvaluateWinner(currentPlayer, currentPlayerCoords); if (winnerDetails.GameWon) { uxTurn.Text = winnerDetails.Message; // game is won, so disable all buttons foreach (object c in LogicalTreeHelper.GetChildren(uxGrid)) { Button b = c as Button; if (b != null) { b.IsEnabled = false; } } } else { ToggleTurns(); // notify UI with the next player's turn uxTurn.Text = $"{GetCurrentPlayer()}'s turn"; button.IsEnabled = String.IsNullOrWhiteSpace(button.Content.ToString()); } }