public override void Update(GameTime gameTime) { if (isMyTurn) { passedTime += (long)gameTime.ElapsedGameTime.TotalMilliseconds; } if (isMyTurn && !isMovingPiece) { isMovePieceCompleted = false; AIPosition = reversiAI.GetNextpiece(); AIReversePositions = reversiGame.GetReversePositions(AIPosition); MovePiece(AIPosition); } if (isMovePieceCompleted && isMyTurn && passedTime > waitTime) { passedTime = 0; curGame.board.CurrentBoardState = BoardState.FreshGame; if (!reversiGame.IsGameOver && reversiGame.CurrentPiece == reversiGame.LastPiece) { // TODO: 添加无子可下的显示 } isMyTurn = false; isMovingPiece = false; isMovePieceCompleted = true; } base.Update(gameTime); }
/// <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="position">用户落子的位置</param> private void MovePiece(ReversiPiecePosition position) { IsUserTurn = false; changeWaitingState(WaitingState.WaitingMovePieceConfirmed); reversiGame.SetPieceMoveArgs(position, MovePiece_Confirmed, MovePiece_Completed); if (movePieceThread != null && movePieceThread.IsAlive) { movePieceThread.Abort(); } movePieceThread = new Thread(new ThreadStart(reversiGame.PieceMoves)); movePieceThread.Start(); }
protected async void MovePiece(ReversiPiecePosition position) { isMovingPiece = true; pieces[reversiGame.LastPosition.X, reversiGame.LastPosition.Y].IsLastPiece = false; pieces[position.X, position.Y].IsLastPiece = true; reversiGame.SetPieceMoveArgs(position, MovePiece_Confirmed, MovePiece_Completed); if (movePieceTask != null && !movePieceTask.IsCompleted) { movePieceTask.Wait(); } movePieceTask = new Task(() => reversiGame.PieceMoves()); movePieceTask.Start(); }
public virtual void MovePiece_Confirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions) { curGame.board.CurrentBoardState = BoardState.FreshGame; }
public override void MovePiece_Confirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions) { }
public override void Update(GameTime gameTime) { if (settingBoardState == SettingBoardState.Showing) { settingBoardState = SettingBoardState.Show; } else if (settingBoardState == SettingBoardState.Show) { if (startButton.StartButtonClicked) { for (int i = 0; i < 2; i++) { PlayerSettings.Player[i].Type = PlayerType[i]; if (PlayerType[i] == PlayerTypes.AI) { PlayerSettings.Player[i].AIIndex = AIIndex[i]; } } settingBoardState = SettingBoardState.HidingForNewGame; } else if (startButton.ResumeButtonClicked) { settingBoardState = SettingBoardState.HidingForResume; } else { // 绘制选择状态 foreach (Piece piece in showPieces) { piece.CurrentDisplay = DisplayState.Normal; } foreach (Piece piece in playerTypePieces) { piece.CurrentDisplay = DisplayState.Normal; } foreach (int i in chooseIndex) { playerTypePieces[i].CurrentDisplay = DisplayState.CanMove; } for (int i = 0; i < AICount; i++) { if (chooseIndex[0] == 1) { aiTypePieces[0, i].PieceState = PieceState.Black; } else { aiTypePieces[0, i].PieceState = PieceState.Empty; } if (chooseIndex[1] == 2) { aiTypePieces[1, i].PieceState = PieceState.White; } else { aiTypePieces[1, i].PieceState = PieceState.Empty; } } if (chooseIndex[0] == 1) { aiTypePieces[0, AIIndex[0]].CurrentDisplay = DisplayState.WillReverse; } if (chooseIndex[1] == 2) { aiTypePieces[1, AIIndex[1]].CurrentDisplay = DisplayState.WillReverse; } if (curGame.IsActive) { // 获取鼠标状态 lastMouseState = currentMouseState; currentMouseState = Mouse.GetState(); ReversiPiecePosition tempPosition = Board.IsMouseInPiece(currentMouseState); // 如果移动鼠标 if (tempPosition != null) { // 如果划过的是黑白子 if (tempPosition.Y == 2) { if (tempPosition.X == 3) { showPieces[0].CurrentDisplay = DisplayState.WillMove; } else if (tempPosition.X == 4) { showPieces[1].CurrentDisplay = DisplayState.WillMove; } } // 如果划过的是玩家类型选择 else if (tempPosition.Y == 3) { int index = -1; if (tempPosition.X == 1) { index = 0; } else if (tempPosition.X == 2) { index = 1; } else if (tempPosition.X == 5) { index = 2; } else if (tempPosition.X == 6) { index = 3; } if (index >= 0) { playerTypePieces[index].CurrentDisplay = DisplayState.WillMove; } } // 如果划过的是AI类型 if ((tempPosition.X == 0 || tempPosition.X == 7) && (tempPosition.Y >= 3 && tempPosition.Y <= 2 + AICount)) { if (chooseIndex[0] == 1 && tempPosition.X == 0) { int index = tempPosition.Y - 3; aiTypePieces[0, index].CurrentDisplay = DisplayState.WillMove; } if (chooseIndex[1] == 2 && tempPosition.X == 7) { int index = tempPosition.Y - 3; aiTypePieces[1, index].CurrentDisplay = DisplayState.WillMove; } } // 如果按下鼠标左键 if ((currentMouseState.LeftButton == ButtonState.Pressed) && (lastMouseState.LeftButton == ButtonState.Released)) { // 如果点击的是黑白子 if (tempPosition.Y == 2) { if (tempPosition.X == 3) { chooseIndex[0] = 0; PlayerType[0] = PlayerTypes.Human; chooseIndex[1] = 2; PlayerType[1] = PlayerTypes.AI; } else if (tempPosition.X == 4) { chooseIndex[0] = 1; PlayerType[0] = PlayerTypes.AI; chooseIndex[1] = 3; PlayerType[1] = PlayerTypes.Human; } } // 如果点击的是玩家类型选择 else if (tempPosition.Y == 3) { if (tempPosition.X == 1) { chooseIndex[0] = 0; PlayerType[0] = PlayerTypes.Human; } if (tempPosition.X == 2) { chooseIndex[0] = 1; PlayerType[0] = PlayerTypes.AI; } if (tempPosition.X == 5) { chooseIndex[1] = 2; PlayerType[1] = PlayerTypes.AI; } if (tempPosition.X == 6) { chooseIndex[1] = 3; PlayerType[1] = PlayerTypes.Human; } } // 如果点击的是AI类型选择 if (tempPosition.X == 0 || tempPosition.X == 7) { if (chooseIndex[0] == 1 && tempPosition.X == 0) { AIIndex[0] = tempPosition.Y - 3; } if (chooseIndex[1] == 2 && tempPosition.X == 7) { AIIndex[1] = tempPosition.Y - 3; } } } } } foreach (Piece piece in showPieces) { piece.Update(gameTime); } foreach (Piece piece in playerTypePieces) { piece.Update(gameTime); } foreach (Piece piece in aiTypePieces) { piece.Update(gameTime); } startButton.Update(gameTime); } // 获取键盘状态 lastKeyboardState = currentKeyboardState; currentKeyboardState = Keyboard.GetState(Keys.Escape); // 当按下 Escape 键时 if (currentKeyboardState.IsKeyUp(Keys.Escape) && lastKeyboardState.IsKeyDown(Keys.Escape)) { if (settingType == SettingType.Pause) { settingBoardState = SettingBoardState.HidingForResume; } } } else if (settingBoardState == SettingBoardState.HidingForNewGame) { // TODO: 隐藏动画 settingBoardState = SettingBoardState.HideForNewGame; } else if (settingBoardState == SettingBoardState.HidingForResume) { // TODO: 隐藏动画 settingBoardState = SettingBoardState.HideForResume; } else if (settingBoardState == SettingBoardState.HideForNewGame) { curGame.State = GameState.StartLoad; } else if (settingBoardState == SettingBoardState.HideForResume) { curGame.State = GameState.InGame; } // base.Update(gameTime); }
public override void Update(GameTime gameTime) { if (isMyTurn && !isMovingPiece && curGame.IsActive) { // 获取键盘状态 lastKeyboardState = currentKeyboardState; currentKeyboardState = Keyboard.GetState(Keys.LeftControl, Keys.RightControl, Keys.Z); // 当按下 Ctrl+Z 时 if ((currentKeyboardState.IsKeyDown(Keys.LeftControl) || currentKeyboardState.IsKeyDown(Keys.RightControl)) && currentKeyboardState.IsKeyDown(Keys.Z)) { isCtrlZPressed = true; } else if (currentKeyboardState.IsKeyUp(Keys.Z)) { if (isCtrlZPressed) { isCtrlZPressed = false; if (GameSettings.IsRegretEnabled) { RegretMovePiece(); } } } foreach (ReversiPiecePosition rpp in reversiGame.GetEnabledPositions()) { pieces[rpp.X, rpp.Y].CurrentDisplay = DisplayState.CanMove; } lastMouseState = currentMouseState; currentMouseState = Mouse.GetState(); ReversiPiecePosition tempPosition = Board.IsMouseInPiece(currentMouseState); // 如果移动鼠标 if (tempPosition != null && reversiGame.IspieceEnabled(tempPosition)) { pieces[tempPosition.X, tempPosition.Y].CurrentDisplay = DisplayState.WillMove; foreach (ReversiPiecePosition rpp in reversiGame.GetReversePositions(tempPosition)) { pieces[rpp.X, rpp.Y].CurrentDisplay = DisplayState.WillReverse; } } // 如果单击鼠标左键 if ((currentMouseState.LeftButton == ButtonState.Released) && (lastMouseState.LeftButton == ButtonState.Pressed)) { if (tempPosition != null && reversiGame.IspieceEnabled(tempPosition)) { isMovePieceCompleted = false; /*pieces[tempPosition.X, tempPosition.Y].PieceState = (PieceState)myPieceColor; * foreach (ReversiPiecePosition rpp in reversiGame.GetReversePositions(tempPosition)) * pieces[rpp.X, rpp.Y].PieceState = (PieceState)myPieceColor;*/ MovePiece(tempPosition); } } } if (isMovePieceCompleted && isMyTurn) { if (!reversiGame.IsGameOver && reversiGame.CurrentPiece == reversiGame.LastPiece) { // TODO: 添加无子可下的显示 } isMyTurn = false; isMovingPiece = false; } base.Update(gameTime); }