hariç daha önce tamsayı randomize, ve onsuz yine rastgele

6 Cevap
<?php
        if (isset($_POST['Roll!'])) {
                    $sides = $_POST['sides'];
                    $rolled = rand(1,$sides);

                    echo "$rolled was rolled by the dice, it is now out!";
        }
?>

Bu benim şu anda sahip kodudur. Bu sayı haddeleme sonra, ancak, ben kazanan numara olurdu, biri dışında tüm dizi haddelenmiş kadar, ama daha önce haddelenmiş numarası olmadan, tekrar rulo istiyorum. Ben bunu yaparken hakkında gitmek için nasıl hiçbir fikrim yok. Herhangi bir fikir?

EDIT: Ben daha net üzgün olmalıydı ediyorum, ben de her sayı gibi, rulo yankı gerek bugüne kadar yardım için hepinize teşekkür ederim, ama

echo "$rolledArray[0] was rolled, it lost.\n";
echo "$rolledArray[1] was rolled, it lost.\n";
echo "$rolledArray[2] was rolled, it lost.\n";
echo "$rolledArray[3] was rolled, it lost.\n";
echo "$rolledArray[x] was rolled, it lost.\n";
echo "$rolledArray[x] was rolled, it lost.\n";
echo "$rolledArray[50?] was rolled, it lost.";

Yeniden düzenleme: Ayrıca ben sadece onları Rulo tıklayın istiyorum! Ben yanlış olabilir ama bir kez, birden çok kez değil, onlar oturum için gerek anlam, tüm sayıları haddelenmiş ettik kadar, sanırım, size en açık benden daha tecrübeli.

Üzgünüm, ben de daha önce belirtilen olmalıdır.

6 Cevap

To answer your direct question: You can put all of the possible numbers into an array, and get a random index for that array. Once you have an index, remove the item from the array and redo the random over the smaller array:

$possible = range(1, $_POST['sides']);     // build the possible values
$rolledIndex = rand (0, count($possible)); // get a random index
$rolled = $possible[$rolledIndex];         // get the rolled number

unset($possible[$rolledIndex]);            // and remove the rolled nuber

// now you can simply redo the random:
$rolledIndex = rand (0, count($possible)); // get a random index on the smaller array
$rolled = $possible[$rolledIndex];         // get the 2nd rolled number

Eğer atar zar üzerinde rastgele bir düzen olmasını istiyorsanız However, sadece bu kullanın:

// generate an array with all values from 1 to the posted value (e.g. 1,2,3,4,5,6)
$possible = range(1, $_POST['sides']);  

// this reorders the array by random (e.g. 4,3,1,5,2,6)
$throwOrder = $possible;
shuffle($throwOrder); 
print_r($throwOrder);

Artık sadece $throwOrder dizi üzerinden yineleme ve zar rastgele bir sipariş atar olabilir:

Array (
    0 => 4,
    1 => 3,
    2 => 1,
    3 => 5,
    4 => 2,
    5 => 6
)

Edit İkinci yöntemde istenen çıktı almak için, sadece bu yapın:

// get the last index of the array of thrown dices
$lastIndex = count($throwOrder)-1;
// iterate through the array, printing the results
foreach ($throwOrder as $key => $rolled) {
    // check if the current key matches the last key in the array
    if ($key != $lastIndex) {
        // if not, the number has lost
        echo $rolled, " was rolled, it lost.\n";
    } else {
        // we have reached the last element of the array
        echo $rolled, " was the last, it won.\n";
    }
}

Ben daha önce atılan her sayıda tutan bir dizi $thrownNumbers, olması gerekir düşünüyorum. Bu dizide ise ve her yeni atmak (OMG. .. kelime), kontrol. Evet, tekrar atmak. Olası en basit çözüm.

Edit: başka bir sayfaya taşıma sırasında dizi tutmak için olduğu gibi, kullanabilirsiniz:

  • $ _SESSION
  • çerezleri (hm)
  • şeklinde gizli bir değer olarak tefrika dizi var

Orada.

Sen ileti / isteği arasında onu izlemek veya URL bunu eklemek için $ _SESSION atmak ve kendinize bir URI param olarak her zaman iletebilirsiniz.

<?php
if(!isset($_SESSION['numbers']){
 $_SESSION['numbers'] = range(1,6); //same as array(1,2,3,4,5,6)
}
$numbers = $_SESSION['numbers'];

if(count($numbers)>1){ //is more than one number left
 $rand_index = array_rand($numbers); //choose a number from an array, returns the index
 print('you rolled '.$numbers[$rand_index].' loser'); // tell them they lost
 unset($numbers[$rand_index]); //remove that element from the array
 $_SESSION['numbers'] = $numbers; //set new array back to session
}else{
 print(array_pop($numbers).' is the winner!'); //pop the remaining number out of the array and print it with winner notification
}
?>

edit: oturumu kullanım güncellendi

Eğer doğru kullanırsanız URL eklemek için kötü bir fikir değildir. Iyi tarafı oturumunda veri depolamak kalmamasıdır, kötü tarafı isteği her zaman daha büyük olmasıdır. Kullanabilirsiniz oynanmasını önlemek için:

$url = 'numbers.php?throwed='.implode(',',$throwed).'&sign='.sha1(serialize($throwed).'mysecretpassword');

Ve onay almak için kullanabilirsiniz:

$throwed = explode(',',$_GET['throwed']);
$not_tampered = sha1(serialize($throwed).'mysecretpassword') == $_GET['sign'];

Sadece olası tüm sayılar bir dizi (veya listenin diğer tip) oluşturmak ve rastgele sipariş. Eğer son ama birine almak kadar, sonra yerine yeni bir numara her zaman toplama sadece dizi ilerlemek.

Alternatif olarak, sadece düz listedeki son numaraya gidebiliriz ve bu kazananı.