โซลูชันหมากรุกน้ำหนักเบาและมีคุณสมบัติครบถ้วนสำหรับแอปพลิเคชัน .NET ที่แสดงการเคลื่อนไหวของหมากที่ถูกต้องด้วยการโยน การผ่าน การเลื่อนตำแหน่งจำนำ และผู้เล่น minmax AI
สร้างอินสแตนซ์ของบอร์ดโดยใช้ฟังก์ชัน BoardFactory.CreateBoard แบบคงที่ สร้างบอร์ดที่มีชิ้นส่วนอยู่ในตำแหน่งเริ่มต้น กระดานเป็นไปตามระบบตาราง X,Y โดยที่ (0,0) เป็นตารางตารางด้านซ้ายล่าง และ (7,7) เป็นตารางตารางด้านขวาบน ชิ้นส่วนของ Player One (สีขาว) จะถูกสร้างขึ้นที่แถวล่างสองแถว และชิ้นส่วนของ Player One (สีดำ) จะถูกสร้างขึ้นที่สองแถวบนสุด กระดานยังจัดเก็บเทิร์นปัจจุบัน ซึ่งก็คือผู้เล่นหนึ่งเมื่อบอร์ดถูกสร้างขึ้นครั้งแรก และสลับเมื่อมีการเคลื่อนไหว
Board board = BoardFactory . CreateBoard ( ) ;
จากนั้นคุณจะต้องสร้างอินสแตนซ์ของ ChessPlayers และเพิ่มลงในกระดาน คลาส 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 ) ) ;
ด้วยผู้เล่นหมากรุกที่คุณกำหนดเอง คุณสามารถมีฟังก์ชันเฉพาะของผู้เล่นได้ เช่น AI เคลื่อนที่สำหรับผู้เล่น หรือตัวจัดการอินพุตบุคคลที่สามที่ใช้การเคลื่อนไหวกับผู้เล่นคนใดคนหนึ่ง
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 ) ) ;
}
}
การย้ายถูกกำหนดโดยตำแหน่งจากและตำแหน่งถึง ผู้เล่นหมากรุกสามารถเคลื่อนไหวได้โดยการเรียกใช้ฟังก์ชัน Move Piece หากมีการเพิ่มลงในกระดาน
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 ;