/// <summary> /// Makes the move and draws a shape, depending which player made the move /// </summary> /// <param name="X"></param> /// <param name="Y"></param> /// <param name="value"></param> public void MakeMove(int X, int Y, Tile.TileValue value) { // if the game hasnt been won yet... if (Winner == null) { // who is in turn if (PlayerTurn == 0) { drawing.DrawCross(Gameboard.getboard()[X, Y].Panel); } else { drawing.DrawCircle(Gameboard.getboard()[X, Y].Panel); } // set the state of board SetBoardState(X, Y, value); // switch players SwitchPlayerTurn(); if (AutomaticWinLose) { PredictMove(); } } }
/// <summary> /// Set the tile value at [X, Y] to given value /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="value"></param> public void SetBoardState(int x, int y, Tile.TileValue value) { // check if empty, add value if empty if (Board[x, y].Value == Tile.TileValue.NaN) { Board[x, y].Value = value; } }
/// <summary> /// Smart function that returns true /// <para> if a winning move is present on the current layout </para> /// <para> if a losing move is present on the current layout </para> /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="value"></param> /// <returns></returns> private bool CheckWinningMove(int x, int y, Tile.TileValue value) { // same code as in the setboardstate function, apart from removed saves bool Winner = false; int n = 3; Tile[,] board = Gameboard.getboard(); if (board[x, y].Value == Tile.TileValue.NaN) { board[x, y].Value = value; } for (int i = 0; i < n; i++) { if (board[x, i].Value != value) { break; } if (i == n - 1) { Winner = true; } } for (int i = 0; i < n; i++) { if (board[i, y].Value != value) { break; } if (i == n - 1) { Winner = true; } } if (x == y) { for (int i = 0; i < n; i++) { if (board[i, i].Value != value) { break; } if (i == n - 1) { Winner = true; } } } if (x + y == n - 1) { for (int i = 0; i < n; i++) { if (board[i, (n - 1) - i].Value != value) { break; } if (i == n - 1) { Winner = true; } } } //IMPORTANT!!!! revert changes //Because when dealing with a 2D array, the copy is only a "shallow" copy, so whenever you modify the contents of copy //it also modifies the contents of original array board[x, y].Value = Tile.TileValue.NaN; return(Winner); }
/// <summary> /// Set the tile value at [X, Y] to given value /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="value"></param> public void SetBoardState(int x, int y, Tile.TileValue value) { bool Winner = false; int n = Gameboard.getboard().GetLength(0); moveCount++; Gameboard.SetBoardState(x, y, value); //Game Win-conditions -> //check column for (int i = 0; i < n; i++) { if (Gameboard.getboard()[x, i].Value != value) { break; } // if hasn't triggered break so far, means all horizontal tiles have been of same value so far... if (i == n - 1) { // -> Means we have a WINNER ! Winner = true; // Add all current panels to a list List <System.Windows.Forms.Panel> WinningPanels = new List <System.Windows.Forms.Panel>(); for (int p = 0; p < n; p++) { WinningPanels.Add(Gameboard.getboard()[x, p].Panel); } // send the list as array and draw a line showing what line won drawing.DrawHorizontalLine(WinningPanels.ToArray()); } } //check row for (int i = 0; i < n; i++) { if (Gameboard.getboard()[i, y].Value != value) { break; } if (i == n - 1) { Winner = true; List <System.Windows.Forms.Panel> WinningPanels = new List <System.Windows.Forms.Panel>(); for (int p = 0; p < n; p++) { WinningPanels.Add(Gameboard.getboard()[p, y].Panel); } drawing.DrawVerticalLine(WinningPanels.ToArray()); } } //check diagonal if (x == y) { for (int i = 0; i < n; i++) { if (Gameboard.getboard()[i, i].Value != value) { break; } if (i == n - 1) { Winner = true; List <System.Windows.Forms.Panel> WinningPanels = new List <System.Windows.Forms.Panel>(); for (int p = 0; p < n; p++) { WinningPanels.Add(Gameboard.getboard()[p, p].Panel); } drawing.DrawDiagonalLine(WinningPanels.ToArray()); } } } // check antidiagonal (the other way than regular diagonal) if (x + y == n - 1) { for (int i = 0; i < n; i++) { // Thanks to a helper in stackoverflow for the -> [i, (n - 1) - i] if (Gameboard.getboard()[i, (n - 1) - i].Value != value) { break; } if (i == n - 1) { Winner = true; List <System.Windows.Forms.Panel> WinningPanels = new List <System.Windows.Forms.Panel>(); for (int p = 0; p < n; p++) { WinningPanels.Add(Gameboard.getboard()[p, (n - 1) - p].Panel); } drawing.DrawAntiDiagonalLine(WinningPanels.ToArray()); } } } //check draw, if movecount is same as for eg. 3^2 = 9, and winner is not true if (moveCount == (Math.Pow(n, 2)) && Winner != true) { this.Winner = "Draw"; Over = true; } // check if winner is true if (Winner == true) { Over = true; // set the winner as the winning tile value this.Winner = Players.FirstOrDefault(X => X.PlayerTile == value).PlayerTile.ToString(); // add 5 experience for the winner, remove 5 from loser Players.FirstOrDefault(X => X.PlayerTile == value).AddExperiencePoints(5); Players.FirstOrDefault(X => X.PlayerTile != value).AddExperiencePoints(-5); SaveGame(Players.FirstOrDefault(X => X.PlayerTile == value).Name, Players.FirstOrDefault(X => X.PlayerTile != value).Name); } }