【问题标题】:How to remove duplicate playing cards from player's hand?如何从玩家手中删除重复的扑克牌?
【发布时间】:2013-03-14 05:12:08
【问题描述】:

我正在尝试将一手五张牌发给玩家并对其进行评分。我的计分程序似乎运行良好,但我不时遇到重复卡牌的问题。我尝试使用 while 循环来检查重复的卡片,但这似乎有点骇人听闻。我的代码如下。请记住,我绝对是新手,所以解决方案越简单越好!非常感谢。

// 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\">");

}

【问题讨论】:

  • 删除重复项?您可以使用array_unique
  • 顺便说一句,你可以使用$faces = range(1,13); 节省13行:)
  • 如果你能使用答案,你能接受吗?

标签: php arrays loops


【解决方案1】:

我肯定会像这样创建一个包含所有 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\">");
}

【讨论】:

    【解决方案2】:

    简单地设置一个包含 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;
    

    这将防止重复。

    编辑:西装和等级被颠倒了。他们现在应该是正确的。

    【讨论】:

    • 我认为你的西装和排名颠倒了。
    • 为什么我做到了。谢谢你,@BrianCain
    • 我会这样做。创建一个虚拟套牌并将其分配给一个数组,并在与玩家交易时从数组中弹出。
    【解决方案3】:

    因为你说你喜欢它简单,你可以用 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\">");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 2013-05-12
      • 2016-03-01
      相关资源
      最近更新 更多