public NextMove GetNextMoveForAutomatedPlayer(GetNextMove getNextMove) { List <NextMove> results = FindMove.FindAvailableMoves(getNextMove.Board, getNextMove.Player); List <NextMove> takeMoves = results.Where(m => m.Takes != null).ToList(); Random random = new Random(); if (takeMoves.Count > 0) { return(takeMoves[random.Next(0, takeMoves.Count)]); } else if (results.Count > 0) { return(results[random.Next(0, results.Count)]); } else { return(new NextMove { CurrentHeight = -1, CurrentWidth = -1, NextHeight = -1, NextWidth = -1, }); } }
private List <AvailableBoard> GetAvailableBoards(int[,] board, int player) { List <AvailableBoard> results = new List <AvailableBoard>(); //Get all possible moves for a board, this is used it 2 ways //1. This method will use the information to create a board for every possible move //2. This list of possible moves is used by the evaluation method to not redo work is massively improve efficiency List <NextMove> moves = FindMove.FindAvailableMoves(board); foreach (NextMove move in moves.Where(m => m.Piece == player)) { //Copy board int[,] moveBoard = (int[, ])board.Clone(); //Remove taken pieces form the board if (move.Takes != null) { foreach (Take take in move.Takes) { moveBoard[take.Height, take.Width] = 5; } } //Add kings if (player == 1 && move.NextHeight == 0) { moveBoard[move.CurrentHeight, move.CurrentWidth] = 5; moveBoard[move.NextHeight, move.NextWidth] = 3; } else if (player == 2 && move.NextHeight == 7) { moveBoard[move.CurrentHeight, move.CurrentWidth] = 5; moveBoard[move.NextHeight, move.NextWidth] = 4; } else { int tempValue = moveBoard[move.CurrentHeight, move.CurrentWidth]; moveBoard[move.CurrentHeight, move.CurrentWidth] = 5; moveBoard[move.NextHeight, move.NextWidth] = tempValue; } results.Add(new AvailableBoard { Board = moveBoard, CurrentHeight = move.CurrentHeight, CurrentWidth = move.CurrentWidth, NextHeight = move.NextHeight, NextWidth = move.NextWidth, Takes = move.Takes, moves = moves }); } return(results); }
public List <PotentialNextMove> GetAvailableBoards(Int64[,] board, Int64 player) { List <PotentialNextMove> results = new List <PotentialNextMove>(); List <NextMove> moves = FindMove.FindAvailableMoves(board, player); foreach (NextMove move in moves) { //Copy board Int64[,] moveBoard = (Int64[, ])board.Clone(); //Remove taken pieces form the board if (move.Takes.Count > 0) { foreach (Piece take in move.Takes) { moveBoard[take.Height, take.Width] = 5; } } //Add kings if (player == 1 && move.NextHeight == 0) { moveBoard[move.CurrentHeight, move.CurrentWidth] = 5; moveBoard[move.NextHeight, move.NextWidth] = 3; } else if (player == 2 && move.NextHeight == 7) { moveBoard[move.CurrentHeight, move.CurrentWidth] = 5; moveBoard[move.NextHeight, move.NextWidth] = 4; } else { Int64 tempValue = moveBoard[move.CurrentHeight, move.CurrentWidth]; moveBoard[move.CurrentHeight, move.CurrentWidth] = 5; moveBoard[move.NextHeight, move.NextWidth] = tempValue; } results.Add(new PotentialNextMove { Board = moveBoard, CurrentHeight = move.CurrentHeight, CurrentWidth = move.CurrentWidth, NextHeight = move.NextHeight, NextWidth = move.NextWidth, Takes = move.Takes }); } return(results); }
private List <AvailableBoard> GetAvailableBoards(int[,] board, int player) { List <AvailableBoard> results = new List <AvailableBoard>(); List <NextMove> moves = FindMove.FindAvailableMoves(board, player); foreach (NextMove move in moves) { //Copy board int[,] moveBoard = (int[, ])board.Clone(); //Remove taken pieces form the board if (move.Takes != null) { foreach (Take take in move.Takes) { moveBoard[take.Height, take.Width] = 5; } } //Add kings if (player == 1 && move.NextHeight == 0) { moveBoard[move.CurrentHeight, move.CurrentWidth] = 5; moveBoard[move.NextHeight, move.NextWidth] = 3; } else if (player == 2 && move.NextHeight == 7) { moveBoard[move.CurrentHeight, move.CurrentWidth] = 5; moveBoard[move.NextHeight, move.NextWidth] = 4; } else { int tempValue = moveBoard[move.CurrentHeight, move.CurrentWidth]; moveBoard[move.CurrentHeight, move.CurrentWidth] = 5; moveBoard[move.NextHeight, move.NextWidth] = tempValue; } results.Add(new AvailableBoard { Board = moveBoard, CurrentHeight = move.CurrentHeight, CurrentWidth = move.CurrentWidth, NextHeight = move.NextHeight, NextWidth = move.NextWidth, Takes = move.Takes }); } return(results); }
public List <Piece> GetPotentialMoves(GetPlayerTips getPlayerTips) { List <Piece> potentialMoves = FindMove.FindAvailableMoves(getPlayerTips.Board, getPlayerTips.TipFor) .Select(m => { return(new Piece { Height = m.NextHeight, Width = m.NextWidth }); }) .ToList(); return(potentialMoves.Distinct(new PieceComparer()).ToList()); }
public void FindMoveFindAvailableMoves_BasicTest() { //Associate int[,] board = new int[, ] { { 0, 2, 0, 2, 0, 2, 0, 2 }, { 2, 0, 2, 0, 2, 0, 2, 0 }, { 0, 2, 0, 2, 0, 2, 0, 2 }, { 5, 0, 5, 0, 5, 0, 5, 0 }, { 0, 5, 0, 5, 0, 5, 0, 5 }, { 1, 0, 1, 0, 1, 0, 1, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1 }, { 1, 0, 1, 0, 1, 0, 1, 0 }, }; int player = 1; //Act List <NextMove> results = FindMove.FindAvailableMoves(board, player); //Assert Assert.AreEqual(7, results.Count); }
public NextMove GetNextMoveForAutomatedPlayer(GetNextMove getNextMove) { List <NextMove> results = FindMove.FindAvailableMoves(getNextMove.Board, getNextMove.Player); List <NextMove> takeMoves = results.Where(m => m.Takes.Count > 0).ToList(); Random random = new Random(); if (takeMoves.Count > 0) { return(takeMoves[random.Next(0, takeMoves.Count)]); } else if (results.Count > 0) { return(results[random.Next(0, results.Count)]); } else { throw new Exception($"Board contains no moves for player {getNextMove.Player}"); } }
public void FindAvailableMovesTests_KingsAdvanced() { //Associate Int64[,] board = new Int64[, ] { { 0, 2, 0, 2, 0, 2, 0, 2 }, { 2, 0, 2, 0, 2, 0, 2, 0 }, { 0, 2, 0, 5, 0, 2, 0, 2 }, { 5, 0, 5, 0, 5, 0, 5, 0 }, { 0, 4, 0, 2, 0, 5, 0, 5 }, { 5, 0, 5, 0, 5, 0, 5, 0 }, { 0, 5, 0, 2, 0, 5, 0, 5 }, { 5, 0, 3, 0, 5, 0, 5, 0 }, }; Int64 player = 1; //Act List <NextMove> moves = FindMove.FindAvailableMoves(board, player); //Assert Assert.AreEqual(4, moves.Count); }
public void FindAvailableMovesTests_Takes() { //Associate Int64[,] board = new Int64[, ] { { 0, 2, 0, 2, 0, 2, 0, 2 }, { 2, 0, 2, 0, 2, 0, 2, 0 }, { 0, 2, 0, 5, 0, 2, 0, 2 }, { 5, 0, 5, 0, 5, 0, 5, 0 }, { 0, 5, 0, 2, 0, 5, 0, 5 }, { 1, 0, 1, 0, 1, 0, 1, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1 }, { 1, 0, 1, 0, 1, 0, 1, 0 }, }; Int64 player = 1; //Act List <NextMove> moves = FindMove.FindAvailableMoves(board, player); //Assert Assert.AreEqual(2, moves.Count(m => m.Takes.Count > 0)); }
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { if (m_playerTurn) { var element = Mouse.DirectlyOver; if (element != null) { // Si un pion est déjà selectionné if (m_selectedToken != null && m_playerPossibleMove.ContainsKey(m_selectedToken)) { // On recupere la cellule selctionner et on recupere le mouvement associe Vector2 selectedCell = new Vector2(Grid.GetColumn((UIElement)element), Grid.GetRow((UIElement)element)); FindMove move = new FindMove(selectedCell); TokenMove tokenMove = m_selectedTokenPossibleMove.Find(move.Match); // Si la cellule correspond a un deplacement l'effectuer if (tokenMove != null) { // Move the token and reset the colors of the board ChangeColorOfCells(m_selectedTokenPossibleMove, Colors.Khaki); if (m_selectedToken != null) { m_board.ExecuteTokenMove(m_selectedToken, tokenMove); DisplayBoard(); //Calcul les captures possible restante if (m_sequenceEngaged.Count > 0) { List <TokenMoveSequence> toRemove = new List <TokenMoveSequence>(); foreach (TokenMoveSequence sequence in m_sequenceEngaged) { TokenMove movePlayed = sequence.PlayMove(); if (sequence.Empty() || !movePlayed.Equals(tokenMove)) { toRemove.Add(sequence); } } foreach (TokenMoveSequence sequence in toRemove) { m_sequenceEngaged.Remove(sequence); } } else { foreach (TokenMoveSequence sequence in m_playerPossibleMove[m_selectedToken]) { TokenMove movePlayed = sequence.PlayMove(); if (!sequence.Empty() && movePlayed.Equals(tokenMove)) { m_sequenceEngaged.Add(sequence); } } } // Fini le tour du joueur ou affiche les prochains mouvement possible if (m_sequenceEngaged.Count == 0) { if (m_selectedToken.Position.Y == 0) { m_board.Crown(m_selectedToken); } DisplayBoard(); m_playerTurn = false; m_selectedToken = null; m_selectedTokenPossibleMove = null; m_sequenceEngaged = null; } else { m_selectedTokenPossibleMove = ComputeCells(m_sequenceEngaged); ChangeColorOfCells(m_selectedTokenPossibleMove, Colors.CadetBlue); } } } // Sinon on deselectionne le pion else if (m_sequenceEngaged.Count == 0) { if (m_selectedTokenPossibleMove == null) { return; } // Reset selected token ChangeColorOfCells(m_selectedTokenPossibleMove, Colors.Khaki); m_selectedToken = null; } } else { // Si on a pas deja commence une sequence de mouvement if (m_sequenceEngaged != null && m_sequenceEngaged.Count == 0) { // Select the token and mark the possible destinations with a color m_selectedToken = m_board.Tokens[Grid.GetRow((UIElement)element), Grid.GetColumn((UIElement)element)]; if (m_selectedToken != null && m_playerPossibleMove.ContainsKey(m_selectedToken)) { m_selectedTokenPossibleMove = ComputeCells(m_playerPossibleMove[m_selectedToken]); ChangeColorOfCells(m_selectedTokenPossibleMove, Colors.CadetBlue); } } else { if (m_board.Tokens[Grid.GetRow((UIElement)element), Grid.GetColumn((UIElement)element)] == m_selectedToken) { ChangeColorOfCells(m_selectedTokenPossibleMove, Colors.CadetBlue); } } } } } }