.NET アプリケーション用の軽量でフル機能のチェス ソリューションで、キャスリング、アンパッサン、ポーンのプロモーション、および minmax AI プレーヤーによる正しい駒の動きを示します。
静的な BoardFactory.CreateBoard 関数を使用してボードのインスタンスを作成し、デフォルトの位置にピースが配置されたボードを作成します。ボードは X、Y グリッド システムに従い、(0,0) が左下のグリッド四角形、(7,7) が右上のグリッド四角形になります。プレーヤー 1 の駒 (白) は下の 2 行に作成され、プレーヤー 2 の駒 (黒) は上の 2 行に作成されます。ボードには現在のターンも保存されます。ボードが最初に作成されたときはプレイヤー 1 であり、移動が行われると入れ替わります。
Board board = BoardFactory . CreateBoard ( ) ;
次に、ChessPlayer のインスタンスを作成し、ボードに追加する必要があります。 ChessPlayer クラス自体は抽象クラスであるため、派生クラスを作成するか、既存の BasicPlayer を単純に使用する必要があります。 ChessPlayer をインスタンス化するときは、プレーヤー 1 またはプレーヤー 2 のどちらのチームに所属しているかを指定してから、それらをボードに追加する必要があります。その後、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 ) ) ;
カスタム ChessPlayer を使用すると、プレーヤーに合わせて移動する AI や、プレーヤーの 1 人に動きを適用するサードパーティの入力マネージャーなど、特定のプレーヤー機能を持たせることができます。
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 ;