適用於 .NET 應用程式的輕量級、功能齊全的國際象棋解決方案,透過易位、過路、棋子提升和最小最大人工智慧玩家展示正確的棋子移動。
使用靜態 BoardFactory.CreateBoard 函數建立 Board 的實例,建立棋子位於預設位置的棋盤。此板遵循 X,Y 網格系統,其中 (0,0) 是左下方的網格方塊,(7,7) 是右上方的網格方塊。玩家一號棋子(白色)創建在底部兩行,玩家二號棋子(黑色)創建在頂部兩行。棋盤還儲存當前回合,即棋盤最初創建時為玩家一號,並在移動時交換。
Board board = BoardFactory . CreateBoard ( ) ;
然後,您必須建立 ChessPlayers 實例並將它們新增至棋盤。 ChessPlayer 類別本身是抽象的,因此您必須建立衍生類別或僅使用現有的 BasicPlayer。實例化 ChessPlayer 時,您還必須指定他們的團隊,玩家一或玩家二,然後將它們新增到棋盤上。然後,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,您可以擁有特定的玩家功能,例如為玩家移動的 AI,或為其中一位玩家應用移動的第 3 方輸入管理器。
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;如果移動成功應用,則ApplyMove 函數將傳回 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 ;