Open NoxArt opened 10 years ago
Podle mě server by neměl hned po odesílání slov posílat zprávu round_started.
Možna něco nechápu.
Představuji si to tak, že pokud zpráva == send_words & count(unique(send_words od hráčů v daném kole)) == player_count
tak server
1) V případě automatického vyhodnocení pošle zprávu round_ended s výsledky. Pak až admin zmáčkne start_game, server odpovědí zprávou round_started.
2) V případě ručního vyhodnocení pošle zprávu round_ended, a všechna slova co hráče napsali. Pak hráče to vyhodnotí a až všichni skončí hodnocení, teda zpráva == send_evaluations& count(unique(send_evaluations od hráčů v daném kole)) == player_count
server pošle zprávu round_started
Nebo až admin zmáčkne tlačítko start_game.
Nebo hodnocení se děla až na konci, až skončíme hrát všechna kola? Tým pádem by to fungovalo jak jsi to napsal.
Chtěl jsem také říct, že do 6. prosince nebudu moct dělat na projektu kvůli odevzdaní projektu GMU :(
Může být, mj. v současnosti bych ani to ruční vyhodnocení neřešil, až pokud by byl čas, což nebude
To je celkem rána, protože tu Activity část's měl nastudovanou, resp. nemám moc projité ty Async věci ... prosil bych zbytek, aby se taky přidal, ať to neděláme dva...už jeden
Dneska ještě dodělám odesílání slov, aktivace nového kola
To bude skvělé, díky moc. Tak ať to GMU dáš v pohodě
Díky, myslím to bude v pořádku. Nevíš nahodou proč to haže chybu FileNotFoundException na řádku InputStream stream = connection.getInputStream(); v HttpConnect.post() když se snažím poslat slova? Musí se něco upravit na serveru nebo v aplikaci?
11-27 11:41:34.898: E/MessageQueue(2541): null
11-27 11:41:34.898: E/MessageQueue(2541): java.io.FileNotFoundException: https://fit.noxart.cz/tam/
11-27 11:41:34.898: E/MessageQueue(2541): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:186)
11-27 11:41:34.898: E/MessageQueue(2541): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
11-27 11:41:34.898: E/MessageQueue(2541): at cz.fit.tam.utils.HttpConnect.post(HttpConnect.java:107)
11-27 11:41:34.898: E/MessageQueue(2541): at cz.fit.tam.model.MessageQueue.sendMessage(MessageQueue.java:79)
11-27 11:41:34.898: E/MessageQueue(2541): at cz.fit.tam.model.GameClient.sendWords(GameClient.java:213)
11-27 11:41:34.898: E/MessageQueue(2541): at cz.fit.tam.model.Game.sendWords(Game.java:163)
11-27 11:41:34.898: E/MessageQueue(2541): at cz.fit.tam.PlayingActivity$SendWordsAsyncTask.doInBackground(PlayingActivity.java:241)
11-27 11:41:34.898: E/MessageQueue(2541): at cz.fit.tam.PlayingActivity$SendWordsAsyncTask.doInBackground(PlayingActivity.java:1)
Na serveru, už je to opraveno
Super, díky. Zatím ale server neodesílá odpověd' round_started
nebo game_finished
nebo něco špatně dělám...
Nevím jestli jsi něco opravoval nebo ne, ale už vidím zprávu round_started) asi to byla moje chyba
Aha, po debatě zakomentoval. Tak jsem to zase aktivoval. Navíc to pro účely round_started/game_finished už ignoruje staré zprávy.
Teď mě napadá, že nevim jak řešit uplynutí limitu, zatím je to jen po odeslání všech odpovědí, tzn. funguje, pokud odešlou všichni, ale kontroluje se aktuální počet, ne max. tzn. to jede i pokud hraješ sám a # hráčů = 1.
Asi to navážu na get_messages...jo, to by šlo
Jak navažeš na get_messages? Mohl bys to prosím vysvětlit?
Myslel jsem si, že pokud někdo skončí dřív, než uplyne ten limit, tak zmačne hotovo. Server na první takovou zprávu odpoví round_started. Na ostatní zprávy send_words pro ten round nebude odpovidat nic. Ten druhý hrač dostane zprávu round_started, a až tu zprávu dostane tak automatický se odešle to, co on vyplnil a přepne ho do nového kola.
Pokud uplyne limit, tak odešleme slova. Server na první takovou zprávu odpoví round_started. Na ostatní zprávy send_words pro ten round nebude odpovidat nic. Tym pádem ale všichni ostatní hráči dostanou zprávu round_started i když pro ně limit ne uplynul (to se asi muže stat kvůli tomu že někdo má rychlejší internet, nekdo pomalejší a nezačinaji vyplnovat kolo současně)
Možna rozumím tomu špatně.. pokud ano, prosím o vysvětlení
Aha ... máš pravdu, to mě nenapadlo, pošle se to samo. Tak okey. Pardon za zmatení
Ted' jsem zkusil odeslat slova v hře která má 2 kola. Server odpovídá zprávou game_finished 11-27 13:52:43.702: W/get_messages(1110): {"result":[{"id":"602","type":"send_words","data":"{\"words\":\",,,,\",\"round\":\"1\"}"},{"id":"603","type":"game_finished","data":null}]}
Hned po odeslání slov s round=1 to pošle game_finished? To je divné...mrknu na to
Hmm, nějak blbne fetchColumn ... už by to mělo být opravené
Díky, už to funguje. Ještě jeden dotaz.. Zkusil jsem spustit dva emulatory aby bylo tam dva hrače. Tak pokud tam je dva hrače a jeden odešle slova, tak server neodesila pak round_started. Myslel jsem si že pokud jeden hráč vyplni, tak round se skončí, ne?
Aha, já myslel že až všichni, tak jsem to změnil, je to triviální
Super, funguje. Můžu tě taky poprosit abys udělal to tak aby server odesilal zprávu round_started jen po obdržení prvního výsledku tohoto kola? Protože ted' funguje to tak že round_started se odesila po obdržení odpovědi od každého hráče. Tým pádem po prvním roundu, pokud máme tří hráče, server odešle tří zprávy round_started, a po prvním raundu bychom přešli do čtvrtého.
aha, jasně :) to jsem nedomyslel
Tak teď snad?
Nic se asi nezměnilo ..
Když se dívám do databáze, třeba 184, tak se zdá, že to funguje dobře, po 1. send_words už to nehází round_started pro další z toho kola ... přístup do DB máš, že?
Přístup do DB mám, ted' se na to dívám...
už vidím.. byla to chyba v mém kodu. po obdržení zprávy nastavoval jsem nové aktuální kolo a pak jsem odesílal slova. Mělo by to byt naopak) Pardon
V pohodě, hlavně že se na to přišlo
Přidal jsem odesílání slov, aktivace nového kola, přechod do Activity RoundEvaluation v případě zprávy game_finished. Ted to funguje trochu zvláštně: ten, kdo ukončí kolo první, odesílá slova (stejná) dvakrát. To nevadí nebo bude lepší když to upravím?
Myslim že ne, kdyžtak to nějak pak upravim
Dobrá práce!
Díky. Neřekl bych že je dobrá (ma bagy), ale aspon nějak funguje. Chci se zepat jak to je s vyhodnocením opdovědi? Rozumím tomu správně že po skončení všech kol server odešle výsledky všíchnim hračům?
Mělo by to být spíš po kole ... což znamená, že před začátkem kola by měl server stihnout dostat všechny odpovědi a vystavit zprávu s hodnoceními... Ale pokud se to nestihne, tak holt až na konci
Mohli bychom se dneska potkat ve Skypu a domluvit se o tom? Mám s toho trochu zmátek.
S pohledu uživatele asi lepší by bylo kdybychom ukazovali výsledky po kole. S pohledu implementace je trochu jednodušší to úkazovat na konci.
V případě ukazování po kole, vidím to tak 1) nějaky uživatel odešle slova (a to nezaleží na tom jestli odesila po uplynuti času nebo po zmačnuti send_words) 2) server odešle zprávu round_ended 3) všichni odešlou slova, přejdou do obrazovky výsledku kde zatím žadné výsledky nejsou, všíchni čekaji na vysledky 4) server odešle zprávu s vysledky až dostané slova od všech uživatelů 5) výsledky se zobrazi na obrazovce uživatelů 6) pokud ten round nebyl poslední admin bude moct zmačknout tlačítko StartNextRound. Pokud ten kolo bylo poslední každý bude moct zmačknout tlačítko ShowFinalResults.
V případě ukazování na konci 1) nějaky uživatel odešle slova (a to nezaleží na tom jestli odesila po uplynuti času nebo po zmačnuti send_words) pokud to není poslední kolo: 2a) server odešle zprávu round_started 3a) všichni odešlou slova, přejdou do nasledujicího kola pokud to je poslední kolo: 2b) server odešle zprávu game_ended 3b) všichni odešlou slova a přejdou do obrazovky s vysledky kde zatím žádné vysledky nejsou 4b) až server obdrží slova od všech uživatelů, odešle velkou zprávu s vysledky pro jednotlivá kola. 5b) výsledky se zobrazí
Určitě, jen nechám doběhnout analýzu disku. Nějak mi to tu blbne, asi to bylo Comodo, ale projistotu...
Se vším souhlasím, akorát varianta "po kole" by šla zjednodušit takto: 5) Výsledky se zobrazí na obrazovce uživatelů a začne odpočet do začátku dalšího kola 6) -není-
Tzn. nové kolo se nepouští manuálně, prostě po konci jednoho kola se za X sekund spustí další. Přičemž dostávají informaci o čase, takže když to někdo obdrží trochu později, odpočítá se méně a začne to stejně. Jediný problém by bylo, kdyby zpoždění bylo větší než čekání, ale to holt prostě se připojí pozdě. A měl by se mu odečíst ten čas z kola.
To by myslim nevyžadovalo velké úpravy. Co se týče serveru, akorát k vystavení výsledků přidám zprávu o novém kole.
Kdyžtak napiš jestli souhlasíš. Úpravu serveru dělat můžu, aplikace až večer. Nemám tu wifi a na tomto PC (ač win7) mi prostě nejede ani reverse tethering, ani se mi nepodařilo zprovoznit emulátor.
Zjednodušení - souhlasím "Co se týče serveru, akorát k vystavení výsledků přidám zprávu o novém kole." Zprávu o novém kole server už odesíla, ne? Nemuselo to byt naopak "k zpravě o novém kole přidám vystavení vysledku"? Taky jsem psal, že musela by se přídat zpráva o ukončení kola. Nebo to je zbytečný, co myslíš?
Máš pravdu, odesílá ... tu bych měl tedy změnit na zprávu o ukončení kola, protože ta tam vlastně není, a doplnit ten start nového kola za odlišné podmínky.
Asi ne, měl by to být signál pro ostatní hráče, že někdo už odevzdal a má se jim ukončit kolo a odeslat výsledky ... chápu to dobře?
"Asi ne, měl by to být signál pro ostatní hráče, že někdo už odevzdal a má se jim ukončit kolo a odeslat výsledky ... chápu to dobře?" Ano, to jsem měl na myslí. Ale ted' mi napadlo že takovým signalem může byt zpráva round_started. Někdo odešle slova, server odpovědí zpravou round_started, všichni odešlou slova a přejdou do obrazovky čekaní na vysledky. Až vysledky od servera dostanou, tak začné odpočet do počatku nového kola.
Tým pádem potřebujeme o jednu zprávu méně. A na serveru by se muselo přidat jen zpráva o hodnocení. Co myslíš?
Ano, jen spíš obráceně:
1) Někdo odešle slova 2) Vystaví se round_ended 3) Tím odešlou slova ostatní 4) Po obdržení všech vystaví server round_started, obsahem: round, hodnocení minulého (u 1. kola v této zprávě bude chybět, 0. nebylo), datetime začátku dalšího kola
Čistější by bylo rozdělení round_started na scores + round_started, ale toto bude jednodušší
Mj. písmena už se vybírají náhodně váženě podle toho, kolik je jich zastoupených v databázi, tzn. q,w,x,y by měly být jen výjimečně
Souhlasím. Chci se ještě zeptat kdy přibližně doděláš vyhodnocení? Přemyšlím jestli stihneme to udělat do útery nebo ne..
Ohledně round_started a datetime začátku dalšího kola - bude to v milliseconds..? Pro první kolo to se také odesila, že? Ted' s tím nic nedělám a prostě startuji kolo až dostanu zprávu round_started
Dnes večer to určitě bude.
Viděl bych to normálně unix timestamp, ten je asi seconds. Posílá se cílový čas, kdy kolo začne, takže milisekundy nejsou potřeba
Ano, pro první se taky posílá, aby tam bylo pár vteřin na připravení se
Mechanismus evaluace by měl být (ještě nepřidává zprávy) ... mohl bys prosím zkusit v nové hře odehrát pár kol, abych to mohl otestovat?
Odehral jsem tří kola. Ale asi neuvedl jsem žádnou správnou odpověd
To nevadí, díky. Budu teď cestovat, ale jak dojedu, tak to dodělám
Teď už by to mělo dělat ten mechanismus, který jsme tu popisovali, snad to je správně
Evaluace zatím nekontroluje, jestli jsou slova i v databázi ... jenom jestli je vyplnil hráč sám nebo i ostatní (ale doplnit tu kontrolu nebude problém)
Hlavně že odesila výsledky. Za hodinu budu doma a začnu na tom pracovat..
Opravil jsem tak teďka chybu, že startovalo nové kolo se stejným $round, ne $round + 1...ale asi byste napsali, kdyby se to u nahrávání nějak projevilo
Projevilo se to u nahravaní, ale myslel jsem si že to je chyba v mém kódu) Nahrali jsme dvakrat první kolo, Katka tam pak přídá obrázek aby to vypadalo, že to je druhé kolo.
Ok, dobře, omlouvám se ... kdyžtak ještě až dokončíme tady toto, tak to může přidat
Za chvílu teda víc testnu tu evaluaci
Jinak zatím bych skryl ve vytváření hry (a seznamu her pokud je) to nastavení evaluace
Akorát je drobnost, že pro finální hodnocení se musí vytáhnout ještě kolo round_limit + 1
Už by mělo být možno posílat hráčova slova
Na server jsem přidal handler, že pokud
zpráva == send_words & count(unique(send_words od hráčů v daném kole)) == player_count
, tak se aktivuje nové kolo přidáním zprávyround_started
, stejně jak to bylo minulé kolo. Pokud ovšemround == round_limit
, tak se místo toho přidágame_finished
.Jakmile bude nějaká databáze (wink, wink), tak přidám ještě před to vložení zprávy o bodech hráčů
Takže s vynecháním bodování by už mělo být teoreticky možné dodělat komplet hraní hry?
(updatována wiki - dole message)