我最近开始了一个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);
}
这就像你在真实游戏中所做的那样,模仿了真实的洗牌和分配牌。