php loop перевернуть монету до 2 голов, затем остановить - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в php и пытаюсь написать цикл, который будет подбрасывать монету, пока ровно две головы не будут подброшены, а затем остановлен.

Пока что я написал функцию для подбрасывания монет:

function cointoss () {
    $cointoss = mt_rand(0,1);
    $headsimg = '<img src=""/>';
    $tailsimg = '<img src=""/>';
    if ($cointoss == 1){
        print $headsimg;
    } else {
        print $tailsimg;
    } 
    return $cointoss;
}

... но застрял при написании цикла.Я пробовал несколько способов:

#this code takes forever to load
$twoheads = 0;
for ($twoheads = 1 ; $twoheads <= 20; $twoheads++) {
    $cointoss = mt_rand(0,1);
    cointoss ();
    if ($cointoss == 1) { 
        do {
        cointoss ();
    } while ($cointoss == 1);

    }
}

#one coin flips 
do {
    cointoss ();
} while ($cointoss == 1);

Это для класса, и мы еще не изучили массивы, поэтому мне нужно выполнить это без них.

Я понимаю концепцию циклов, выполняющих код, когда условие истинно, но не понимаю, как писать, когда условие больше не истинно.

1 Ответ

0 голосов
/ 20 февраля 2019

Печать из «функций обработки» - плохая привычка.Вы можете объявить функцию showCoin($toss) для печати.По правде говоря, я не знаю, буду ли я беспокоиться о каких-либо пользовательских функциях.

Вам необходимо объявить переменную, которая будет содержать значение return из вашей функции.

Путем сохранениятекущие и предыдущие значения броска, вы можете написать простую проверку, если произошли две последовательные "головы".

Код: ( Демо )

function cointoss () {
    return mt_rand(0,1);  // return zero or one
}

$previous_toss = null;
$toss = null;
do {
    if ($toss !== null) {  // only store a new "previous_toss" if not the first iteration
        $previous_toss = $toss;  // store last ieration's value
    }
    $toss = cointoss();  // get current iteration's value
    echo ($toss ? '<img src="heads.jpg"/>' : '<img src="tails.jpg"/>') , "\n";
    //    ^^^^^- if a non-zero/non-falsey value, it is heads, else tails
} while ($previous_toss + $toss != 2);
//       ^^^^^^^^^^^^^^^^^^^^^^- if 1 + 1 then 2 breaks the loop

Возможный вывод:

<img src="heads.jpg"/>
<img src="tails.jpg"/>
<img src="tails.jpg"/>
<img src="tails.jpg"/>
<img src="heads.jpg"/>
<img src="heads.jpg"/>
...