Une solution d'échecs légère et complète pour les applications .NET qui présente un mouvement correct des pièces avec roque, passage, promotion de pion et un joueur IA minmax.
Créez une instance d'un tableau à l'aide de la fonction statique BoardFactory.CreateBoard, créant un tableau avec des pièces dans les positions par défaut. Le tableau suit un système de grille X, Y, (0,0) étant le carré de la grille en bas à gauche et (7,7) le carré de la grille en haut à droite. Les pièces du joueur un (blanc) sont créées sur les deux rangées du bas et les pièces du joueur deux (noires) sont créées sur les deux rangées du haut. Le tableau stocke également le tour en cours, qui est le joueur un lorsque le tableau est initialement créé et change lorsque des mouvements sont effectués.
Board board = BoardFactory . CreateBoard ( ) ;
Vous devez ensuite créer des instances de ChessPlayers et les ajouter au Board. La classe ChessPlayer elle-même est abstraite, vous devez donc créer une classe dérivée ou simplement utiliser le BasicPlayer existant. Lors de l'instanciation d'un joueur d'échecs, vous devez également préciser à quelle équipe il appartient, joueur un ou joueur deux, puis les ajouter au tableau. Les instances de ChessPlayer peuvent ensuite effectuer des mouvements en appelant la fonction de 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 ) ) ;
Avec vos ChessPlayers personnalisés, vous pouvez disposer de fonctionnalités de joueur spécifiques, telles qu'une IA se déplaçant pour un joueur ou un gestionnaire d'entrée tiers appliquant des mouvements à l'un des joueurs.
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 mouvement est défini par une position de départ et une position de destination. Les joueurs d'échecs peuvent effectuer des mouvements en appelant la fonction MovePièce si elles ont été ajoutées au tableau.
var pawnPos = new Vector2I ( 4 , 1 ) ;
var pawnDest = new Vector2I ( 4 , 3 ) ;
var move = new BoardPieceMove ( pawnPos , pawnDest ) ;
_player . MovePiece ( move ) ;
La fonction ApplyMove renverra false si le déplacement que vous avez effectué n'était pas valide de quelque manière que ce soit et renverra vrai si le déplacement a été appliqué avec succès. Un déménagement peut être invalide pour les raisons suivantes :
Vous pouvez vous abonner à divers rappels appelés tout au long d'une partie d'échecs, ce qui permet à votre application de réagir facilement aux événements de la partie d'échecs. Le rappel OnBoardChanged est spécial car il vous donne une liste de toutes les actions appliquées au plateau au tour précédent, telles que la pièce déplacée, la pièce prise, la promotion de pion, etc. et inclut le mouvement lui-même vous fournissant les positions de pièce vers et depuis la pièce. se déplacer. Cela peut vous permettre d'animer un mouvement ou simplement de restituer le tableau.
// 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 ;