我正试图向玩家交出五张牌并对其进行评分。我的得分程序似乎工作正常,但我遇到了不时被处理的重复卡问题。我尝试使用while循环来检查重复的卡片,但这看起来有点像hackish。我的代码如下。请记住,我绝对是新手,所以解决方案越简单越好!非常感谢。
// create suits array
$suits = array("996", "997", "998", "999");
// create faces array
$faces = array();
$faces[1] = "1";
$faces[2] = "2";
$faces[3] = "3";
$faces[4] = "4";
$faces[5] = "5";
$faces[6] = "6";
$faces[7] = "7";
$faces[8] = "8";
$faces[9] = "9";
$faces[10] = "10";
$faces[11] = "11";
$faces[12] = "12";
$faces[13] = "13";
// create player's hand
$card = array();
for ($i = 0; $i < 5; $i++)
{
$face_value = shuffle($faces);
$suit_value = shuffle($suits);
$card[$i] = $faces[$face_value].$suits[$suit_value];
$counter = 0;
while ($counter < 100)
{
if (in_array($card[$i], $card))
{
$face_value = shuffle($faces);
$suit_value = shuffle($suits);
$card[$i] = $faces[$face_value].$suits[$suit_value];
}
$counter++;
}
print ("<img src=\"../images/4/$card[$i].gif\">");
}
答案 0 :(得分:6)
简单地设置一个包含52个元素的数组可能会更有效,每个卡都有一个元素。
$cards = range(0,51);
shuffle($cards);
$hand = array();
for ($i = 0; $i < 5; $i++)
{
$hand[$i] = $cards[$i];
}
请注意,您可以通过
简单地提取卡片$i
的套装和等级
$suit = $hand[$i] % 4;
$rank = $hand[$i] / 4;
这样可以防止重复。
编辑:套装和等级被颠倒了。他们现在应该是正确的。
答案 1 :(得分:1)
因为你说你很喜欢它,你可以使用range()创建数组。
为避免获得双手,请在分配新牌之前检查$ card数组。
新代码如下:
// create suits array
$suits = range(996, 999);
// create faces array
$faces = range(0, 13);
// create player's hand
$card = array();
while ( count($card) < 5 )
{
$face_value = shuffle($faces);
$suit_value = shuffle($suits);
$newcard = $faces[$face_value].$suits[$suit_value];
if ( in_array($card, $newcard) ) {
$card[] = $newcard;
print ("<img src=\"../images/4/$newcard.gif\">");
}
}
答案 2 :(得分:0)
我肯定会创建一个包含所有52张牌的牌组,如下所示:
// create suits array
$suits = range(996, 999);
// create entire deck
$deck = range(0, 51);
shuffle($deck);
// create player's hand
for ($i = 0; $i < 5; $i++) {
$suit_value = $suits[$deck[$i] % 4];
$face_value = floor($deck[$i] / 4) + 1;
print ("<img src=\"../images/4/{$face_value}{$suit_value}.gif\">");
}