Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Losowanie lotto.
Macios25
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 31.07.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


1. Zamiast klepać tablice $zakres z palca użyj funkcji http://www.php.net/manual/en/function.range.php


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
Macios25
post
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 31.07.2011

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
kamil4u
post
Post #4





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


- array_rand - popatrz co robi drugi parametr
- die - echo jest niepotrzebne
- zamiast "or" używaj ||


--------------------
Go to the top of the page
+Quote Post
Macios25
post
Post #5





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 31.07.2011

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
kamil4u
post
Post #6





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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ą.


--------------------
Go to the top of the page
+Quote Post
Macios25
post
Post #7





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 31.07.2011

Ostrzeżenie: (0%)
-----


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


Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 09:08