/// <summary> /// The event handler for OnPieceMove. /// </summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> private void Board_OnPieceMove(object sender, PieceMovedEventArgs e) { var move = Bitboard.Moves.FirstOrDefault(p => p.From == e.From && p.To == e.To); switch (move) { case null: { CalculateBitboard(new QuietMove(e.From, e.To, e.Piece.Type, e.Piece.Color), _quiescenceSearch); break; } case PromotionMove _: { var promotionMoves = Bitboard.Moves.OfType <PromotionMove>().Where(p => p.From == move.From && p.To == move.To); PromotionWindow.Display(move.Color, promotionMoves); break; } default: { CalculateBitboard(move, _quiescenceSearch); break; } } }
/// <summary> /// The event handler for OnPieceMove. /// </summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> private void Board_OnPieceMove(object sender, PieceMovedEventArgs e) { if (!_done && _currentColor == _playerColor && e.Piece != null && e.Piece.Color == _currentColor) { var enemyColor = ColorOperations.Invert(_currentColor); var move = Bitboard.Moves.FirstOrDefault(p => p.From == e.From && p.To == e.To); if (move == null) { return; } var testBitboard = Bitboard.Move(move); testBitboard.Calculate(false); if (testBitboard.IsCheck(_currentColor)) { ConsoleManager.WriteLine("$RInvalid move"); return; } switch (move) { case PromotionMove _: { var promotionMoves = Bitboard.Moves.OfType <PromotionMove>().Where(p => p.From == move.From && p.To == move.To); PromotionWindow.Display(move.Color, promotionMoves); break; } default: { CalculateBitboard(move, false); break; } } CheckIfGameHasEnded(Bitboard); _currentColor = ColorOperations.Invert(_currentColor); _history.Add(move); MoveAI(); } }