Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        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");
                }
            }
        }
Ejemplo n.º 4
0
		/// <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;
		}
Ejemplo n.º 5
0
		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" );
				}
			}
		}