Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Proste Lotto - problemy
Forum PHP.pl > Forum > PHP
DestiX
Witam, potrzebuje zrobić skrypt php, który będzie miał za zadanie wylosować 6 liczb i porównać z liczbami podanymi przez użytkownika a na koniec będzie musial wyświetlić ile liczb zostało trafionych. Coś tam mi się udało napisać ale niestety nie działa, nie mam pojęcia w czym jest błąd dlatego też piszę tutaj.

Oto ten skrypcik:
  1. <html>
  2. <head>
  3. <title>Lotto</title>
  4. </head>
  5. <body>
  6. <form>
  7. 1: <input type=text name="a"/><br />
  8. 2: <input type=text name="b"/><br />
  9. 3: <input type=text name="c"/><br />
  10. 4: <input type=text name="d"/><br />
  11. 5: <input type=text name="e"/><br />
  12. 6: <input type=text name="f"/><br />
  13. <input type=submit name=losowanie value="Losuj"/>
  14. </form>
  15.  
  16. Trafione: <br />
  17. <?php switch($_GET['losowanie'])
  18. {
  19. case "Losuj":
  20. for($i=1; $i<=6; $i++)
  21. {
  22. $los[i] = rand(1,49);
  23. echo $los;
  24. }
  25. break;
  26. default:
  27. break;
  28. }
  29. for($x=1; $x<=6; $x++)
  30. {
  31. if ($_GET['a'] == $los[i])
  32. $wynik=$wynik+1;
  33. elseif ($_GET['b'] == $los[i])
  34. $wynik=$wynik+1;
  35. elseif ($_GET['c'] == $los[i])
  36. $wynik=$wynik+1;
  37. elseif ($_GET['d'] == $los[i])
  38. $wynik=$wynik+1;
  39. elseif ($_GET['e'] == $los[i])
  40. $wynik=$wynik+1;
  41. elseif ($_GET['f'] == $los[i])
  42. $wynik=$wynik+1;
  43. break;
  44. }
  45. echo $wynik;
  46. ?>
  47. </body>
  48. </html>


Będę wdzięczny, jeżeli komuś uda się to poprawić, dodatkowo dodam, że lekcje php zacząłem niedawno dlatego też ten skrypt jest napisany w bardzo prymitywny sposób tongue.gif.

Pozdrawiam.
Crozin
Włącz raportowanie błędów, a zobaczysz, że problem jest ze zmienną $i, a raczej stałą "i", której przypadkiem używasz.
Mayka
Moim zdaniem to troche nie tak zrobione, bo w drugiej petli masz $los[i] a to "i" to skąd niby ma być ? I tak jak napisał kolega musisz mieć $i a nie samo i bo to bedzie traktowane jako stała i tymsamym zwraca bzdury.
I raporotwanie błędów tu nic nie da..
Dam Ci gotowca a co mam dobry dzień biggrin.gif
  1. $los = Array();
  2. switch($_GET['losowanie'])
  3. {
  4. case "Losuj":
  5. echo"Wylosowane: ";
  6. for($i=1; $i<=6; $i++)
  7. {
  8. $los[$i] = rand(1,10);
  9. echo $los[$i].'<br>';
  10. }
  11. foreach($los as $val)
  12. {
  13. if ($_GET['a'] == $val)
  14. $wynik=$wynik+1;
  15. elseif ($_GET['b'] == $val)
  16. $wynik=$wynik+1;
  17. elseif ($_GET['c'] == $val)
  18. $wynik=$wynik+1;
  19. elseif ($_GET['d'] == $val)
  20. $wynik=$wynik+1;
  21. elseif ($_GET['e'] == $val)
  22. $wynik=$wynik+1;
  23. elseif ($_GET['f'] == $val)
  24. $wynik=$wynik+1;
  25. }
  26. break;
  27. default:
  28. break;
  29. }
  30. echo '<br> Trafione: '.$wynik;


