حل شطرنج خفيف الوزن ومتكامل الميزات لتطبيقات .NET يعرض حركة القطع الصحيحة مع التبييت والتمرير وترويج البيدق ولاعب minmax AI.
قم بإنشاء مثيل للوحة باستخدام وظيفة BoardFactory.CreateBoard الثابتة، مما يؤدي إلى إنشاء لوحة تحتوي على قطع في المواضع الافتراضية. تتبع اللوحة نظام شبكة X,Y حيث يكون (0,0) هو مربع الشبكة السفلي الأيسر و(7,7) هو مربع الشبكة العلوي الأيمن. يتم إنشاء قطع اللاعب الأول (الأبيض) في الصفين السفليين ويتم إنشاء قطع اللاعب الثاني (الأسود) في الصفين العلويين. تقوم اللوحة أيضًا بتخزين الدور الحالي، وهو اللاعب الأول عند إنشاء اللوحة في البداية ويتم تبديله عند إجراء النقلات.
Board board = BoardFactory . CreateBoard ( ) ;
يجب عليك بعد ذلك إنشاء مثيلات للاعبي الشطرنج وإضافتهم إلى اللوحة. فئة ChessPlayer نفسها مجردة لذا يجب عليك إنشاء فئة مشتقة أو ببساطة استخدام BasicPlayer الموجود. عند إنشاء مثيل للاعب شطرنج، يجب عليك أيضًا تحديد الفريق الذي ينتمي إليه، اللاعب الأول أو اللاعب الثاني، ثم إضافته إلى اللوحة. يمكن لمثيلات 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 ) ) ;
باستخدام لاعبي الشطرنج المخصصين لديك، يمكنك الحصول على وظائف محددة للاعب، مثل الذكاء الاصطناعي الذي يتحرك للاعب، أو مدير إدخال تابع لجهة خارجية يطبق الحركات على أحد اللاعبين.
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 خطأً إذا كانت الخطوة التي قمت بها غير صالحة بأي شكل من الأشكال وستعود صحيحة إذا تم تطبيق النقل بنجاح. يمكن أن تكون النقلة غير صالحة للأسباب التالية:
يمكنك الاشتراك في العديد من عمليات الاسترجاعات التي يتم استدعاؤها خلال لعبة الشطرنج، مما يسهل على تطبيقك التفاعل مع الأحداث في لعبة الشطرنج. يعد رد الاتصال 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 ;