Легкое, полнофункциональное решение для шахмат для приложений .NET, которое демонстрирует правильное движение фигур с рокировкой, на проходе, продвижением пешки и минимальным ИИ-игроком.
Создайте экземпляр Board, используя статическую функцию BoardFactory.CreateBoard, создавая доску с фигурами в положениях по умолчанию. Доска соответствует системе координат X,Y, где (0,0) — нижний левый квадрат сетки, а (7,7) — верхний правый квадрат сетки. Фигуры первого игрока (белые) создаются в двух нижних рядах, а фигуры второго игрока (черные) — в двух верхних рядах. Доска также сохраняет текущий ход, который является ходом первого игрока при первоначальном создании доски и меняется местами при совершении ходов.
Board board = BoardFactory . CreateBoard ( ) ;
Затем вы должны создать экземпляры ChessPlayers и добавить их на доску. Сам класс ChessPlayer является абстрактным, поэтому вам необходимо создать производный класс или просто использовать существующий BasicPlayer. При создании экземпляра ChessPlayer вы также должны указать, в какой команде он состоит: Player One или Player Two, а затем добавить их на доску. Экземпляры ChessPlayer затем могут делать ходы, вызывая базовую функцию 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 ) ) ;
С помощью ваших пользовательских ChessPlayers вы можете иметь определенные функции игрока, такие как ИИ, двигающийся за игрока, или сторонний менеджер ввода, применяющий ходы для одного из игроков.
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 ) ) ;
}
}
Перемещение определяется позициями «Из» и «Куда». Игроки в шахматы могут делать ходы, вызывая функцию MovePiece, если она была добавлена на доску.
var pawnPos = new Vector2I ( 4 , 1 ) ;
var pawnDest = new Vector2I ( 4 , 3 ) ;
var move = new BoardPieceMove ( pawnPos , pawnDest ) ;
_player . MovePiece ( move ) ;
Функция ApplyMove вернет false, если сделанный вами ход был каким-либо образом недействительным, и вернет true, если ход был успешно применен. Ход может быть недействительным по следующим причинам:
Вы можете подписаться на различные обратные вызовы, которые вызываются во время шахматной игры, что позволяет вашему приложению легко реагировать на события в шахматной игре. Обратный вызов OnBoardChanged уникален, поскольку он дает вам список всех действий, примененных к доске в предыдущем ходу, таких как перемещение фигуры, взятие фигуры, продвижение пешки и т. д., и включает в себя сам ход, предоставляя вам позиции фигуры «Куда» и «От» двигаться. Это позволит вам анимировать движение или просто визуализировать доску.
// 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 ;