/// <summary> /// Update the AI player. /// </summary> /// <param name="board">The current game board.</param> public override void Update(Board board) { // safety-check the board parameter if (board == null) { throw new ArgumentNullException("board"); } // if it's not our turn, then we're done if (board.CurrentColor != BoardColor) { return; } // generate a new move. Move move; bool moveFound = false; // in order to begin the game with some variety, the AI will make random // acceptable moves until 25 moves have been made, then switch to minimax int totalPieces = board.GetColorCount(BoardColor) + board.GetOppositeColorCount(BoardColor); if (totalPieces <= randomMoveCutoff) { moveFound = GenerateMoveRandom(board, out move); } else { moveFound = GenerateMoveMiniMax(board, maximumDepth, out move); } // apply the move if (moveFound) { board.ApplyMove(BoardColor, move); } else { board.Pass(BoardColor); } }
/// <summary> /// Create an alternate version of the board where a certain move was made. /// </summary> /// <param name="boardColor">The color of the player making the move.</param> /// <param name="move">The move.</param> /// <returns>The board as of the new move.</returns> /// <remarks>Useful for previewing and AI algorithms.</remarks> public Board CheckMove(BoardColors boardColor, Move move) { // make sure it's a valid move if (!IsValidMove(boardColor, move)) { return(null); } // create a copy of the existing board Board board = new Board(boardSize); board.blackPieceCount = blackPieceCount; board.whitePieceCount = whitePieceCount; board.currentColor = currentColor; // array is of value type, so shallow is fine board.spaces = spaces.Clone() as BoardColors[, ]; board.ApplyMove(boardColor, move); return(board); }
public override void Update(Board board) { // safety check the parameter if (board == null) { throw new ArgumentNullException("board"); } // quit now if it's not my turn if (board.CurrentColor != BoardColor) { return; } // check if we have a valid move if (checkValidMove) { if (board.HasValidMove(BoardColor)) { checkValidMove = false; // already checked, waiting for selection } else { board.Pass(BoardColor); } } // if we don't have any input, don't bother if (inputState == null) { return; } // apply selection-movement input and generate a desired movement Point cursorMovement = new Point(0, 0); float degrees = (int)SimpleArcCamera.Rotation % 360 - 180; if (Math.Abs(degrees) < 45) { if (inputState.IsPieceSelectionUp(playerIndex)) { cursorMovement.Y--; } if (inputState.IsPieceSelectionDown(playerIndex)) { cursorMovement.Y++; } if (inputState.IsPieceSelectionLeft(playerIndex)) { cursorMovement.X--; } if (inputState.IsPieceSelectionRight(playerIndex)) { cursorMovement.X++; } } else if ((degrees >= 45) && (degrees < 135)) { if (inputState.IsPieceSelectionUp(playerIndex)) { cursorMovement.X++; } if (inputState.IsPieceSelectionDown(playerIndex)) { cursorMovement.X--; } if (inputState.IsPieceSelectionLeft(playerIndex)) { cursorMovement.Y--; } if (inputState.IsPieceSelectionRight(playerIndex)) { cursorMovement.Y++; } } else if (Math.Abs(degrees) >= 135) { if (inputState.IsPieceSelectionUp(playerIndex)) { cursorMovement.Y++; } if (inputState.IsPieceSelectionDown(playerIndex)) { cursorMovement.Y--; } if (inputState.IsPieceSelectionLeft(playerIndex)) { cursorMovement.X++; } if (inputState.IsPieceSelectionRight(playerIndex)) { cursorMovement.X--; } } else if ((degrees > -135) && (degrees <= -45)) { if (inputState.IsPieceSelectionUp(playerIndex)) { cursorMovement.X--; } if (inputState.IsPieceSelectionDown(playerIndex)) { cursorMovement.X++; } if (inputState.IsPieceSelectionLeft(playerIndex)) { cursorMovement.Y++; } if (inputState.IsPieceSelectionRight(playerIndex)) { cursorMovement.Y--; } } // check for valid move and apply if (board.IsValidSpace(cursorPosition.X + cursorMovement.X, cursorPosition.Y + cursorMovement.Y)) { cursorPosition.X += cursorMovement.X; cursorPosition.Y += cursorMovement.Y; } // apply play-piece input if (inputState.IsPlayPiece(playerIndex)) { Move move = new Move(cursorPosition.X, cursorPosition.Y); if (board.IsValidMove(BoardColor, move)) { board.ApplyMove(BoardColor, move); checkValidMove = true; } else { AudioManager.PlayCue("Drop_Illegal"); } } }
/// <summary> /// Create an alternate version of the board where a certain move was made. /// </summary> /// <param name="boardColor">The color of the player making the move.</param> /// <param name="move">The move.</param> /// <returns>The board as of the new move.</returns> /// <remarks>Useful for previewing and AI algorithms.</remarks> public Board CheckMove( BoardColors boardColor, Move move ) { // make sure it's a valid move if( !IsValidMove( boardColor, move ) ) { return null; } // create a copy of the existing board Board board = new Board( boardSize ); board.blackPieceCount = blackPieceCount; board.whitePieceCount = whitePieceCount; board.currentColor = currentColor; // array is of value type, so shallow is fine board.spaces = spaces.Clone() as BoardColors[ , ]; board.ApplyMove( boardColor, move ); return board; }
public override void Update( Board board ) { // safety check the parameter if( board == null ) { throw new ArgumentNullException( "board" ); } // quit now if it's not my turn if( board.CurrentColor != BoardColor ) { return; } // check if we have a valid move if( checkValidMove ) { if( board.HasValidMove( BoardColor ) ) { checkValidMove = false; // already checked, waiting for selection } else { board.Pass( BoardColor ); } } // if we don't have any input, don't bother if( inputState == null ) { return; } // apply selection-movement input and generate a desired movement Point cursorMovement = new Point( 0, 0 ); float degrees = (int)SimpleArcCamera.Rotation % 360 - 180; if( Math.Abs( degrees ) < 45 ) { if( inputState.IsPieceSelectionUp( playerIndex ) ) { cursorMovement.Y--; } if( inputState.IsPieceSelectionDown( playerIndex ) ) { cursorMovement.Y++; } if( inputState.IsPieceSelectionLeft( playerIndex ) ) { cursorMovement.X--; } if( inputState.IsPieceSelectionRight( playerIndex ) ) { cursorMovement.X++; } } else if( ( degrees >= 45 ) && ( degrees < 135 ) ) { if( inputState.IsPieceSelectionUp( playerIndex ) ) { cursorMovement.X++; } if( inputState.IsPieceSelectionDown( playerIndex ) ) { cursorMovement.X--; } if( inputState.IsPieceSelectionLeft( playerIndex ) ) { cursorMovement.Y--; } if( inputState.IsPieceSelectionRight( playerIndex ) ) { cursorMovement.Y++; } } else if( Math.Abs( degrees ) >= 135 ) { if( inputState.IsPieceSelectionUp( playerIndex ) ) { cursorMovement.Y++; } if( inputState.IsPieceSelectionDown( playerIndex ) ) { cursorMovement.Y--; } if( inputState.IsPieceSelectionLeft( playerIndex ) ) { cursorMovement.X++; } if( inputState.IsPieceSelectionRight( playerIndex ) ) { cursorMovement.X--; } } else if( ( degrees > -135 ) && ( degrees <= -45 ) ) { if( inputState.IsPieceSelectionUp( playerIndex ) ) { cursorMovement.X--; } if( inputState.IsPieceSelectionDown( playerIndex ) ) { cursorMovement.X++; } if( inputState.IsPieceSelectionLeft( playerIndex ) ) { cursorMovement.Y++; } if( inputState.IsPieceSelectionRight( playerIndex ) ) { cursorMovement.Y--; } } // check for valid move and apply if( board.IsValidSpace( cursorPosition.X + cursorMovement.X, cursorPosition.Y + cursorMovement.Y ) ) { cursorPosition.X += cursorMovement.X; cursorPosition.Y += cursorMovement.Y; } // apply play-piece input if( inputState.IsPlayPiece( playerIndex ) ) { Move move = new Move( cursorPosition.X, cursorPosition.Y ); if( board.IsValidMove( BoardColor, move ) ) { board.ApplyMove( BoardColor, move ); checkValidMove = true; } else { AudioManager.PlayCue( "Drop_Illegal" ); } } }