Eine leichte, voll ausgestattete Schachlösung für .NET-Anwendungen, die eine korrekte Figurenbewegung mit Rochade, En Passant, Bauernförderung und einem Minmax-KI-Spieler bietet.
Erstellen Sie eine Instanz eines Boards mithilfe der statischen BoardFactory.CreateBoard-Funktion und erstellen Sie ein Board mit Teilen an den Standardpositionen. Das Spielbrett folgt einem X,Y-Rastersystem, wobei (0,0) das untere linke Rasterquadrat und (7,7) das obere rechte Rasterquadrat ist. Die Spieler-Eins-Teile (weiß) werden in den beiden unteren Reihen erstellt und die Spieler-2-Teile (schwarz) werden in den oberen beiden Reihen erstellt. Das Spielbrett speichert auch den aktuellen Spielzug, bei dem es sich bei der ersten Erstellung des Spielbretts um Spieler Eins handelt, und den Wechsel, wenn Züge ausgeführt werden.
Board board = BoardFactory . CreateBoard ( ) ;
Anschließend müssen Sie Instanzen von ChessPlayers erstellen und diese dem Board hinzufügen. Die ChessPlayer-Klasse selbst ist abstrakt, daher müssen Sie eine abgeleitete Klasse erstellen oder einfach den vorhandenen BasicPlayer verwenden. Wenn Sie einen ChessPlayer instanziieren, müssen Sie auch angeben, zu welchem Team er gehört, Spieler eins oder Spieler zwei, und ihn dann dem Board hinzufügen. ChessPlayer-Instanzen können dann Züge ausführen, indem sie die Basisfunktion MakeMove aufrufen.
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 ) ) ;
Mit Ihren benutzerdefinierten ChessPlayern können Sie über spezifische Spielerfunktionen verfügen, z. B. einen KI-Zug für einen Spieler oder einen Eingabemanager eines Drittanbieters, der Züge für einen der Spieler anwendet.
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 ) ) ;
}
}
Eine Bewegung wird durch eine Von-Position und eine Bis-Position definiert. Schachspieler können Züge ausführen, indem sie die MovePiece-Funktion aufrufen, wenn diese dem Brett hinzugefügt wurden.
var pawnPos = new Vector2I ( 4 , 1 ) ;
var pawnDest = new Vector2I ( 4 , 3 ) ;
var move = new BoardPieceMove ( pawnPos , pawnDest ) ;
_player . MovePiece ( move ) ;
Die ApplyMove-Funktion gibt „false“ zurück, wenn die von Ihnen vorgenommene Verschiebung in irgendeiner Weise ungültig war, und gibt „true“ zurück, wenn die Verschiebung erfolgreich angewendet wurde. Ein Umzug kann aus folgenden Gründen ungültig sein:
Sie können verschiedene Rückrufe abonnieren, die während eines Schachspiels aufgerufen werden, sodass Ihre Anwendung problemlos auf Ereignisse im Schachspiel reagieren kann. Der OnBoardChanged-Callback ist etwas Besonderes, da er Ihnen eine Liste aller Aktionen liefert, die in der vorherigen Runde auf dem Spielfeld durchgeführt wurden, z. B. bewegte Figuren, genommene Figuren, Bauernumwandlung usw., und den Zug selbst enthält, sodass Sie die Positionen der Figuren nach und von der Figur erhalten bewegen. Dadurch können Sie Bewegungen animieren oder einfach nur das Board rendern.
// 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 ;