我将尝试解释我的问题。我正在尝试用PHP创建一个Chessengine(只是为了好玩:-))代码中的整数只是返回有效的移动(为简单起见-在实际代码中,它是对象和运动方式,取决于所涉及的部分)
[我正在寻找一种有效搜索数组的方法。实际上,我的意思是尽可能快。在下面的代码中查看我的注释:“是否可以不通过所有1000个值而退出循环?”我希望这些评论能解释我想要实现的目标。我只是在寻找可以优化以下代码的想法,而不是完整的代码:-)
//This is for demonstrating
//1000 values to go through
$moves_maybe_valid = range(1,1000);
shuffle($moves_maybe_valid);
//Go through possible values
$move_checked = [];
$nr=0;
foreach($moves_maybe_valid as $mmv) {
$move_is_valid = check_move($mmv);
//Check if not in checked array
if ($move_is_valid === false && !in_array($mmv, $move_checked)) {
//Add to checked move array
$move_checked[] = $mmv;
}
//IS it possible to break out of loop without
//going through all 1000 values?
//When all valid moves are true I want to break here
//but I don't know when that is.
}
//for demonstration purpose only
//numbers (5,6) that returns true are unknown until an
//an actual check is done in this function
function check_move($nr) {
if ($nr == 5 || $nr == 6) {
return true;
}
return false;
}
如果我说我将从一开始就产生有效的举动(基于以下评论)
$valid_moves = [5,6];
从循环中跳出来的最佳方法是什么?
[在正常情况下,您可能会遇到的有效举动的最大数量约为100。如果晋升,则可能会更高一些,因此,如果您有9个皇后,则可能达到200个。但是,1000个太大了。
生成有效动作列表应该意味着您甚至不需要检查它们是否有效。但是,我想您正在生成所有组合的列表,即使它们涉及传递另一个作品,以您自己的作品降落在正方形上或降落在板级区域之外。
我想说,在您的第一代做那些检查:
对于每个棋子,检查4种可能的动作并存储有效的动作
对于每个城堡或主教,依次检查14个可能的在棋子位置,沿4个方向前进,直到您击中一个无效的空间(击中自己的棋子意味着您走得太远了。击中对手意味着您已经击中了最后一个)
对于每一步,您还需要确保它不会使您受阻。该功能可能已经过优化,因此您只能从国王的位置看。
一旦遍历所有片段,最多16个,则动作列表应仅包含有效动作。
事情变得昂贵的地方就是你的未来。您想模拟未来的几步走势?您如何衡量每一步的价值/风险?
然后配置文件。您需要一个好的采样分析器来优化和找到您的热点。请注意昂贵的便利功能,例如in_array
,请尽量避免使用。循环会降低性能。