A resposta de jmite se aplica se o programa sairá de um cálculo - apenas porque é infinito, eu não chamaria o código depois de morto.
No entanto, há outra abordagem: um problema para o qual existe uma resposta, mas é desconhecido:
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)
{
...
}
}
Essa rotina, sem dúvida , contém código morto - a função retornará uma resposta que executa um caminho, mas não o outro. Boa sorte em encontrá-lo! Minha memória é que nenhum computador teórico pode resolver isso dentro da vida útil do universo.
Em mais detalhes:
A Evaluate()
função calcula qual lado vence um jogo de xadrez se os dois lados jogarem perfeitamente (com profundidade máxima de busca).
Os avaliadores de xadrez normalmente olham para frente a cada movimento possível em alguma profundidade especificada e, em seguida, tentam pontuar o tabuleiro nesse ponto (às vezes expandindo certos ramos mais longe, olhando na metade de uma troca ou algo semelhante, pode produzir uma percepção muito distorcida.) Desde a profundidade máxima real Se 17695 fizer meio movimento, a pesquisa é exaustiva; ela percorre todos os jogos de xadrez possíveis. Como todos os jogos terminam, não há como tentar decidir qual a posição de cada tabuleiro (e, portanto, não há razão para analisar a lógica de avaliação do tabuleiro - nunca será chamada), o resultado é uma vitória, uma perda ou um desenho. Se o resultado é um empate, o jogo é justo, se o resultado não é um empate, é um jogo injusto. Para expandir um pouco, temos:
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);
}
}
Observe também que será praticamente impossível para o compilador perceber que Chessboard.Score () é um código morto. O conhecimento das regras do xadrez nos permite descobrir isso, mas para entender isso, você precisa saber que o MakeMove nunca pode aumentar a contagem de peças e que Chessboard.Draw () retornará verdadeiro se a contagem de peças permanecer estática por muito tempo. .
Observe que a profundidade da pesquisa está em meio movimento, não em movimentos inteiros. Isso é normal para esse tipo de rotina de IA, pois é uma rotina O (x ^ n) - adicionar mais uma folha de pesquisa tem um efeito importante sobre quanto tempo leva para ser executado.