คำตอบของ jmite ใช้กับโปรแกรมที่จะออกจากการคำนวณหรือไม่ - เพราะมันไม่มีที่สิ้นสุดฉันจะไม่เรียกรหัสหลังจากที่มันตาย
อย่างไรก็ตามมีวิธีอื่น: ปัญหาที่มีคำตอบ แต่ไม่ทราบ:
public void Demo()
{
if (Chess.Evaluate(new Chessboard(), int.MaxValue) != 0)
MessageBox.Show("Chess is unfair!");
else
MessageBox.Show("Chess is fair!");
}
public class chess
{
public Int64 Evaluate(Chessboard Board, int SearchDepth)
{
...
}
}
รูทีนนี้โดยไม่มีข้อสงสัยจะมีรหัสตาย - ฟังก์ชั่นจะกลับคำตอบที่ดำเนินการหนึ่งเส้นทาง แต่ไม่ได้อื่น โชคดีที่พบมัน! ความทรงจำของฉันไม่ใช่คอมพิวเตอร์เชิงทฤษฎีที่สามารถแก้ปัญหานี้ได้ในช่วงอายุของจักรวาล
รายละเอียดเพิ่มเติม:
Evaluate()
คำนวณฟังก์ชั่นที่ด้านข้างชนะเกมหมากรุกถ้าทั้งสองฝ่ายเล่นได้อย่างสมบูรณ์แบบ (มีความลึกการค้นหาสูงสุด)
ผู้ประเมินผลหมากรุกมักจะมองไปข้างหน้าในทุก ๆ ความเคลื่อนไหวที่เป็นไปได้บางระดับความลึกที่กำหนดและจากนั้นพยายามให้คะแนนกระดาน ณ จุดนั้น (บางครั้งการขยายสาขาบางอย่างไกลออกไป คือ 17695 ครึ่งหนึ่งของการค้นหาที่ละเอียดถี่ถ้วนมันจะข้ามทุกเกมหมากรุกที่เป็นไปได้ เนื่องจากทุกเกมจบไม่มีปัญหาในการพยายามตัดสินใจว่าตำแหน่งแต่ละบอร์ดนั้นดีเพียงใด (และไม่มีเหตุผลที่จะพิจารณาตรรกะการประเมินบอร์ด - มันจะไม่ถูกเรียก) ผลที่ได้คือชนะแพ้หรือแพ้ การวาด. หากผลออกมาเสมอกันเกมนั้นยุติธรรมถ้าผลออกมาเสมอกันมันเป็นเกมที่ไม่ยุติธรรม หากต้องการขยายให้เพิ่มขึ้นเราได้รับ:
public Int64 Evaluate(Chessboard Board, int SearchDepth)
{
foreach (ChessMove Move in Board.GetPossibleMoves())
{
Chessboard NewBoard = Board.MakeMove(Move);
if (NewBoard.Checkmate()) return int.MaxValue;
if (NewBoard.Draw()) return 0;
if (SearchDepth == 0) return NewBoard.Score();
return -Evaluate(NewBoard, SearchDepth - 1);
}
}
โปรดทราบว่าคอมไพเลอร์จะไม่สามารถตระหนักได้ว่า Chessboard.Score () เป็นโค้ดที่ตายแล้ว ความรู้เกี่ยวกับกฎของหมากรุกช่วยให้มนุษย์เราสามารถเข้าใจสิ่งนี้ได้ แต่คุณต้องรู้ว่า MakeMove ไม่สามารถเพิ่มจำนวนชิ้นได้และ Chessboard.Draw () จะกลับมาจริงถ้าจำนวนชิ้นนั้นคงที่นานเกินไป .
โปรดทราบว่าความลึกของการค้นหาอยู่ในการเคลื่อนไหวครึ่งหนึ่งไม่ใช่การเคลื่อนไหวทั้งหมด นี่เป็นเรื่องปกติสำหรับชุดคำสั่ง AI นี้เนื่องจากเป็นชุดคำสั่ง O (x ^ n) - การเพิ่มการค้นหาอีกหนึ่งครั้งมีผลกระทบอย่างมากต่อระยะเวลาที่ใช้ในการเรียกใช้