PHP-使用do while循环的更快方法


PHP - Faster way to use a do-while loop

我最近开始了一个PHP小项目,我对此有点陌生,这可能是一个初学者的问题,但我找不到任何帮助,所以我在这里问。

我正在做一个纸牌游戏,我想给六个玩家随机的牌。我存储每个人在$cardstoget中获得的卡数,以及$player中有多少玩家。我有一个数组$usedcards,其值类似[0]=>0,[1]=>0等等。我通过将其设置为1而不是0来确定该卡是否已被使用,如下所示:[1]=>1。有80张卡片,我计划用剩下的未使用的卡片数量填写[0]。

我使用这个代码:

for ($i = 1;$i <= $player;$i++) {
 for ($i2 = $cardstoget;$i2 > 0;$i2--) {
  do {
   $temp = mt_rand(1,80);
  } while ($usedcards[$temp] = 1);
  ${"cards".$i} = ${"cards".$i} . $temp;
  $usedcards[$temp] = 1;
 }
}

当我执行代码时,我会收到以下错误消息:

Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/create.php on line 47

现在我的问题是:我如何改变do-while循环,使其变成类似但更快的循环?我知道这个循环是个问题,我试过没有,效果很好,但我不知道这张卡已经在别人手里了。

我希望有人能帮助我,任何帮助都将不胜感激。

您的直接问题是$usedcards[$temp] = 1条件。您在这里分配1,这导致条件始终为true,并且循环无休止地循环。

更普遍地说,你会想要一个确定性的算法,而不是一个其完成取决于随机性的算法。类似于:

$cards = range(1, 80);
shuffle($cards);
for ($i = 0; $i < $cardsPerPlayer; $i++) {
    foreach ($players as &$player) {
        $player['cards'][] = array_shift($cards);
    }
    unset($player);
}

这就像你在真实游戏中所做的那样,模仿了真实的洗牌和分配牌。