为了账号安全,请及时绑定邮箱和手机立即绑定

优化打乱的数组——我需要遍历整个数组吗?

优化打乱的数组——我需要遍历整个数组吗?

PHP
蝴蝶刀刀 2023-04-21 16:58:23
我会尽力解释我的问题。我正在尝试在 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 functionfunction check_move($nr) {    if ($nr == 5 || $nr == 6) {        return true;    }    return false;}如果我说我会从一开始就生成有效的移动(基于下面的评论)$valid_moves = [5,6];跳出循环的最佳方法是什么?
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

在正常情况下,您可能遇到的最大有效移动数约为 100。随着升级,它可能会更高一些,所以如果您有 9 个皇后,您可能会达到 200。不过,1000 还是太大了。

生成有效动作列表应该意味着您甚至不需要检查它们是否有效。但是,我想你正在生成所有组合的列表,即使它们涉及通过另一块,用你自己的块落在一个正方形上,或者落在棋盘域之外。

我会说,在你的第一代做这些检查:

  • 对于每个棋子,检查 4 种可能的移动并存储有效的移动

  • 对于每个城堡或主教,按顺序检查 14 个可能的位置,从棋子位置开始,向 4 个方向前进,直到你击中一个无效空间(击中你自己的棋子意味着你走得太远了。击中对手棋子意味着你'我打了最后一个)

  • 对于皇后,与城堡或主教相同,但有 8 个方向而不是 4 个

  • 对于骑士,检查 8 种可能的动作是否有效

  • 对于国王,检查 8 种可能的移动是否有效

  • 检查两个城堡移动中的任何一个是否可行

对于每一步,您还需要确保它不会让您受制于人。该功能可能可以优化,因此您只能从国王的位置向外看。

一旦你遍历了所有棋子,最多 16 个,你的动作列表应该只包含有效的动作。

事情变得昂贵的地方是你的前瞻性。您想模拟未来的多少步?你如何衡量每一步的价值/风险?

然后是简介。您需要一个好的采样分析器来优化和找到您的热点。注意昂贵的便利功能,如有in_array可能请避免使用。循环中的循环会降低性能。


查看完整回答
反对 回复 2023-04-21
  • 1 回答
  • 0 关注
  • 62 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信