public AI(Rectangle boardRec, Piece[,] allPieces, ReversiPiece myColor) : base(boardRec, allPieces, myColor) { myType = PlayerTypes.AI; Name = "电脑"; Initialize(); }
/// <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(); } }
/// <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(); }
/// <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; } }
/// <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; } }
/// <summary> /// 判断某一方是否赢了 /// </summary> /// <param name="piece">需要判断的某一方</param> /// <returns>是否赢棋</returns> public bool isWin(ReversiPiece piece) { if (piece == WinSide) { return(true); } else { return(false); } }
/// <summary> /// 获取一个棋子的反棋子, 如果不存在棋子, 则返回空棋子. /// </summary> /// <param name="piece">黑棋或白棋或空</param> /// <returns>白棋或黑棋或空</returns> public static ReversiPiece TryGetReversepiece(ReversiPiece piece) { try { return(GetReversepiece(piece)); } catch { return(ReversiPiece.Empty); } }
/// <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; }
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); }
/// <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("无法转化一个不存在的棋子"); } }
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; }
/// <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; }
private void MovePieceCompleted(bool IsSuccess, bool isGameOver, ReversiPiece nextPiece) { }
private void MovePieceConfirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions) { }
public void Push(ReversiPiece[,] board, ReversiPiece piece, ReversiPiece lastPiece, ReversiPiecePosition lastPosition) { reversiGameState.Push(new ReversiGameState(board, piece, lastPiece, lastPosition)); IsEmpty = false; }
public override void MovePiece_Confirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions) { }
/// <summary> /// 初始化 AI /// </summary> /// <param name="reversiBoard">初始棋盘</param> /// <param name="aIColor">AI 子颜色</param> public void AIInitialize(ReversiPiece aIColor) { AIColor = aIColor; }
public virtual void MovePiece_Confirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions) { curGame.board.CurrentBoardState = BoardState.FreshGame; }
protected void MovePiece_Completed(bool isSuccess, bool isGameOver, ReversiPiece nextPiece) { isMovePieceCompleted = true; }
public Human(Rectangle boardRec, Piece[,] allPieces, ReversiPiece myColor) : base(boardRec, allPieces, myColor) { myType = PlayerTypes.Human; Name = "您"; }