Wątek przeniesiony 2015-01-03 22:11 z PHP przez dzek69.

Przy porównywaniu zmiennych w pętli zagnieżdżonej pętla się zapętla

0

Mam taki problem napisałem skrypt, który polega na tym, że komputer gra w grę wojnę karcianą z samym sobą baza mysql wygląda tak

Tabela karty
id nazwa_karty id_karty rozdana
1 2_serce 1 n
2 2_karo 1 n
3 2_krzyż 1 n
4 2_pik 1 n
5 3_serce 2 n
6 3_karo 2 n
7 3_krzyż 2 n
8 3_pik 2 n
9 4_serce 3 n
10 4_karo 3 n
tabela ilosc_punktow
id pierwsza druga
1

Ta wygląda klasa karty i klasa baza

class karty {


  public function pobierz_karte() {
  
  
    $pobierz_karte = mysql_query("select id,nazwa_karty,id_karty from karty where rozdana = 'n' order by rand() limit 1");
    $pobierz_karte = mysql_fetch_array($pobierz_karte);
    mysql_query("update karty set rozdana='t' where id = '$pobierz_karte[0]' ");
    return $pobierz_karte;
  }

  public function porownaj_karty($karta1,$karta2) {
    if ($karta1[2] < $karta2[2]) {
      $pobierz_wynik = mysql_query("select druga from ilosc_punktow where id = '1' ");
      $pobierz_wynik = mysql_fetch_array($pobierz_wynik);
      if ($pobierz_wynik[0] == "") $punkty_drugiego = 1;
      else $punkty_drugiego = $pobierz_wynik[0] + 1;
      mysql_query("update ilosc_punktow set druga = '$punkty_drugiego' where id = '1' ");
      return "druga";
    }
    else if ($karta1[2] > $karta2[2]) {
      $pobierz_wynik = mysql_query("select pierwsza from ilosc_punktow where id = '1' ");
      $pobierz_wynik = mysql_fetch_array($pobierz_wynik);
      if ($pobierz_wynik[0] == "") $punkty_pierwszego = 1;
      else $punkty_pierwszego = $pobierz_wynik[0] + 1;
      mysql_query("update ilosc_punktow set pierwsza = '$punkty_pierwszego' where id = '1' ");
      return "pierwsza";
    }
    else return "równe";
    
  }
  
  public function zapisz_wynik($druga_czy_pierwsza,$licznik) {
    if ($druga_czy_pierwsza == "pierwsza") {
      $pobierz_wynik = mysql_query("select pierwsza from ilosc_punktow where id = '1' ");
      $pobierz_wynik = mysql_fetch_array($pobierz_wynik);
      if ($pobierz_wynik[0] == "") $punkty_pierwszego = $licznik;
      else $punkty_pierwszego = $pobierz_wynik[0] + $licznik;
      mysql_query("update ilosc_punktow set pierwsza = '$punkty_pierwszego' where id = '1' ");
    }
    else {
      $pobierz_wynik = mysql_query("select druga from ilosc_punktow where id = '1' ");
      $pobierz_wynik = mysql_fetch_array($pobierz_wynik);
      if ($pobierz_wynik[0] == "") $punkty_drugiego = $licznik;
      else $punkty_drugiego = $pobierz_wynik[0] + $licznik;
      mysql_query("update ilosc_punktow set druga = '$punkty_drugiego' where id = '1' ");
    }
  
  
  }
  
  public function tasuj_karty() {
  
    mysql_query("update karty set rozdana='n'");
  }
  
}


class baza {


  public function polacz_z_baza() {
    mysql_connect("localhost","root","a1234");
    mysql_select_db("makao");
  }



}

Tutaj jest wszystko dobrze

Ale tutaj jest już gdzieś błąd

$karta = new baza;
$karta->polacz_z_baza();

$karta2 = new karty;


$licznik = 1;
while ($licznik <= 26) {
  //print "d";
  $jaka = $karta2->pobierz_karte();
  $jaka2 = $karta2->pobierz_karte();
  $czy_rowna = $karta2->porownaj_karty($jaka,$jaka2);
  $licznik2 = 0;
  print $jaka[2] . " na " . $jaka2[2] . "<br>";
  while ($jaka[2] == $jaka2[2] or $licznik <= 26) {
    $jaka = $karta2->pobierz_karte();
    $jaka2 = $karta2->pobierz_karte();  
    print $jaka[2] . " na " . $jaka2[2] . "<br>";
    $czy_rowna = $karta2->porownaj_karty($jaka,$jaka2);
    $licznik++;
    $licznik2++;
  }
  $karta2->zapisz_wynik($czy_rowna,$licznik2);
  $licznik++;
  
}
  
print $czy_rowna;
$karta2->tasuj_karty();
//print $jaka[1];

No i teraz ten kod polega na tym, że jest pętla, która jest wykonywana 26 razy bo kart jest 52 i w każdym przejściu pętli są dwie karty rozdawane i teraz do bazy jest zapisywane kto w danym czasie wygrał np. jeżeli to był drugi to w bazie będzie 0 1 i jak następny będzie drugi brał kartę to uaktualni w bazie wpis i będzie 0 2 i teraz może się zdarzyć coś takiego, że wylosują równe karty i za to będzie odpowiadać pętla zagnieżdżona, która będzie wykonywana aż wylosowane karty będą różne od siebie i ta pętla mi się zapętla nie wiem dlaczego ?

1
while ($jaka[2] == $jaka2[2] or $licznik <= 26)

to na

while ($jaka[2] == $jaka2[2] AND $licznik <= 26)

Generalnie, ja bym to skasował i zrobił od nowa.

  1. Nazewnictwo do bani... sprawdź np: http://pl.wikipedia.org/wiki/CamelCase
  2. PDO!!! do bazy
  3. metoda porownaj_karty powinna być statyczna i wywolywana bezpośrednio z klasy nie obiektu. Chyba ze dasz metodę typu karta1->porownaj(karta2)
  4. zmiennej licznik2 w ogóle nie używasz
  5. jak pobierasz karte to pobieraj obiekt klasy Karta, a nie tablice z bazy.
0

Straszny kod. Spaghetti jak się patrzy ;).

Niby masz klasy, niby tworzysz jakieś obiekty ale nie tędy droga. Polecam poczytać o zasadach programowania obiektowego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1