A no i czemu ta druga petla for (foreach) jest poza tym switchem.. tez nie wiem.. wink.gif
DestiX
Wszystko fajnie śmiga, dzięki wielkie za pomoc smile.gif

A jeszcze mam jedno pytanie, jak zabezpieczyć to losowanie przed wylosowywaniem tych samych liczb kilka razy ? Kiedyś kiedyś pamiętam pisałem coś takiego jeszcze w turbo pascalu ale za nic nie mogę sobie znaleźć na dysku tego programu.
Obstawiam, że trzeba to zrobić if'em, który będzie sprawdzał wylosowaną liczbę i jeżeli jej nie ma jeszcze to zapisze do tablicy i puści pętlę dalej i wylosuje kolejną liczbę tak aby na końcu wylosowanych liczb było 6. Czy jeżeli w tym ifie zrobię taki myk, że jeżeli liczba jest już w tablicy to wtedy od zmiennej sterującej pętlą zostanie odjęte 1 czyli pętla powinna wykonać się dodatkowy jeden raz. Można to jakoś lepiej rozwiązać ?
Mayka
Losowanie bez powtórzeń:
  1. $ile_pytan = 20; //z ilu pytan losujemy?
  2. $ile_wylosowac = 5; //ile pytan wylosowac?
  3. $ile_juz_wylosowano=0; //zmienna pomocnicza
  4.  
  5. for ($i=1; $i<=$ile_wylosowac; $i++)
  6. {
  7. do
  8. {
  9. $liczba=rand(1,$ile_pytan); //losowanie w PHP
  10. $losowanie_ok=true;
  11.  
  12. for ($j=1; $j<=$ile_juz_wylosowano; $j++)
  13. {
  14. //czy liczba nie zostala juz wczesniej wylosowana?
  15. if ($liczba==$wylosowane[$j]) $losowanie_ok=false;
  16. }
  17.  
  18. if ($losowanie_ok==true)
  19. {
  20. //mamy unikatowa liczbe, zapiszmy ja do tablicy
  21. $ile_juz_wylosowano++;
  22. $wylosowane[$ile_juz_wylosowano]=$liczba;
  23. }
  24. } while($losowanie_ok!=true);
  25. }
  26.  

oczywiście w $wylosowane masz tablice z liczbami, teraz musisz te 2 skrypty zgarnac do jednego i bedzie hulać wink.gif
YourFrog
Można również użyć wbudowanych w php funkcji. Na ile takie losowanie jest rzeczywiście losowe to nie wiem.

  1. <?php
  2.  
  3. /**
  4.  * Przykładowa klasa imitująca losowania lotto
  5.  * @author Paweł Stelmasiak <YourFrog>
  6.  */
  7. class Lotto
  8. {
  9.  
  10. /**
  11. * Zwraca tablice z wylosowanymi liczbami dla dużego lotka
  12. * @return array
  13. */
  14. static public function getBigNumber()
  15. {
  16. return self::randomize(47, 6);
  17. }
  18.  
  19. /**
  20. * Zwraca tablicę z wylosowanymi liczbami dla multilotka
  21. * @return array
  22. */
  23. static public function getMultiNumber()
  24. {
  25. return self::randomize(80, 20);
  26. }
  27.  
  28. /**
  29. * Zwraca tablicę z pomieszanymi liczbami
  30. * @param integer $elementCount Ilość elementów w puli
  31. * @param integer $count Ilość elementów do zwrócenia
  32. */
  33. static protected function randomize($elementCount, $count)
  34. {
  35. $arr = range(1, $elementCount);
  36. shuffle($arr);
  37. array_splice($arr, $count);
  38.  
  39. return $arr;
  40. }
  41. }
DestiX
Wykorzystam ten skrypt na losowanie bez powtórzeń, który podał Mayka. Jak to połączyć to pewnie ogarnę, jeśli nie to będę pisał tongue.gif

A na razie dziękuje wam wszystkim za pomoc smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.