Autor Zpráva
Apacuka
Profil
Zdravim, chtel bych zkusit takovou jednoduchou hru :)
Akorat bych se chtel zeptat na 2 veci, ktere jsou popsany na konci.

popis hry:
- kazdy hrac muze vytvorit max 5 her behem 24 hodin od vytvoreni sve prvni hry
-- celkem muze mit 5 otevrenych/nedohranych her
- kazdy hrac muze reagovat na max 5 her behem 24 hodin od prvni reakce
- hrac1 vytvori hru (o kolik bude hrat)
-- INSERT INTO uzivatele h1 WHERE ID
-- INSERT INTO hry (IDu1,oco,v1,vytvor) VALUES ('...')
- hrac2 prijme hru
-- UPDATE uzivatele SET hp1 WHERE ID
-- UPDATE hry SET ... WHERE IDh
-- UPDATE uzivatele SET body WHERE ID

tabulky:
- uzivatele
- hry
+----+-------+------+------+-------+-------+-------+-------+------+-------+-------+-------+--------+
| ID | NICK  | BODY |  h1  |   h2  |   h3  |   h4  |   hp5 |  hp1 |   hp2 |   hp3 |   hp4 |   hp5  |
+----+-------+------+------+-------+-------+-------+-------+------+-------+-------+-------+--------+
| 1  | hrac1 | 2000 |                                      |                                       |
| 2  | hrac2 | 2000 |                                      |                                       |
| 3  | hrac3 | 2000 |                                      |                                       |
| 4  | hrac4 | 2000 |                                      |                                       |
+----+-------+------+--------------------------------------+---------------------------------------+

h1-h5 - datum,cas vytvoreni hry
uzivatele.h1-h5 = hry.vytvor
hp1-hp5 - datum,cas prijeti hry
+-----+------+-------+-----+----+----+--------+--------+-------+------+
| IDh | IDu1 | IDu2  | oco | v1 | v2 | vyhral | vytvor | hrano | stat |
+-----+------+-------+-----+----+----+--------+--------+-------+------+

IDh - id hry
IDu1 - ID uzivatele (zakladatele hry)
IDu2 - ID uzivatele (ktery hru hral)
oco - o kolik hraje
v1 - vysledek hrace 1 // random_cislo
v2 - vysledek hrace 2 // random_cislo
vyhral - ID uzivatele ktery vyhral
vytvor - datum kdy byla hra vytvorena
hrano - datum kdy byla hra dohrana
stat - vychozi=0 ... pokud odehrana tak 1

dotaz1:
- resili by ste rozlozeni tabulek stejne?

dotaz2:
- jak porovnat sloupec uzivatele.h* s intervalem 24 hodin, aby se mohl pripadny obsah sloupce vymazat
- jaky datovy typ byste priradili sloupcum uzivatele.h*, uzivatele.hp*, aby se dobre pocital ten casovy rozdil?
nejlepsi asi pouzit timestamp a pricist 86400, ne?


děkuji
unlucky
Profil
ad2

SELECT neco FROM tabulka WHERE DATE_ADD(CURDATE(),INTERVAL 1 DAY
Joker
Profil
Apacuka:
resili by ste rozlozeni tabulek stejne?
Asi ne.
Pravidlo: Jakmile musíte indexovat názvy sloupců (tj. h1, h2, h3,...), s velkou pravděpodobností je špatně návrh tabulky.
Konkrétně:
- Proč dáváte čas vytvoření a přijetí hry k uživateli, když to je atribut té hry?
- Když hráč přijme hru, jak vůbec určíte, do jakého sloupce se má čas uložit?
- Čas vytvoření hry je duplikovaný v obou tabulkách
- Shrnutí předchozích bodů: Sloupce h* a hp* u hráče nemají co dělat, údaje by se měly brát z tabulky hry.
- Není sloupec stat zbytečný? Dohraná a nedohraná hra by přece měla jít poznat podle toho, jestli ve sloupci hrano je NULL nebo nějaký čas.
- Není sloupec vyhral zbytečný? Nedá se kdo vyhrál zjistit porovnáním výsledků (v1 a v2)?
Apacuka
Profil
unlucky: to plati pro timestamp ?

Joker: ted si ctu zpetne co jsem napsal, a mate pravdu. Zkusim to udelat podle Vasich bodu.

h* a hp* bych resil tak, ze pokud by byl cas starsi 24hodin, tak by se smazal a novy zaznam by se vlozil do nejakeho prazdneho pole
Apacuka
Profil
Nejde prosim vas tenhle kod napsat nejak jednoduseji, aby tu nebylo tolik selectu a updatu ?

      $result = mysql_query("SELECT * FROM hry WHERE IDh=$id");
      $row = mysql_fetch_array($result);
  
      $body1 = mysql_result(mysql_query("SELECT body FROM users u LEFT JOIN hry h ON u.ID=h.IDu1 WHERE h.IDu1=$row[IDu1] AND h.IDh=$id"), 0);
        // zjisti pocet bodu hrace1 podle ID hry
      $body2 = mysql_result(mysql_query("SELECT body FROM users WHERE id=".$_SESSION["logged_id"].""), 0);
        // zjisti pocet bodu hrace2 podle prihlaseneho_ID
        
      if ($row['v1']>$row['v2']) 
        {
          $body1=$body1+2*$row['oco']; 
          $body2=$body2-$row['oco'];
          mysql_query("UPDATE users SET body=$body1 WHERE ID=$row[IDu1]");
          mysql_query("UPDATE users SET body=$body2 WHERE id=".$_SESSION["logged_id"]."");
        }
      elseif ($row['v1']<$row['v2']) 
        {
          $body2=$body2+$row['oco'];
          mysql_query("UPDATE users SET body=$body2 WHERE id=".$_SESSION["logged_id"]."");
        }
      elseif ($row['v1']==$row['v2']) 
        {
          $body1=$body1+$row['oco'];
          mysql_query("UPDATE users SET body=$body1 WHERE ID=$row[IDu1]");
        } 
Joker
Profil
Apacuka:
Pokud nějsou původní body potřeba k něčemu dalšímu, šlo by vyhodit ty SELECTy na zjištění $body1 a $body2... přičíst něco ke stávající hodnotě sloupce jde i v příkazu UPDATE:
UPDATE ... SET sloupec = sloupec + něco

A ještě dvě věci:
- Je to správně, že v případě vítězství jednoho hráče se body i odečítají a v případě vítězství toho druhého ne?
- Proč SELECT na $body1 má ještě podmínku na ID hry a ostatní dotazy, které mají vybírat vesměs to samé, tu podmínku nemají?
Apacuka
Profil
Joker:
- Ano, já myslím, že je to tak dobře.
Při vytváření hry hráč1 přijde o ty svoje body. Proto při tomto ukončení už jen dorovnávám hodnoty.
- $body2 jsou vybírány podle id_přihlaseneho_hrace
- $body1 podle user.ID=hry.IDu1, a abych zjistil to správný IDu1, tak musím vybrat ještě podle ID hry

Takže je vlastně dobře tolik dotazů, akorát můžu zrušit dotaz SELECT na $body2 a upravit UPDATY pro $body2 v IF ?
Joker
Profil
Apacuka:
No mě jen překvapuje, že u výběru bodů jednoho hraje roli ID hry a u druhého ne.
Apacuka
Profil
Joker:
Jak by si to resil ty?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: