Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zgadywanie generowaniej liczby
Forum PHP.pl > Forum > Przedszkole
xamrex
Witam. Napisałem skrypt, który generuje losową liczbę, a zadaniem użytkownika jest zgadnięcie właśnie tej liczby.
Pisałem to w PHP, jestem pewny że używając java script'u było by o wiele prościej, jednak chcę przetestować własne umiejętności.
Proszę o analizę tego kodu i napisanie co można by tutaj poprawić, gdzie zrobiłem jakieś błędy.
  1. <?php
  2. ob_start();//Problemy z headers already sent
  3. echo '<html>';
  4. echo '<head>';
  5. echo '<title>Zgadywanie wygenerowaniej cyfry</title>';
  6. echo '<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2" >';
  7. echo '</head>';
  8. echo '<body>';
  9. //Tworzeniec cookie z wygenerowana losowo cyfra
  10. if (empty($_COOKIE['losowa']))
  11. {
  12. setcookie("losowa", rand(1,10), time()+3600);
  13. echo'<meta http-equiv="Refresh" content="0">';
  14. }
  15. //tworzenie zmiennych
  16. $cyfra_wygenerowana=$_COOKIE['losowa'];
  17. $cyfra_usera=$_POST['cyfra'];
  18. //podpowiedzi
  19. if (empty($cyfra_usera))
  20. {
  21. echo 'Wpisz cyfrę (od 1 do 10)';
  22. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  23. }elseif ($cyfra_wygenerowana>$cyfra_usera){
  24. echo 'Za mało, co ty taki skromny??';
  25. $proba++;
  26. setcookie ('proba', "$proba", time()+3600);
  27. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  28. }elseif ($cyfra_wygenerowana<$cyfra_usera){
  29. echo 'No nie przesadzaj aż tak.';
  30. $proba++;
  31. setcookie ('proba', "$proba", time()+3600);
  32. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  33. }elseif ($cyfra_wygenerowana==$cyfra_usera){
  34. $proba++;
  35. setcookie ('proba', "$proba", time()+3600);
  36. echo 'Zgadłeś za '.$proba.' razem BRAWO!<br><a href="index.php">Kliknij</a> by zagrać jeszcze raz.';
  37. setcookie("losowa", "", time());
  38. setcookie("proba", "", time());
  39. }else{
  40. echo 'To sie nie powinno zdarzyć';
  41. }
  42. ob_end_flush();//Problemy z headers already sent
  43. echo '</body>';
  44. echo '</html>';
  45. ?>
zend
1) $cyfra_wygenerowana<$cyfra_usera - tu porównujesz dwa stringi, typuj na (int)$zmienna
2) ini_set('display_errors' , 'On'); error_reporting(E_ALL | E_STRICT); na początku
3) if (empty($cyfra_usera)) => if(isset($_POST['xxx']))
4) $proba++; a gdzie jest deklaracja $proba = 0; ?
5) To można poprawić
  1. ob_end_flush();//Problemy z headers already sent
  2. echo '</body>';
  3. echo '</html>';

6) setcookie ('proba', "$proba", time()+3600); "$proba" WTF?
7) Poczytaj sobie o DRY
  1. if (empty($cyfra_usera))
  2. {
  3. echo 'Wpisz cyfrę (od 1 do 10)';
  4. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  5. }elseif ($cyfra_wygenerowana>$cyfra_usera){
  6. echo 'Za mało, co ty taki skromny??';
  7. $proba++;
  8. setcookie ('proba', "$proba", time()+3600);
  9. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  10. }elseif ($cyfra_wygenerowana<$cyfra_usera){

xamrex
1)Poprawiłem
$cyfra_wygenerowana=(int)$_COOKIE['losowa'];
$cyfra_usera=(int)$_POST['cyfra'];
Jednak mimo to mam błąd
Undefined index: cyfra in c:\usr\krasnal\www\losowanie\index.php on line 18
3)if(isset($_POST['cyfra'])) Dostaje błędy
Kod
Notice: Undefined index: losowa in c:\usr\krasnal\www\losowanie\index.php  on line 17
Notice: Undefined index: cyfra in c:\usr\krasnal\www\losowanie\index.php on line 18
Zgadłeś za 1 razem BRAWO!

Lina 17 i 18
  1. $cyfra_wygenerowana=(int)$_COOKIE['losowa'];
  2. $cyfra_usera=(int)$_POST['cyfra'];

6)Cookie o nazwie proba przechowuje liczbe prób za którym razem user zgadł cyfrę.
7)Dry? to coś związane z instrukcja switch? ( Mam mało if więc nie użyłem switch'a)

Ja jestem początkującym więc zdarzają mi się błędy, dziękuje za odpowiedź w temacie i tłumaczenie mi moich błędów.
nospor
Co do undefined to najpierw sprawdzaj czy cos jest (isset()) a dopiero potem się do tego dobieraj

ad6) chodziło o to , ze nie "$proba" a $proba. Po co ci te ciapki?

