Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Losowanie lotto.
Forum PHP.pl > Forum > PHP
Macios25
Witajcie.

Próbuje nauczyć się na własną rękę pisać skrypty w php. Zapoznałem się z podstawami jednak nie zawsze wiem czy wykorzystuje zdobytą w najprostszy sposób. Dlatego chciałbym abyście rzucili okiem na mój skrypt losowania lotto
i powiedzieli co mogłem zrobić lepiej i w jaki sposób.

  1. <?php
  2. $zakres = array(1=>1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49);
  3. // zakres liczb z jakich ma być losowane 6 cyfr.
  4.  
  5. $wprowadzone="3,9,7,2,22,12";
  6. // Liczby wprowadzone przez użytkownika. ( Muszą one być odzielone odcinkami. )
  7.  
  8. if(!preg_match('#^[0-9,}]+$#ui', $wprowadzone)) {
  9. // tą linijkę kodu ukradłem z innego skryput. Nie mogę zrozumieć wyrażeń warunkowych, nie wiem czy użyłem tej funkcji prawidłowo.
  10. echo("<br>Blad! Musisz podac 6 liczb z zakresu od 1 do 49, odzielonych za pomoca przecinka!<br>");
  11. // W wypadku gdy użytkownik poda niedozwolony ciąg znaków zostanie wyśwetlony komunikat o błędzie.
  12. die();
  13. // Zostanie również wtedy zakończone działanie skryptu.
  14. }
  15.  
  16.  
  17. $wprowadzone =explode(",",$wprowadzone);
  18. // Każda liczba odzielona przecinkiem zostaje osobno przypisana do tablicy wporowadzone.
  19.  
  20.  
  21.  
  22. for ($i = 0; $i<= 5; $i++) {
  23. if ($wprowadzone[$i]>49 or $wprowadzone[$i]<1 ){
  24. echo("Możesz podawać tylko liczby zakresu od 1 do 49!<br>");
  25. die();
  26. }
  27. // Pętla sprawdza czy podane liczby pochodza z zakresu od 1 do 49;
  28.  
  29.  
  30. }
  31.  
  32.  
  33. echo("Wybrane przez Ciebie liczby to: <br>");
  34. for ($i = 0; $i <= 5; $i++) {
  35. echo($wprowadzone[$i]." ");
  36. }
  37. // Wypisuje 6 wybranych przez użytkownika liczb.
  38.  
  39.  
  40.  
  41.  
  42. echo("<br>Wylosowano:<br>");
  43.  
  44. for ($i = 1; $i<= 6; $i++) {
  45. // pętla wykona się 6 razy, za każdym razem wylosuje jedną liczbę i umieści ją w tablicy losuj
  46. $losuj[$i] = array_rand($zakres, 1);
  47. // losuje liczbę z tablicy zakres.
  48. unset($zakres[$losuj[$i]]);
  49. // usuwa wylosowaną liczbę z tablicy zakres - każada liczba ma być unikalna.
  50. echo($losuj[$i]." ");
  51. // Zwaraca wylosowaną liczbę.
  52. }
  53.  
  54.  
  55.  
  56.  
  57.  
  58. $licznik =0;
  59.  
  60.  
  61. for ($i = 0; $i <= 5; $i++) {
  62. if (in_array($wprowadzone[$i], $losuj)) {
  63. $licznik++;
  64. }
  65. }
  66. //Porównuje liczby wylosowane z liczbami podanymi przez użytkownika.
  67.  
  68.  
  69.  
  70. echo ("<br>Trafione: ".$licznik);
  71. // Wyświelta liczbę trafień.
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78. ?>
  79.  
  80.  
  81.  


Chyba trochę przesadziłem z komentarzami...

Proszę o sugestie i pozdrawiam
Maciek.
skowron-line
1. Zamiast klepać tablice $zakres z palca użyj funkcji http://www.php.net/manual/en/function.range.php
Macios25
Wielkie dzięki, rzeczywiście wystarczyło: $zakres = range (1, 49). Tak to jest jak się nie zna do końca języka
i dodaje się samemu sobie pracy. wink.gif

Na przyszłość z pewnością zapamiętam.

kamil4u
- array_rand - popatrz co robi drugi parametr
- die - echo jest niepotrzebne
- zamiast "or" używaj ||
Macios25
Dziękuje za rady. Zastosowałem wszystkie i kod stał się dużo bardziej przejrzysty, a do tego poznałem kilka przydatnych funkcji. wink.gif

