4

フラッシュ カードの配列があり、シャッフルを使用して、5 つの異なるカテゴリにそれぞれ 3 つずつ、15 の一意のカードを出力しています。

私がやりたいのは、これらのカード セットを同じ Web ページで約 12 人用に作成することですが、完全なセットごとに一意であり、特定のセットから繰り返されないようにする方法がわかりません。他のユーザーに。

簡単な説明を含む短いコード サンプルが最も役に立ちます。

必要に応じて変更したコードを次に示します。本当にあまり変わっていません。

<?php
/* original source:
 * 3d10-engine.php
 * by Duane Brien
 */

if (empty($_POST)) {
for ($i = 1; $i < 16; $i++) {
    $numbers['ALL'][] = $i;
}

$picks = array();


$letters = array ('ALL');
foreach ($letters as $letter) {
    for ($i = 0;$i < 10;$i++) {
        shuffle($numbers[$letter]);
        $chunks = array_chunk($numbers[$letter], 5);
        $cards[$i][$letter] = $chunks[0];
        if ($letter == 'N') {
            $cards[$i][$letter][2] = '  '; // Free Space
        }

    }
    foreach ($numbers[$letter] as $number) {
        $balls[] = $letter.$number;
    }
    shuffle($balls);
}

$cardsstr = serialize($cards);
$ballsstr = serialize($balls);
$picksstr = serialize($picks);

} else {
$cards = unserialize($_POST['cardsstr']);
$balls = unserialize($_POST['ballsstr']);
$picks = unserialize($_POST['picksstr']);
array_unshift($picks, array_shift($balls));

echo "<h1>Just Picked: " . $picks[0] . "</h1>";

$cardsstr = serialize($cards);
$ballsstr = serialize($balls);
$picksstr = serialize($picks);
}

?>
Picks : <?php echo implode(',', $picks) ?>
<form method='post'>
<input type='hidden' name='cardsstr' value='<?php echo $cardsstr ?>' />
<input type='hidden' name='ballsstr' value='<?php echo $ballsstr ?>' />
<input type='hidden' name='picksstr' value='<?php echo $picksstr ?>' />
<input type='submit' name='cards' value='next number' />
</form>
<a href="3d10-engine.php">Start Over</a>
<?php

foreach ($cards as $card) {
echo "<table border='1'>";
echo "<tr><td>A</td><td>B</td><td>C</td><td>D</td><td>E</td></tr>";
for ($i = 0; $i < 5; $i++) {
    echo "<tr><td>" . $card['B'][$i] . "</td><td>" .$card['I'][$i]  . "</td><td>" . $card['N'][$i] . "</td>";
    echo "<td>" . $card['G'][$i] . "</td><td>" . $card['O'][$i] . "</td></tr>";
}
echo "</table>";
}

?>
4

2 に答える 2

3

各セットにはより多くのオプションがあるため、ランダムに選択するだけで独自の最終結果を得ることができます。つまり、これをこれ以上複雑にしないでください。

このサンプルを試す

<?php
//Initialize your 5 sets here
$numbers['B'] = range(1,15);
$numbers['I'] = range(16,30);
$numbers['N'] = range(31,45);
$numbers['G'] = range(45,60);
$numbers['O'] = range(61,75);

//My Assumption is you to pick 3 from each 

while(TRUE){
 $rand = rand(0,5);
 if(count($numbers_B) < 3 && !in_array($numbers['B'][$rand]){
   $numbers_B[] = $numbers['B'][$rand];
 }

 $rand = rand(0,5);
 if(count($numbers_I) < 3 && !in_array($numbers['I'][$rand]){
   $numbers_I[] = $numbers['I'][$rand];
 }
 $rand = rand(0,5);
 if(count($numbers_N) < 3 && !in_array($numbers['N'][$rand]){
   $numbers_N[] = $numbers['N'][$rand];
 }
 $rand = rand(0,5);
 if(count($numbers_G) < 3 && !in_array($numbers['G'][$rand]){
   $numbers_G[] = $numbers['G'][$rand];
 }
 $rand = rand(0,5);
 if(count($numbers_O) < 3 && !in_array($numbers['O'][$rand]){
   $numbers_O[] = $numbers['O'][$rand];
 }

if( count($numbers_B) == 3 && count($numbers_I) == 3 && count($numbers_N) == 3 && 

count($numbers_G) == 3 && count($numbers_O) == 3 ){
  break;
 }
    }
    $result = $numbers_B + $numbers_I + $numbers_N + $numbers_G + $numbers_O; ?>

ここで $result 値は一意である必要があり、セット数は一定であると考えています。動的な場合は、2 次元配列で同じロジックを試してください。

于 2013-01-02T14:26:06.397 に答える
0

準備されたセットを配列に格納し、既に (in_array 関数) を使用して配列に存在するかどうかを各シャッフルで確認し、存在する場合は再度シャッフルします。

于 2013-01-02T13:29:47.673 に答える