Ejemplo n.º 1
0
 public AI(Rectangle boardRec, Piece[,] allPieces, ReversiPiece myColor)
     : base(boardRec, allPieces, myColor)
 {
     myType = PlayerTypes.AI;
     Name   = "电脑";
     Initialize();
 }
Ejemplo n.º 2
0
 /// <summary>
 /// 执行悔棋操作 (悔棋到自己的上一步棋子)
 /// </summary>
 /// <param name="toOwnPiece">如果为 true, 则悔棋到自己的上一步棋子; 如果为 false, 则悔棋一步.</param>
 public void RegretPieceMove(bool toOwnPiece)
 {
     if (toOwnPiece)
     {
         ReversiPiece ownPiece = CurrentPiece;
         try
         {
             while (true)
             {
                 PopState();
                 if (ownPiece == CurrentPiece)
                 {
                     break;
                 }
             }
             ResetBuffer();
         }
         catch
         {
             ResetBuffer();
             RegretPiece_Finished(true);
         }
         RegretPiece_Finished = null;
     }
     else
     {
         RegretPieceMove();
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 初始化一个黑白棋棋盘, 大小为 8*8. 中间 4 个初始棋子为白黑白黑.
        /// </summary>
        private ReversiGame()
        {
            CurrentBoard = new ReversiPiece[BoardSize, BoardSize];
            for (int i = 0; i < BoardSize; i++)
            {
                for (int j = 0; j < BoardSize; j++)
                {
                    CurrentBoard[i, j] = ReversiPiece.Empty;
                }
            }
            CurrentBoard[BoardSize / 2 - 1, BoardSize / 2 - 1] = ReversiPiece.White;
            CurrentBoard[BoardSize / 2, BoardSize / 2 - 1]     = ReversiPiece.Black;
            CurrentBoard[BoardSize / 2 - 1, BoardSize / 2]     = ReversiPiece.Black;
            CurrentBoard[BoardSize / 2, BoardSize / 2]         = ReversiPiece.White;
            // TODO: 删除用于调试的初始棋局

            /*CurrentBoard[0, 0] = ReversiPiece.Black;
            *  CurrentBoard[0, 1] = ReversiPiece.Black;
            *  CurrentBoard[1, 0] = ReversiPiece.White;
            *  CurrentBoard[1, 1] = ReversiPiece.White;*/
            CurrentGame     = this;
            CurrentPiece    = ReversiPiece.Black;
            LastPiece       = ReversiPiece.White;
            LastPosition    = new ReversiPiecePosition(4, 4);
            TotalSteps      = 0;
            reversiBuffer   = new ReversiBuffer();
            IsBusy          = false;
            isRegretEnabled = false;
            MaxRegretSteps  = 0;
            gameStateStack  = new RecersiGameStateStack();
            UpdateState();
            ResetBuffer();
        }
Ejemplo n.º 4
0
 /// <summary>
 /// 此方法只能被回调. 当向棋局实例发出下棋请求后, 如果此请求被允许, 则会回调这个方法, 并传回下棋参数.
 /// 此方法只为更快地响应用户的下棋操作.
 /// </summary>
 /// <param name="piece">应下的棋子颜色</param>
 /// <param name="position">应下的棋子位置</param>
 /// <param name="positions">应该翻转的棋子</param>
 private void MovePiece_Confirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions)
 {
     if (confirmed)
     {
         IsMovePieceConfirmed = true;
     }
     else
     {
         MovePieceNeedStop = true;
     }
 }
Ejemplo n.º 5
0
 /// <summary>
 /// 此方法只能被回调.
 /// 当向棋局实例发出下棋请求后, 如果此请求被拒绝, 则会回调这个方法, 并在参数中告知下棋失败.
 /// 当整个下棋操作执行完成后, 会回调此方法. 在收到此方法之前, 应该停止新的下棋操作.
 /// </summary>
 /// <param name="isSuccess">指示落子是否成功</param>
 /// <param name="isGameOver">指示落子成功后游戏是否因此而结束</param>
 /// <param name="nextPiece">当落子成功并且游戏未结束, 则告知下一步应该下的棋子是哪种颜色的.</param>
 private void MovePiece_Completed(bool isSuccess, bool isGameOver, ReversiPiece nextPiece)
 {
     if (isSuccess)
     {
         IsMovePieceCompleted = true;
     }
     else
     {
         MovePieceNeedStop = true;
     }
 }
Ejemplo n.º 6
0
 /// <summary>
 /// 判断某一方是否赢了
 /// </summary>
 /// <param name="piece">需要判断的某一方</param>
 /// <returns>是否赢棋</returns>
 public bool isWin(ReversiPiece piece)
 {
     if (piece == WinSide)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Ejemplo n.º 7
0
 /// <summary>
 /// 获取一个棋子的反棋子, 如果不存在棋子, 则返回空棋子.
 /// </summary>
 /// <param name="piece">黑棋或白棋或空</param>
 /// <returns>白棋或黑棋或空</returns>
 public static ReversiPiece TryGetReversepiece(ReversiPiece piece)
 {
     try
     {
         return(GetReversepiece(piece));
     }
     catch
     {
         return(ReversiPiece.Empty);
     }
 }
Ejemplo n.º 8
0
        /// <summary>
        /// 开始执行落子操作
        /// </summary>
        public void PieceMoves()
        {
            if (MovePieceHandled || !IspieceEnabled(MovePiece_Position))
            {
                MovePiece_Confirmed(false, CurrentPiece, null, null);
                MovePiece_Completed(false, false, CurrentPiece);
                return;
            }
            // 保存缓冲区当中的当前落子信息
            ReversiPiece                thisPiece           = CurrentPiece;
            ReversiPiecePosition        thisMovePosition    = MovePiece_Position;
            List <ReversiPiecePosition> thisReversePosition = reversiBuffer.GetReversePositions(thisMovePosition);

            if (IsBusy || thisReversePosition == null)
            {
                MovePiece_Confirmed(false, CurrentPiece, null, null);
                MovePiece_Completed(false, false, CurrentPiece);
                return;
            }
            IsBusy = true;
            // 开始落子, 更新棋盘.
            PushState();
            CurrentBoard[thisMovePosition.X, thisMovePosition.Y] = CurrentPiece;
            foreach (ReversiPiecePosition rpp in thisReversePosition)
            {
                CurrentBoard[rpp.X, rpp.Y] = CurrentPiece;
            }
            UpdateState();
            LastPiece    = thisPiece;
            LastPosition = thisMovePosition;
            MovePiece_Confirmed(true, thisPiece, thisMovePosition, thisReversePosition);
            // 重建缓冲区
            CurrentPiece = GetReversepiece(CurrentPiece);
            ResetBuffer();
            if (GetEnabledPositions().Count <= 0)
            {
                CurrentPiece = GetReversepiece(CurrentPiece);
                ResetBuffer();
                if (GetEnabledPositions().Count <= 0)
                {
                    IsGameOver = true;
                }
            }
            // 落子完成, 对外宣布并重置落子参数
            IsBusy = false;
            MovePiece_Completed(true, IsGameOver, CurrentPiece);
            MovePiece_Position  = null;
            MovePiece_Confirmed = null;
            MovePiece_Completed = null;
            MovePieceHandled    = true;
        }
Ejemplo n.º 9
0
 public ReversiGameState(ReversiPiece[,] board, ReversiPiece piece, ReversiPiece lastPiece, ReversiPiecePosition lastPosition)
 {
     CurrentBoard = new ReversiPiece[ReversiGame.BoardSize, ReversiGame.BoardSize];
     for (int i = 0; i < ReversiGame.BoardSize; i++)
     {
         for (int j = 0; j < ReversiGame.BoardSize; j++)
         {
             CurrentBoard[i, j] = board[i, j];
         }
     }
     CurrentPiece = piece;
     LastPiece    = lastPiece;
     LastPosition = new ReversiPiecePosition(lastPosition.X, lastPosition.Y);
 }
Ejemplo n.º 10
0
 /// <summary>
 /// 获取一个棋子的反棋子, 如果不存在棋子, 则抛出异常.
 /// </summary>
 /// <param name="piece">黑棋或白棋</param>
 /// <returns>白棋或黑棋</returns>
 public static ReversiPiece GetReversepiece(ReversiPiece piece)
 {
     if (piece == ReversiPiece.Black)
     {
         return(ReversiPiece.White);
     }
     else if (piece == ReversiPiece.White)
     {
         return(ReversiPiece.Black);
     }
     else
     {
         throw new Exception("无法转化一个不存在的棋子");
     }
 }
Ejemplo n.º 11
0
        public Player(Rectangle boardRec, Piece[,] allPieces, ReversiPiece myColor)
        {
            reversiGame    = ReversiGame.CurrentGame;
            boardRectangle = boardRec;
            pieces         = allPieces;
            myPieceColor   = myColor;
            if (myColor == ReversiPiece.Black)
            {
                Players[0] = this;
            }
            else
            {
                Players[1] = this;
            }
            CurrentPlayer = Players[0];

            message              = CreateChild <Message>();
            isMyTurn             = false;
            isMovePieceCompleted = true;
            isMovingPiece        = false;
        }
Ejemplo n.º 12
0
 /// <summary>
 /// 执行棋局初始化操作 (包括新建棋局实例, 新建人工智能实例. 必要时执行自动下棋操作.)
 /// </summary>
 public void InitializeGame(ReversiPiece userPiece, int AIIndex, WhenGameOver gameOver)
 {
     InitialControls();
     whenGameOver   = gameOver;
     reversiGame    = ReversiGame.CreateANewGame();
     HumanPieceType = userPiece;
     UpdateWindow();
     reversiAI = ReversiAIType.GetAI(AIIndex);
     changeWaitingState(WaitingState.NotWaiting);
     if (HumanPieceType == ReversiPiece.White)
     {
         reversiAI.AIInitialize(ReversiPiece.Black);
         MovePiece();
         DoEvents();
     }
     else
     {
         reversiAI.AIInitialize(ReversiPiece.White);
     }
     ShowNextEnabledPieces();
     isInitialized = true;
     IsUserTurn    = true;
 }
Ejemplo n.º 13
0
 private void MovePieceCompleted(bool IsSuccess, bool isGameOver, ReversiPiece nextPiece)
 {
 }
Ejemplo n.º 14
0
 private void MovePieceConfirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions)
 {
 }
Ejemplo n.º 15
0
 public void Push(ReversiPiece[,] board, ReversiPiece piece, ReversiPiece lastPiece, ReversiPiecePosition lastPosition)
 {
     reversiGameState.Push(new ReversiGameState(board, piece, lastPiece, lastPosition));
     IsEmpty = false;
 }
Ejemplo n.º 16
0
 public override void MovePiece_Confirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions)
 {
 }
Ejemplo n.º 17
0
 /// <summary>
 /// 初始化 AI
 /// </summary>
 /// <param name="reversiBoard">初始棋盘</param>
 /// <param name="aIColor">AI 子颜色</param>
 public void AIInitialize(ReversiPiece aIColor)
 {
     AIColor = aIColor;
 }
Ejemplo n.º 18
0
 public virtual void MovePiece_Confirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions)
 {
     curGame.board.CurrentBoardState = BoardState.FreshGame;
 }
Ejemplo n.º 19
0
 protected void MovePiece_Completed(bool isSuccess, bool isGameOver, ReversiPiece nextPiece)
 {
     isMovePieceCompleted = true;
 }
Ejemplo n.º 20
0
 public Human(Rectangle boardRec, Piece[,] allPieces, ReversiPiece myColor)
     : base(boardRec, allPieces, myColor)
 {
     myType = PlayerTypes.Human;
     Name   = "您";
 }