jmite'nin cevabı, programın bir hesaplamadan çıkıp çıkmayacağına uygulanır - sadece sonsuz olduğu için, kodun ölülmesinden sonra çağrılmaz.
Bununla birlikte, başka bir yaklaşım daha var: Cevabı olan ancak bilinmeyen bir problem:
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)
{
...
}
}
Şüphesiz bu rutin gelmez ölü kod içerir - fonksiyon tek yolu ancak diğer değil yürütür bir cevap dönecektir. Yine de bulmakta iyi şanslar! Hafızam teorik bir bilgisayarın bunu evrenin ömrü boyunca çözebileceği bir şey değil.
Daha ayrıntılı olarak:
Evaluate()
Her iki taraf da (maksimum arama derinliği) kusursuzca oynarsanız yan bir satranç oyunları kazanır fonksiyon değerlerini hesaplar.
Satranç değerlendiricileri normalde mümkün olan her harekete belirli bir derinlik taşıyarak ileriye bakarlar ve sonra tahtayı bu noktada puanlamaya çalışırlar (bazen bazı dalları bir borsadan veya benzerinden yarıya baktıkça uzatarak çok eğrilmiş bir algı yaratabilir.) Gerçek maksimum derinlikten itibaren 17695 yarım hareket eder arama kapsamlı, olası her satranç oyununu geçecek. Tüm oyunların sona ermesinden dolayı, her bir tahtanın ne kadar iyi bir pozisyon olduğuna karar vermeye çalışmanın bir sorunu yoktur (ve böylece tahta değerlendirme mantığına bakmak için hiçbir sebep yoktur - asla çağrılmaz), sonuç ya bir kazanç, bir kayıp veya bir çizim. Sonuç beraberlik ise oyun adil, sonuç beraberlik değilse bu adil olmayan bir oyundur. Onu biraz genişletmek için:
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);
}
}
Ayrıca, derleyicinin Chessboard.Score () kodunun ölü kod olduğunu fark etmesi neredeyse imkansız olacak. Satranç kurallarının bilgisi, insanların bunu çözmemize izin verir, ancak bunu çözebilmek için MakeMove'un parça sayısını asla artıramayacağını ve Chessboard.Draw () 'ın parça sayısı çok uzun süre statik kalırsa doğru döneceğini bilmek zorundasınız. .
Arama derinliğinin tüm hareketlerin değil, yarım hareket halinde olduğunu unutmayın. Bu, bu tür AI yordamı için normaldir, çünkü O (x ^ n) yordamıdır - bir tane daha arama katmanı eklemek, ne kadar süreceği üzerinde büyük bir etkiye sahiptir.