我最近用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循环以使其更类似但更快?我知道这个循环是问题所在,我没试过它并且工作正常,但我不知道这张卡已经在某人的手上了。
我希望有人可以帮助我,我们非常感谢任何帮助。
答案 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);
}
这模仿了你在真实游戏中所做的真正的洗牌和分发。