Uma solução de xadrez leve e completa para aplicativos .NET que exibe o movimento correto das peças com roque, en passant, promoção de peões e um jogador de IA minmax.
Crie uma instância de um tabuleiro usando a função estática BoardFactory.CreateBoard, criando um tabuleiro com peças nas posições padrão. O tabuleiro segue um sistema de grade X,Y com (0,0) sendo o quadrado inferior esquerdo da grade e (7,7) sendo o quadrado superior direito da grade. As peças do Jogador Um (brancas) são criadas nas duas linhas inferiores e as peças do Jogador Dois (pretas) são criadas nas duas linhas superiores. O Tabuleiro também armazena o turno atual, que é o Jogador Um quando o tabuleiro é criado inicialmente e é trocado quando os movimentos são feitos.
Board board = BoardFactory . CreateBoard ( ) ;
Você deve então criar instâncias de ChessPlayers e adicioná-las ao Tabuleiro. A classe ChessPlayer em si é abstrata, portanto você deve criar uma classe derivada ou simplesmente usar o BasicPlayer existente. Ao instanciar um ChessPlayer você também deve especificar em qual time ele está, Jogador Um ou Jogador Dois, e então adicioná-lo ao Tabuleiro. As instâncias do ChessPlayer podem então fazer movimentos chamando a função base MakeMove.
public abstract class ChessPlayer
{
public virtual void Update ( float deltaTime ) { }
protected virtual void OnGameStateChanged ( GameState state ) { }
protected virtual void OnTurnSwapped ( Player player ) { }
protected bool MovePiece ( BoardPieceMove boardPieceMove ) { }
}
_board = BoardFactory . CreateBoard ( ) ;
_board . AddPlayer ( new UnityChessPlayer ( _board , Player . PlayerOne ) ) ;
_board . AddPlayer ( new AIChessPlayer ( _board , Player . PlayerTwo ) ) ;
Com seus ChessPlayers personalizados, você pode ter funcionalidades específicas de jogador, como uma IA movendo-se para um jogador ou um gerenciador de entrada de terceiros aplicando movimentos para um dos jogadores.
public class AIChessPlayer : ChessPlayer
{
public AIChessPlayer ( Board board , Player player ) : base ( board , player ) { }
protected override void BoardOnOnTurnSwapped ( Player player )
{
if ( player == _player )
{
ThreadPool . QueueUserWorkItem ( ( state ) => CalculateAndMove ( ) ) ;
}
}
private void CalculateAndMove ( )
{
MovePiece ( MinMaxMoveCalc . GetBestMove ( Board ) ) ;
}
}
Um movimento é definido por uma posição inicial e uma posição inicial. Os jogadores de xadrez podem fazer movimentos chamando a função MovePiece se ela tiver sido adicionada ao tabuleiro.
var pawnPos = new Vector2I ( 4 , 1 ) ;
var pawnDest = new Vector2I ( 4 , 3 ) ;
var move = new BoardPieceMove ( pawnPos , pawnDest ) ;
_player . MovePiece ( move ) ;
A função ApplyMove retornará falso se a movimentação feita for inválida de alguma forma e retornará verdadeiro se a movimentação tiver sido aplicada com sucesso. Uma mudança pode ser inválida pelos seguintes motivos:
Você pode assinar vários retornos de chamada chamados durante um jogo de xadrez, facilitando a reação do seu aplicativo aos eventos do jogo de xadrez. O retorno de chamada OnBoardChanged é especial porque fornece uma lista de todas as ações aplicadas ao tabuleiro no turno anterior, como peça movida, peça tomada, promoção de peão etc. mover. Isso pode permitir que você anime o movimento ou apenas renderize o quadro.
// Called when a player makes their move and its parameter is the current players go.
public event PlayerDelegate OnTurnSwapped ;
/// Called when a player is in checkmate and its parameter is the player in check.
public event PlayerDelegate OnPlayerInCheck ;
/// Called when a something on the board has changed and its parameter is a list of changes.
public event BoardChangesDelegate OnBoardChanged ;
/// Called when the state of the game changes, such as when a game is paused, resumed or ended.
public event BoardGameStateDelegate OnGameStateChanged ;