Una solución de ajedrez liviana y con todas las funciones para aplicaciones .NET que muestra el movimiento correcto de las piezas con enroque, al paso, promoción de peones y un jugador con IA minmax.
Cree una instancia de un tablero utilizando la función estática BoardFactory.CreateBoard, creando un tablero con piezas en las posiciones predeterminadas. El tablero sigue un sistema de cuadrícula X,Y donde (0,0) es el cuadrado de la cuadrícula inferior izquierda y (7,7) es el cuadrado de la cuadrícula superior derecha. Las piezas del Jugador Uno (blancas) se crean en las dos filas inferiores y las piezas del Jugador Dos (negras) se crean en las dos filas superiores. El tablero también almacena el turno actual, que es el del jugador uno cuando se crea inicialmente el tablero y se intercambia cuando se realizan movimientos.
Board board = BoardFactory . CreateBoard ( ) ;
Luego debes crear instancias de ChessPlayers y agregarlas al tablero. La clase ChessPlayer en sí es abstracta, por lo que debes crear una clase derivada o simplemente usar el BasicPlayer existente. Al crear una instancia de un ChessPlayer, también debes especificar en qué equipo está, Jugador Uno o Jugador Dos, y luego agregarlo al Tablero. Las instancias de ChessPlayer pueden luego realizar movimientos llamando a la función 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 ) ) ;
Con tus ChessPlayers personalizados puedes tener funcionalidades de jugador específicas, como una IA que se mueve para un jugador o un administrador de entrada de terceros que aplica movimientos para uno de los jugadores.
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 ) ) ;
}
}
Un movimiento se define por una posición desde y una posición hacia. Los jugadores de ajedrez pueden realizar movimientos llamando a la función MovePieza si se han agregado al tablero.
var pawnPos = new Vector2I ( 4 , 1 ) ;
var pawnDest = new Vector2I ( 4 , 3 ) ;
var move = new BoardPieceMove ( pawnPos , pawnDest ) ;
_player . MovePiece ( move ) ;
La función ApplyMove devolverá falso si el movimiento que realizó no fue válido de alguna manera y devolverá verdadero si el movimiento se aplicó con éxito. Un movimiento puede no ser válido por las siguientes razones:
Puede suscribirse a varias devoluciones de llamada que se realizan durante un juego de ajedrez, lo que facilita que su aplicación reaccione a los eventos del juego de ajedrez. La devolución de llamada OnBoardChanged es especial porque le brinda una lista de cada acción aplicada al tablero en el turno anterior, como pieza movida, pieza tomada, promoción de peón, etc. e incluye el movimiento en sí, brindándole las posiciones de ida y vuelta de las piezas del mover. Esto puede permitirle animar el movimiento o simplemente renderizar el tablero.
// 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 ;