Avatar billede henninghabor Nybegynder
30. juli 2004 - 00:04 Der er 12 kommentarer og
1 løsning

Bingo - Træk nye numre, der ikke er gemt i cookie

Hej,

Jeg prøver at lave et bingo system, men jeg er stødt på grund.

Jeg har lavet en funktion, der opdateres hvert 3. sekund. Denne vælger ved hver opdatering et nyt nummer. Herefter sammenligner den med de tal der er gemt i en cookie.

Jeg troede at jeg havde fundet guld, men desværre viste det sig at den, efterhånden som den havde trukket flere tal, efterlod et tomt felt hyppigere og hyppigere.

Dette kan jeg godt forstå, men hvordan får man den så til at finde et nyt tal, der ikke allerede er trukket, med det samme?

$new = mt_rand(1,90);

$numbers = split(",",$_COOKIE[numbers]);

for($i = 0;$i < 90;$i++)
{
    if($new == $numbers[$i])
    {
        $numbers[$i] = "<strong>$new</strong>";

        echo "<h2>$new</h2>";
    }
}

for($i = 0;$i < 90;$i++)
{
    $all .= $numbers[$i] . ",";
}
Avatar billede googolplex Novice
30. juli 2004 - 00:13 #1
Har du kigget på: http://dk.php.net/manual/en/function.array-rand.php

Så kan du jo bruge unset() til at fjerne de elementer (numre) fra dit array, som allerede er taget.
Avatar billede googolplex Novice
30. juli 2004 - 00:25 #2
$new = array_rand($numbers_left);
$numbers_taken[] = $numbers_left[$new];
unset($numbers_left[$new]);

print_r($number_taken);
print_r($numbers_left);

Eller noget i den retning :)
Avatar billede googolplex Novice
30. juli 2004 - 00:26 #3
Hov, der var lige en slåfejl :)

$new = array_rand($numbers_left);
$numbers_taken[] = $numbers_left[$new];
unset($numbers_left[$new]);

print_r($numbers_taken);
print_r($numbers_left);
Avatar billede henninghabor Nybegynder
30. juli 2004 - 01:11 #4
Hej googolplex,

Jeg takker mange gange for dine bidrag og ideer og det har også åbnet mine øjne for hvordan det skal gøres.

Men jeg kan ikke finde ud af dit svar kl. 00:26:35 d. 30/07-2004.

Hvor får jeg værdierne fra?

Jeg har prøvet lidt, men det henter også de værdier, der allerede er blevet sat før:

$numbers = split(",",$_COOKIE[numbers]);

$new = array_rand($numbers);

for($i = 0;$i < 90;$i++)
{
    if($numbers[$i] == $new)
    {
        echo "<h2>$new</h2>\n";

        unset($numbers[$i]);
    }
}

Jeg håber at du kan hjælpe mig mere... Jeg vil gerne gi' dig flere points, hvis du har lyst...
Avatar billede googolplex Novice
30. juli 2004 - 01:38 #5
Hvis du fortæller mig præcist hvad du vil have dit script til at gøre, skal jeg strikke noget sammen i morgen, er lidt for træt nu Zzzzz...
Avatar billede henninghabor Nybegynder
30. juli 2004 - 01:54 #6
Jeg har 90 tal fra 1-90.

Fra disse tal skal der trækkes et ukendt antal tal og tallene må ikke gå igen.

Dvs. at ideen med at bruge unset() var kanon.

Men efter at have prøvet unset(), fandt jeg ud af at selvom en position (F. eks. 33 der indeholdte nummeret 34) alligevel kunne hentes.

Skal jeg prøve at ligge det hele på nettet, så du kan se i praksis hvad jeg vil?
Avatar billede henninghabor Nybegynder
30. juli 2004 - 01:57 #7
Har lagt det på nettet her: http://www.sporge-jorgen.dk/bingo.php
Avatar billede henninghabor Nybegynder
30. juli 2004 - 01:59 #8
Som du kan se bliver et tal, der allerede er blevet unset een gang, alligevel vist.
Avatar billede googolplex Novice
30. juli 2004 - 02:20 #9
Jeg har lagt mit eksempel på 'http://googolplex.dk/bingo.php':

<?php

$numbers_left = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

for($i = 1; $i <= 5; $i++)
{
    $new = array_rand($numbers_left);
    $numbers_taken[] = $numbers_left[$new];
    unset($numbers_left[$new]);
}

echo '<p>Numbers taken:</p>';
foreach($numbers_taken as $value)
{
    echo $value . '<br />';
}
echo '<p>Numbers left:</p>';
foreach($numbers_left as $value)
{
    echo $value . '<br />';
}

?>

Som du kan se virker det perfekt, så du må have lavet en fejl et sted...kigger på det i morgen :)
Avatar billede Slettet bruger
30. juli 2004 - 03:09 #10
I stedet for at lave en det ene tilfældige tal efter det andet, kan du lave et array med alle tallene, blande det, og derefter bruge tallene i den rækkefølge, de ligger i.


bingo.php

<?php
session_start();

if (!isset($_SESSION['bingotal'])){
  $bingotal=range(1,90); // laver et array med tallene 1-90
  shuffle($bingotal); // Så er de blandet.
  $_SESSION['bingotal']=$bingotal;
  $_SESSION['nu']=0;
} else {
  $_SESSION['nu']++;
}
echo "<p>Nyt tal: " . $_SESSION['bingotal'][$_SESSION['nu']] . "</p>";

echo "<p>Brugte tal:<br />";
if($_SESSION['nu']>0){
  echo implode(', ', array_slice($_SESSION['bingotal'],0,$_SESSION['nu']));
}
echo "</p>";
?>
?>
Avatar billede henninghabor Nybegynder
30. juli 2004 - 09:25 #11
Hej googolplex og sandbox,

Mange tak for jeres hjælp - Det har været helt overvældende at I gad...

Sandbox: Jeg har oprettet et spørgsmål med point til dig i Fri Debat.

Tak
Avatar billede henninghabor Nybegynder
30. juli 2004 - 09:26 #12
Hov, jeg glemte selvfølgelig lige at skrive hvilken løsning, jeg valgte... Det var en ombygning af sandbox's løsning, jeg endte med at bruge.
Avatar billede henninghabor Nybegynder
30. juli 2004 - 09:28 #13
sandbox>>Points er her: http://www.eksperten.dk/spm/524666
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester