我会尽力解释我的问题。我试图在PHP中创建一个棋子引擎(只是为了好玩:-)代码中的整数只返回有效的移动(为了简单--在实际代码中,它是对象和运动模式,取决于它的内容)
,我在寻找一种有效搜索数组的方法,的意思是尽可能快。请看我在下面代码中的注释:“不需要遍历所有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];从循环中挣脱出来的最好方法是什么?
发布于 2020-05-30 22:39:44
在正常情况下,您可能遇到的有效移动的最大数量大约为100次。如果你有9位女王,你可能会得到200英镑。不过,1000还是太大了。
生成有效的移动列表应该意味着您甚至不需要检查它们是否有效。但是,我想你正在生成一个所有组合的列表,即使它们涉及到传递另一个部分、用自己的部分在正方形上着陆,或者在板域之外着陆。
我想说,在你的第一代做那些检查:
对于每一步,你也需要确保它不会让你受到控制。这个特性可能会被优化,所以你只能从国王的位置看出来。
一旦你通过所有的部分,最多为16,你的移动列表应该只包含有效的移动。
事情变得昂贵的地方是你的前瞻。你想要模拟多少个未来?你如何衡量每一个移动的价值/风险?
那就做侧写。你需要一个良好的取样剖析器来优化和找到你的热点。注意昂贵的便利功能,如in_array,并尽量避免。循环中的循环会降低性能。
https://stackoverflow.com/questions/62109065
复制相似问题