Poprawiony kod:


  1. <?php
  2.  
  3.  
  4. $zakres = range (1, 49);
  5. // funkcja renge() generuje tablicę $zakres z, której następnie ma być wybrane 6 liczb.
  6.  
  7.  
  8. $wprowadzone="1,2,3,4,5,6";
  9. // Liczby wprowadzone przez użytkownika. ( Muszą one być odzielone odcinkami. )
  10.  
  11. if(!preg_match('#^[0-9,}]+$#ui', $wprowadzone)) {
  12. // tą linijkę kodu ukradłem z innego skryput. Nie mogę zrozumieć wyrażeń warunkowych, nie wiem czy użyłem tej funkcji prawidłowo.
  13. die("<br>Blad! Musisz podac 6 liczb z zakresu od 1 do 49, odzielonych za pomoca przecinka!<br>");
  14. // zostanie wyświetlony odpowiedni komunikat i działaie skryptu zostanie zakończone.
  15. }
  16.  
  17.  
  18. $wprowadzone =explode(",",$wprowadzone);
  19. // Każda liczba odzielona przecinkiem zostaje osobno przypisana do tablicy wporowadzone.
  20.  
  21.  
  22.  
  23. for ($i = 0; $i<= 5; $i++) {
  24. if ($wprowadzone[$i]>49 || $wprowadzone[$i]<1 ){
  25. die("Możesz podawać tylko liczby zakresu od 1 do 49!<br>");
  26. }
  27. }
  28. // Pętla sprawdza czy podane liczby pochodza z zakresu od 1 do 49, zostaje wyświetlony odpowiedni komunikat, po czym działanie skryptu zostaje zatrzymane.;
  29.  
  30.  
  31.  
  32.  
  33.  
  34. echo("Wybrane przez Ciebie liczby to: <br>");
  35. for ($i = 0; $i <= 5; $i++) {
  36. echo($wprowadzone[$i]." ");
  37. }
  38. // Pętla Drukuje wybrane przez użytkownika liczby.
  39.  
  40.  
  41. echo("<br>Wylosowano:<br>");
  42. $wylosowane = array_rand($zakres, 6);
  43. $licznik =0;
  44. // Funkcja array_rand() losuje 6 liczb z tablicy $zakres. ( bez zwracania. )
  45.  
  46.  
  47.  
  48. foreach($wylosowane as $klucz=> $wylosowana ) {
  49. echo ($wylosowana." ");
  50. if (in_array($wylosowana,$wprowadzone)) {
  51. $licznik++;
  52. }
  53. }
  54. // Pętla foreach drukuje wzlosowane liczby. Sprawdza czy każda z kolejna znajduje się w tablicy $wprowadzone. Jeśli tak zwiększa licznik o 1.
  55.  
  56.  
  57. echo ("<br>Trafione: ".$licznik);
  58. ?>


Trapi mnie jeszcze jedne rzecz. Użytkownik może podać 6 takich samych liczb, przez co prawdopodobieństwo na
trafienie "szóstki" byłoby bardzo duże ( 1 do 49 ).
Do sprawdzania czy wszystkie liczby są różne mógłbym użyć funkcji in_array. Jednak musiałbym sprawdzać każdy element z osobna i porównywać go do całej tablicy. Czy nie ma jakiegoś bardziej wydajnego i odpowiedniego wyjścia
w tej sytuacji?

Jeszcze raz dziękuje za zainteresowanie i udzieloną pomoc.

kamil4u
Chyba nie ma... przynajmniej nie przypominam sobie... - na wszelki wypadek popatrz jeszcze do manual-a na funkcję tablicy: http://www.php.net/manual/pl/ref.array.php
Ale i tak już raz masz pętle na wszystkie elementy:
Kod
for ($i = 0; $i<= 5; $i++) {

Wykorzystaj ją.
Macios25
Głosiłem jednak herezję z in_array(). Funkcja ta sprawdza czy element znajduje się w tablicy.
Skoro element jest pobierany z tablicy $wpisane, to również w niej musi się znajdować.

Zgodnie z radą kamil4u przejrzałem dokładnie listę funkcji w manualu i znalazłem dosyć ciekawą perełkę.
array_unique(). Usuwa ona duplikaty z tablicy.

Jako, że potem każdy z elementów tablicy jest sprawdzany czy mieści się w przedziale od 1 do 49 zostanie zwrócony fałsz, a działanie skryptu przerwane.

Jako, że dodałem tylko jedno linijkę kodu i zmodyfikowałem echo(), nie wrzucam całego kodu, który jest dostępny wyżej
ponieważ mija się to z celem.


  1. $wprowadzone =explode(",",$wprowadzone);
  2. // Każda liczba odzielona przecinkiem zostaje osobno przypisana do tablicy wporowadzone.
  3.  
  4.  
  5.  
  6. $wprowadzone = array_unique($wprowadzone);
  7. // Funkcja array_unique usuwa z tablicy powtórzenia.
  8.  
  9.  
  10.  
  11.  
  12. for ($i = 0; $i<= 5; $i++) {
  13. if ($wprowadzone[$i]>49 || $wprowadzone[$i]<1 ){
  14. die("Możesz podawać tylko liczby zakresu od 1 do 49!<br>Liczby nie mogą się powtarzać.");
  15. }
  16. // Jeśli liczba jest mniejsza 1 lub większa od 49 lub została usunięta ze względu na powtórzenia zostaje wyświetlony stosowny komunikat.



Przy użyciu generowania tablic, z której ma być losowana cyfra przy użyciu funkcji range() dzieje się u mnie na serwerze
dosyć dziwna rzecz. Pomimo, że zakres jest ustawiony od 1,49 to czasami w losowaniu potem z tej tablicy jest wyciągnięte 0. Ciekawe. smile.gif

Udało mi się z Waszą pomocą ulepszyć ten skrypt. Jednak nie myliłem się co do tego, że potrzebuje jakichś mentorów,
którzy będą mi pokazywali błędy. Teraz spróbuje napisać coś większego, może jakiś system logowania. wink.gif
Tylko muszę się dokształcić z wyrażeń regularnych i obsługi sesji.
Jeśli uda mi się stworzyć coś sensownego to wrzucę abyście wskazali mi błędy.

Jeszcze raz dziękuje za pomoc i zainteresowanie. 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.