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

时间:2012-02-22 02:57:12

标签: php

我最近用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循环以使其更类似但更快?我知道这个循环是问题所在,我没试过它并且工作正常,但我不知道这张卡已经在某人的手上了。

我希望有人可以帮助我,我们非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您的直接问题是$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);
}

这模仿了你在真实游戏中所做的真正的洗牌和分发。