private void calculateColumns(XOSymbol xoSymbol, GamePadNode gamePadNode) { for (int column = 0; column < gamePadNode.GamePad.GetLength(0); column++) { List<XOSymbol> xoSymbolLine = new List<XOSymbol>(); for (int row = 0; row < gamePadNode.GamePad.GetLength(0); row++) { xoSymbolLine.Add((XOSymbol)gamePadNode.GamePad.GetValue(row, column)); } if (isWinningMove(xoSymbol, xoSymbolLine)) { gamePadNode.IsWinning = true; return; } if (hasPotential(xoSymbol, xoSymbolLine)) { switch (xoSymbol) { case XOSymbol.X: gamePadNode.XFunction++; break; case XOSymbol.O: gamePadNode.OFunction++; break; } } } }
/// <summary> /// /// <summary> /// Check if there is a winner based on Diagonal Line /// Sample Data : /// X /// X /// X /// </summary> /// </summary> private void checkDiagonals() { for (int diagonal = 0; diagonal < 2; diagonal++) { XOSymbol cellXOSymbol = (XOSymbol)gamePad.GetValue(diagonal, diagonal); //Get an element of the current Diagonal bool lineMatched = cellXOSymbol != XOSymbol.EMPTY; //Ensure that it is not empty cell for (int row = 0; row < gamePad.GetLength(0); row++) { int column = 0; switch (diagonal) { case 0: column = row; break; case 1: column = (gamePad.GetLength(0) - 1) - row; break; } lineMatched &= (cellXOSymbol == (XOSymbol)gamePad.GetValue(row, column)); if (!lineMatched) { break; } } if (lineMatched) { endGame(cellXOSymbol); } } }
public GameMove(int position, XOSymbol xoSymbol) { if (position > 8 || position < 0) throw new Exception("Invlaid position. Valid Positions from Right to Left, Top Down is : 0,1,2,3,4,5,6,7,8"); this.xoSymbol = xoSymbol; this.position = position; }
private void calculateColumns(XOSymbol xoSymbol, GamePadNode gamePadNode) { for (int column = 0; column < gamePadNode.GamePad.GetLength(0); column++) { List <XOSymbol> xoSymbolLine = new List <XOSymbol>(); for (int row = 0; row < gamePadNode.GamePad.GetLength(0); row++) { xoSymbolLine.Add((XOSymbol)gamePadNode.GamePad.GetValue(row, column)); } if (isWinningMove(xoSymbol, xoSymbolLine)) { gamePadNode.IsWinning = true; return; } if (hasPotential(xoSymbol, xoSymbolLine)) { switch (xoSymbol) { case XOSymbol.X: gamePadNode.XFunction++; break; case XOSymbol.O: gamePadNode.OFunction++; break; } } } }
private void oFunction(GamePadNode gamePadNode) { XOSymbol xoSymbol = XOSymbol.O; calculateRows(xoSymbol, gamePadNode); calculateColumns(xoSymbol, gamePadNode); calculateDiagonals(xoSymbol, gamePadNode); }
private int position; //Valid positions are : 0,1,2 ... 7,8 public GameMove(int position, XOSymbol xoSymbol) { if (position > 8 || position < 0) { throw new Exception("Invlaid position. Valid Positions from Right to Left, Top Down is : 0,1,2,3,4,5,6,7,8"); } this.xoSymbol = xoSymbol; this.position = position; }
public GameMove Think(XOSymbol[,] gamePad, XOSymbol playerSymbol) { this.playerSymbol = playerSymbol; List <GamePadNode> listGamePadNode = generateChilds(new GamePadNode(gamePad)); this.listGamePadNode = listGamePadNode; foreach (GamePadNode node in listGamePadNode) { calculateHeuristic(node); if (node.IsWinning) { return(node.GameMove); } } //Find Best Heuristic int bestIndex = 0; GamePadNode _node; int best = 0; switch (playerSymbol) { case XOSymbol.X: best = int.MinValue; break; case XOSymbol.O: best = int.MaxValue; break; } for (int counter = 0; counter < listGamePadNode.Count; counter++) { _node = listGamePadNode[counter]; switch (playerSymbol) { case XOSymbol.X: //Look for max value if (_node.Heurisitic > best) { best = _node.Heurisitic; bestIndex = counter; } break; case XOSymbol.O: //Look for min Value if (_node.Heurisitic < best) { best = _node.Heurisitic; bestIndex = counter; } break; } } return(listGamePadNode[bestIndex].GameMove); }
private bool isWinningMove(XOSymbol xoSymbol, List <XOSymbol> xoSymbolLine) { bool isMathced = true; foreach (XOSymbol xoSymbolCell in xoSymbolLine) { isMathced &= xoSymbolCell == xoSymbol; } return(isMathced); }
private bool hasPotential(XOSymbol xoSymbol, List <XOSymbol> xoSymbolLine) { bool isMatchedOrEmpty = true; foreach (XOSymbol xoSymbolCell in xoSymbolLine) { isMatchedOrEmpty &= (xoSymbolCell == xoSymbol || xoSymbolCell == XOSymbol.EMPTY); } return(isMatchedOrEmpty); }
public GameMove Think(XOSymbol[,] gamePad, XOSymbol playerSymbol) { this.playerSymbol = playerSymbol; List<GamePadNode> listGamePadNode = generateChilds(new GamePadNode(gamePad)); this.listGamePadNode = listGamePadNode; foreach (GamePadNode node in listGamePadNode) { calculateHeuristic(node); if (node.IsWinning) return node.GameMove; } //Find Best Heuristic int bestIndex = 0; GamePadNode _node; int best = 0; switch(playerSymbol) { case XOSymbol.X: best = int.MinValue; break; case XOSymbol.O: best = int.MaxValue; break; } for (int counter = 0; counter < listGamePadNode.Count; counter++ ) { _node = listGamePadNode[counter]; switch (playerSymbol) { case XOSymbol.X: //Look for max value if (_node.Heurisitic > best) { best = _node.Heurisitic; bestIndex = counter; } break; case XOSymbol.O: //Look for min Value if (_node.Heurisitic < best) { best = _node.Heurisitic; bestIndex = counter; } break; } } return listGamePadNode[bestIndex].GameMove; }
/// <summary> /// 1- Set the gameover flag /// 2- Find the winner /// </summary> /// <param name="winnerXOSymbol"></param> private void endGame(XOSymbol winnerXOSymbol) { isGameOver = true; if (humanPlayer.XOSymbol == winnerXOSymbol) { winnerPlayer = humanPlayer; return; } if (pcPlayer.XOSymbol == winnerXOSymbol) { winnerPlayer = pcPlayer; return; } }
private void showGamePad(XOSymbol[,] gamePad) { int position = 0; for (int row = 0; row < gamePad.GetLength(0); row++) { for (int column = 0; column < gamePad.GetLength(1); column++) { XOSymbol xoSymbol = (XOSymbol)gamePad.GetValue(row, column); if (xoSymbol != XOSymbol.EMPTY) { AddMove(new GameMove(position, xoSymbol)); } position++; } } }
/// <summary> /// Check if there is a winner based on Column Line /// Sample Data : /// X /// X /// X /// </summary> private void checkColumns() { for (int column = 0; column < gamePad.GetLength(0); column++) { XOSymbol cellXOSymbol = (XOSymbol)gamePad.GetValue(0, column); //Get first element of the current Column bool lineMatched = cellXOSymbol != XOSymbol.EMPTY; //Ensure that it is not empty cell for (int row = 0; row < gamePad.GetLength(1); row++) { lineMatched &= (cellXOSymbol == (XOSymbol)gamePad.GetValue(row, column)); if (!lineMatched) { break; } } if (lineMatched) { endGame(cellXOSymbol); } } }
private void calculateDiagonals(XOSymbol xoSymbol, GamePadNode gamePadNode) { for (int diagonal = 0; diagonal < 2; diagonal++) { List <XOSymbol> xoSymbolLine = new List <XOSymbol>(); for (int row = 0; row < gamePadNode.GamePad.GetLength(0); row++) { int column = 0; switch (diagonal) { case 0: column = row; break; case 1: column = (gamePadNode.GamePad.GetLength(0) - 1) - row; break; } xoSymbolLine.Add((XOSymbol)gamePadNode.GamePad.GetValue(row, column)); } if (isWinningMove(xoSymbol, xoSymbolLine)) { gamePadNode.IsWinning = true; return; } if (hasPotential(xoSymbol, xoSymbolLine)) { switch (xoSymbol) { case XOSymbol.X: gamePadNode.XFunction++; break; case XOSymbol.O: gamePadNode.OFunction++; break; } } } }
private void btnStart_Click(object sender, EventArgs e) { HumanPlayer humanPlayer = new HumanPlayer("Moutasem Al-awa", getSelectedSymbol()); XOSymbol xoSymbolPCPlayer = XOSymbol.EMPTY; switch (getSelectedSymbol()) { case XOSymbol.O: xoSymbolPCPlayer = XOSymbol.X; break; case XOSymbol.X: xoSymbolPCPlayer = XOSymbol.O; break; } PCPlayer pcPlayer = new PCPlayer(xoSymbolPCPlayer); Player firstPlayer = null; firstPlayer = pcPlayer; if (isHumanFirst()) { firstPlayer = humanPlayer; } GameEngine gameEngine = new GameEngine(humanPlayer, pcPlayer, firstPlayer); gamePadUC1.GameEngine = gameEngine; grbGameSettings.Enabled = false; gamePadUC1.Enabled = true; if (!isHumanFirst()) { pcPlayer.Play(); gamePadUC1.AddMove(pcPlayer.GameMove); } }
public PCPlayer(XOSymbol xoSymbol) : base("Computer", xoSymbol) { iplayerBrain = new MinimaxPlayerBrain(); }
private void showGamePad(XOSymbol[,] gamePad) { int position = 0; for (int row = 0; row < gamePad.GetLength(0); row++) { for (int column = 0; column < gamePad.GetLength(1); column++) { XOSymbol xoSymbol = (XOSymbol)gamePad.GetValue(row, column); if (xoSymbol != XOSymbol.EMPTY) AddMove(new GameMove(position, xoSymbol)); position++; } } }
public HumanPlayer(String name, XOSymbol xoSymbol) : base(name, xoSymbol) { }
public GamePadNode(XOSymbol[,] gamePad) { GamePad = gamePad; }
public XOSymbolUC(XOSymbol xoSymbol) : this() { XOSymbol = xoSymbol; }
private void calculateDiagonals(XOSymbol xoSymbol, GamePadNode gamePadNode) { for (int diagonal = 0; diagonal < 2; diagonal++) { List<XOSymbol> xoSymbolLine = new List<XOSymbol>(); for (int row = 0; row < gamePadNode.GamePad.GetLength(0); row++) { int column = 0; switch (diagonal) { case 0: column = row; break; case 1: column = (gamePadNode.GamePad.GetLength(0) - 1) - row; break; } xoSymbolLine.Add((XOSymbol)gamePadNode.GamePad.GetValue(row, column)); } if (isWinningMove(xoSymbol, xoSymbolLine)) { gamePadNode.IsWinning = true; return; } if (hasPotential(xoSymbol, xoSymbolLine)) { switch (xoSymbol) { case XOSymbol.X: gamePadNode.XFunction++; break; case XOSymbol.O: gamePadNode.OFunction++; break; } } } }
/// <summary> /// 1- Set the gameover flag /// 2- Find the winner /// </summary> /// <param name="winnerXOSymbol"></param> private void endGame( XOSymbol winnerXOSymbol) { isGameOver = true; if (humanPlayer.XOSymbol == winnerXOSymbol) { winnerPlayer = humanPlayer; return; } if (pcPlayer.XOSymbol == winnerXOSymbol) { winnerPlayer = pcPlayer; return; } }
private bool hasPotential(XOSymbol xoSymbol, List<XOSymbol> xoSymbolLine) { bool isMatchedOrEmpty = true; foreach (XOSymbol xoSymbolCell in xoSymbolLine) { isMatchedOrEmpty &= (xoSymbolCell == xoSymbol || xoSymbolCell == XOSymbol.EMPTY); } return isMatchedOrEmpty; }
private List<int> countEmptyCells(XOSymbol[,] gamePad) { List<int> listEmptyCellsIndex = new List<int>(); int index = 0; for (int row = 0; row < gamePad.GetLength(0); row++) { for (int column = 0; column < gamePad.GetLength(1); column++) { if ((XOSymbol)gamePad.GetValue(row, column) == XOSymbol.EMPTY) { listEmptyCellsIndex.Add(index); } index++; } } return listEmptyCellsIndex; }
private bool isWinningMove(XOSymbol xoSymbol, List<XOSymbol> xoSymbolLine) { bool isMathced = true; foreach (XOSymbol xoSymbolCell in xoSymbolLine) { isMathced &= xoSymbolCell == xoSymbol; } return isMathced; }
public Player(string name, XOSymbol xoSymbol) { this.name = name; this.xoSymbol = xoSymbol; }