优化混排数组-我需要遍历整个数组吗?

问题描述 投票:0回答:1

我将尝试解释我的问题。我正在尝试用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];

从循环中跳出来的最佳方法是什么?

php performance random
1个回答
0
投票

[在正常情况下,您可能会遇到的有效举动的最大数量约为100。如果晋升,则可能会更高一些,因此,如果您有9个皇后,则可能达到200个。但是,1000个太大了。

生成有效动作列表应该意味着您甚至不需要检查它们是否有效。但是,我想您正在生成所有组合的列表,即使它们涉及传递另一个作品,以您自己的作品降落在正方形上或降落在板级区域之外。

我想说,在您的第一代做那些检查:

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

  • 对于每个城堡或主教,依次检查14个可能的在棋子位置,沿4个方向前进,直到您击中一个无效的空间(击中自己的棋子意味着您走得太远了。击中对手意味着您已经击中了最后一个)

  • 对于皇后区,与城堡或主教相同,但8个方向而不是4个方向>>
  • 对于骑士,请检查八种可能的动作是否有效
  • 对于国王,请检查8可能的动作以确保有效性
  • 检查两个城堡是否移动有可能
  • 对于每一步,您还需要确保它不会使您受阻。该功能可能已经过优化,因此您只能从国王的位置看。

    一旦遍历所有片段,最多16个,则动作列表应仅包含有效动作。

    事情变得昂贵的地方就是你的未来。您想模拟未来的几步走势?您如何衡量每一步的价值/风险?

然后配置文件。您需要一个好的采样分析器来优化和找到您的热点。请注意昂贵的便利功能,例如in_array,请尽量避免使用。循环会降低性能。

© www.soinside.com 2019 - 2024. All rights reserved.