2

プレイヤーに 5 枚のカードを配り、スコアを付けようとしています。私のスコアリング プログラムは正常に動作しているようですが、時々カードが重複して配られるという問題に直面しています。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\">");

}
4

3 に答える 3

6

カードごとに 1 つずつ、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;

これにより、重複が防止されます。

編集: スーツとランクが逆でした。それらは今正しいはずです。

于 2013-03-24T19:10:07.520 に答える
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\">");
    }
}
于 2013-03-24T19:15:13.557 に答える
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\">");
}
于 2013-03-24T19:57:52.773 に答える