Cytat
7)Dry? to coś związane z instrukcja switch? ( Mam mało if więc nie użyłem switch'a)
http://lmgtfy.com/?q=dry
?

ps: zdajesz sobie sprawę, że przechowywanie tej wartosci w cookie ma tę "zaletę", ze trafię za kazdym razem?
xamrex
myślałem ze dry to jakaś funkcja z php ;(
mój kod (ciągle z błędami)
  1. <?php
  2. ob_start();//Problemy z headers already sent
  3. ini_set('display_errors' , 'On'); error_reporting(E_ALL | E_STRICT);
  4. echo '<html>';
  5. echo '<head>';
  6. echo '<title>Zgadywanie wygenerowaniej cyfry</title>';
  7. echo '<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2" >';
  8. echo '</head>';
  9. echo '<body>';
  10. //Tworzeniec cookie z wygenerowana losowo cyfra
  11. if (empty($_COOKIE['losowa']))
  12. {
  13. setcookie("losowa", rand(1,10), time()+3600);
  14. $proba=0;
  15. echo'<meta http-equiv="Refresh" content="0">';
  16. }
  17. //tworzenie zmiennych
  18. if(isset($_COOKIE['losowa'])){
  19.  
  20. $cyfra_wygenerowana=(int)$_COOKIE['losowa'];
  21. }
  22. if(isset($_POST['cyfra'])){
  23. $cyfra_usera=(int)$_POST['cyfra'];
  24. }
  25. //podpowiedzi
  26.  
  27. if (empty($cyfra_usera))
  28. {
  29. echo 'Wpisz cyfrę (od 1 do 10)';
  30. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  31. }elseif ($cyfra_wygenerowana>$cyfra_usera){
  32. echo 'Za mało, co ty taki skromny??';
  33. $proba++;
  34. setcookie ('proba', $proba, time()+3600);
  35. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  36. }elseif ($cyfra_wygenerowana<$cyfra_usera){
  37. echo 'No nie przesadzaj aż tak.';
  38. $proba++;
  39. setcookie ('proba', $proba, time()+3600);
  40. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  41. }elseif ($cyfra_wygenerowana==$cyfra_usera){
  42. $proba++;
  43. setcookie ('proba', $proba, time()+3600);
  44. echo 'Zgadłeś za '.$proba.' razem BRAWO!<br><a href="index.php">Kliknij</a> by zagrać jeszcze raz.';
  45. setcookie("losowa", "", time());
  46. setcookie("proba", "", time());
  47. }else{
  48. echo 'To sie nie powinno zdarzyć';
  49. }
  50. ob_end_flush();//Problemy z headers already sent
  51. echo '</body>';
  52. echo '</html>';
  53. ?>

Dostaje info
Notice: Undefined variable: proba
Przecież ja ustawiłem na $proba=0 jeśli nie ma cookies. Chyba ze to wstawilem w złym miejscu. Gdzie to mam dać? (oczywiście nie mogę dać na środek bo za każdym razem zamiast się zwiększać będzie przyjmować wartość 0)
nospor
Cytat
Przecież ja ustawiłem na $proba=0 jeśli nie ma cookies.
nom... a jesli jest cookies to nigdzie nie ustawiasz. Jak jest cookies to musisz te $proba pobrać z ciastka, nie?
xamrex
no tak, lecz zend napisał
4) $proba++; a gdzie jest deklaracja $proba = 0; ?
Czyli muszę na starcie stworzyć cookie proba z wartoscia 0?
nospor
Nie, cookie z proba przeciez ustawiasz przy kazdym $proba++. To jest ok.
To ze zrobiles $proba=0 tez jest ok.
Ale nie zrobiles:
$proba = $_COOKIE['proba'] gdy to ciacho juz jest. Teraz bez tego za kazdym razem proba bedzie wynosila 1 smile.gif
xamrex
  1. <?php
  2. ob_start();//Problemy z headers already sent
  3. ini_set('display_errors' , 'On'); error_reporting(E_ALL | E_STRICT);
  4. echo '<html>';
  5. echo '<head>';
  6. echo '<title>Zgadywanie wygenerowaniej cyfry</title>';
  7. echo '<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2" >';
  8. echo '</head>';
  9. echo '<body>';
  10. //Tworzeniec cookie z wygenerowana losowo cyfra
  11. if (empty($_COOKIE['losowa']))
  12. {
  13. setcookie("losowa", rand(1,10), time()+3600);
  14. echo'<meta http-equiv="Refresh" content="0">';
  15. }
  16. //tworzenie zmiennych
  17. if(isset($_COOKIE['losowa'])){
  18. $cyfra_wygenerowana=(int)$_COOKIE['losowa'];
  19. }
  20. if(isset($_POST['cyfra'])){
  21. $cyfra_usera=(int)$_POST['cyfra'];
  22. }
  23. //ustawianie proby
  24. if(isset($_COOKIE['proba'])){
  25. $proba = $_COOKIE['proba'] ;
  26. }else{
  27. $proba=0;
  28. }
  29. //podpowiedzi
  30. if (empty($cyfra_usera))
  31. {
  32. echo 'Wpisz cyfrę (od 1 do 10)';
  33. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  34. }elseif ($cyfra_wygenerowana>$cyfra_usera){
  35. echo 'Za mało, co ty taki skromny??';
  36. $proba++;
  37. setcookie ('proba', $proba, time()+3600);
  38. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  39. }elseif ($cyfra_wygenerowana<$cyfra_usera){
  40. echo 'No nie przesadzaj aż tak.';
  41. $proba++;
  42. setcookie ('proba', $proba, time()+3600);
  43. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  44. }elseif ($cyfra_wygenerowana==$cyfra_usera){
  45. $proba++;
  46. setcookie ('proba', $proba, time()+3600);
  47. echo 'Zgadłeś za '.$proba.' razem BRAWO!<br><a href="index.php">Kliknij</a> by zagrać jeszcze raz.';
  48. setcookie("losowa", "", time());
  49. setcookie("proba", "", time());
  50. }else{
  51. echo 'To sie nie powinno zdarzyć';
  52. }
  53. ob_end_flush();//Problemy z headers already sent
  54. echo '</body>';
  55. echo '</html>';
  56. ?>

Proszę zobaczyć wiersz od 23-28 czy to jest poprawnie? Czy cały skrypt jest poprawny? (oprócz tego nagłówka bo z tym nie umiem sobie inaczej poradzić)
nospor
Powinno byc ok.
A co jesli ktoś będzie chciał na nowo zacząc zgadywac? Masz gdziesz czyszczenie tych ciastek?

No i tego DRY nadal nie zastosowałes smile.gif
xamrex
Cytat
A co jesli ktoś będzie chciał na nowo zacząc zgadywac? Masz gdziesz czyszczenie tych ciastek?

  1. echo 'Zgadłeś za '.$proba.' razem BRAWO!<br><a href="index.php">Kliknij</a> by zagrać jeszcze raz.';
  2. setcookie("losowa", "", time());
  3. setcookie("proba", "", time());


czy jak '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form> przypisze zmiennej $formularz i będe to stosował będzie to DRY?
zend
DRY - pl. Nie Powtarzaj Się. Wwal cały kod z if'ów który się powtarza pod if'y i będzie ok, nic się nie będzie dublować
xamrex
zaden kos sie nie powtarza.
<input type=text name="cyfra"><input type=submit value="Wyślij"></form> Muszę to mieć w if bo jeśli osoba wygra ot nie chcę mu pokazywać tego formularza (no bo co jesli nie chce grac?)
zend
  1. if(!$wygrał)
  2. {
  3. //formularz
  4. }


No i tu się różnimy, bo jak dla mnie to się powtarza praktycznie *3
  1. $proba++;
  2. setcookie ('proba', $proba, time()+3600);
  3. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
xamrex
  1. if (empty($cyfra_usera))
  2. {
  3. echo 'Wpisz cyfrę (od 1 do 10)';
  4.  
  5. }elseif ($cyfra_wygenerowana>$cyfra_usera){
  6. echo 'Za mało, co ty taki skromny??';
  7. $proba++;
  8. setcookie ('proba', $proba, time()+3600);
  9.  
  10. }elseif ($cyfra_wygenerowana<$cyfra_usera){
  11. echo 'No nie przesadzaj aż tak.';
  12. $proba++;
  13. setcookie ('proba', $proba, time()+3600);
  14.  
  15. }
  16.  
  17.  
  18. if ($cyfra_wygenerowana==$cyfra_usera){
  19. $proba++;
  20. setcookie ('proba', $proba, time()+3600);
  21. echo 'Zgadłeś za '.$proba.' razem BRAWO!<br><a href="index.php">Kliknij</a> by zagrać jeszcze raz.';
  22. setcookie("losowa", "", time());
  23. setcookie("proba", "", time());
  24. }else{
  25. echo '<form action="index.php" method="POST">CYFERKA: <input type=text name="cyfra"><input type=submit value="Wyślij"></form>';
  26. }

Mniej więcej ten sposób byłby poprawny?
zend
Dalej powtarzasz ten sam kod
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.