Autor | Zpráva | ||
---|---|---|---|
Apacuka Profil |
#1 · Zasláno: 17. 11. 2009, 03:15:46 · Upravil/a: Apacuka
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 |
#2 · Zasláno: 17. 11. 2009, 09:34:30 · Upravil/a: unlucky
ad2
SELECT neco FROM tabulka WHERE DATE_ADD(CURDATE(),INTERVAL 1 DAY |
||
Joker Profil |
#3 · Zasláno: 17. 11. 2009, 10:20:07
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 |
#4 · Zasláno: 17. 11. 2009, 18:50:40 · Upravil/a: Apacuka
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 |
#5 · Zasláno: 20. 11. 2009, 02:21:20 · Upravil/a: Apacuka
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 |
#6 · Zasláno: 20. 11. 2009, 08:00:39
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 |
#7 · Zasláno: 20. 11. 2009, 12:20:55
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 |
#8 · Zasláno: 20. 11. 2009, 13:01:55
Apacuka:
No mě jen překvapuje, že u výběru bodů jednoho hraje roli ID hry a u druhého ne. |
||
Apacuka Profil |
#9 · Zasláno: 20. 11. 2009, 13:48:18 · Upravil/a: Apacuka
Joker:
Jak by si to resil ty? |
||
Časová prodleva: 14 let
|
0