La struttura pensata prevede classi (oggetti) stanze e classi (oggetti) giocatore sul server.Ho capito cosa dici, non capisco perché e come dovrebbe generar eil problema il cambio turno.
Quando il client invia la sua risposta ma con 11 secondi di ritardo il server Invia una contro risposta dicendo che fuori tempo.La struttura pensata prevede classi (oggetti) stanze e classi (oggetti) giocatore sul server.
Quando il server invia il "comando" "tocca a te" ad un client, dovrà partire un countdown (devo ancora decidere se, come e dove, pur avendo fatto prove), mettiamo di 10 secondi, come è su Zynga.
Mettiamo che il client subisca un rallentamento di ben 11 secondi (può capitare); riceverà il comando dal server a tempo scaduto.
Il server, non ricevendo un comando dal giocatore, gli farà passare il turno o eseguirà una giocata al posto del giocatore e proseguirà, eseguendo qualcosa o passando il turno ad un altro giocatore.
Passati gli 11 secondi di ritardo, il client riceve il comando "tocca a te" e consente al giocatore di compiere la sua mossa, cosa che invece è già stata fatta dal server ed il giocatore non lo sa, penserà di essere in tempo ed i comandi successivi che riceverà saranno un casino.
https://www.b4x.com/android/forum/t...layer-a-turni-online.88812/page-4#post-573416Un'altra cosa importante, è che tu numeri messaggi,
Leggi solo il type - rappresenta un comando e, come hai suggerito, prevede un id comandoTroppo lungo, di mattina mi fai sfruttare il cervello
Ambo sicuro ad ogni estrazione? Quanto si incassa? Almeno l'equivalente di un caffé con o senza cornetto?N.B. per "vincente" si intende due numeri indovinati, non il 6
Rispondo prima a questo, poi leggo il precedente, più complessoAmbo sicuro ad ogni estrazione? Quanto si incassa? Almeno l'equivalente di un caffé con o senza cornetto?
Per questo si può fare qualcosa di simile, senza dover chiudere la connessione, ovvero valutare il comando che il client invia al server (magari solo l'ID del comando, è da studiare) ed il server, anziché chiudere la connessione, potrebbe inviare un comando tipo "ricarica la situazione".Per rimanere sul classico, invece, giunto al termine dello slot temporale concesso ad un giocatore per il suo turno, al server non basterebbe chiudere il websocket di quel giocatore che quindi riceverebbe un evento del tipo "connessione chiusa, riapri e ricarica nuova situazione" ?
E' una complicazione, in quanto:utilizzare MQTT
Ottimo, così sono costretto spiegarmi meglio..ehehLa prima parte, zero assoluto
Per questo suggerivo la possibilità di chiudere e riaprire. Ciò scatenerebbe un evento che esula dalla "coda dei comandi" e permetterebbe di ripartire puliti.Ma il punto è che i comandi sono consecutivi, accodati...
Al contrario. Con MQTT (e i messaging in genere) puoi inviare messaggi "privati" tra due client; il messaggio passerebbe comunque tramite broker, ma sarebbe ricevuto solo dal destinatario prescelto.tranne quella da client a client direttamente, ma ritengo che anche questo sia impossibile usando MQTT
Se capisco bene, intendi una pagina web continuamente aggiornata da un server. Sarebbe una buona soluzione alla sincronizzazione (forse, dubbi ne ho sempre, finché non provo ) ma non saprei proprio da che parte cominciare. Come minimo bisognerebbe conoscere HTML5 e quasi certamente robaccia java, come javascript, javabean, javayoursister, etc. Suggerisci ABMaterial ma non so se sarebbe sufficiente e non conosco nemmeno questo.Ottimo, così sono costretto spiegarmi meglio..eheh
L'idea è che esista una webapp (per rimanere in B4x immagina ABMaterial+B4J) che giri su un server e gestisca interamente il gioco. All'inizio la webapp ha collezionato gli IP dei giocatori presenti ad uno specifico tavolo. Poi avvia il gioco, concedendo al primo giocatore il suo slot di 10 secondi per decidere cosa fare. In questo lasso di tempo eventuali "Click" degli altri giocatori vengono ignorati. Se il giocatore1 effettua la sua mossa nei 10s , il server aggiorna la situazione e passa al prossimo.
Nei 10s, il server aggiorna continuamente la pagina del tavolo creando di fatto le animazioni (es. il countdown per il giocatore di turno).
Intanto, localmente, ogni giocatore vede il tavolo e le sue animazioni come se avesse aperta una finestra sul server (in pratica una webview aggiornata ogni x secondi).
Sarebbe come richiedere ad un webserver la stessa pagina (aggiornata ad esempio ogni paio di secondi) da parte dei 4/5 giocatori.
Se la connessione è lenta, ogni richiesta del giocatore mostrerà la pagina comune del tavolo nello stato in cui si trova al tempo della richiesta (e quindi andrà per salti), mentre se cade del tutto allora il server prenderà nota del nuovo IP in fase di lgin e anche in quel caso riprenderà trasmettendo la visualizzazione corrente della pagina-tavolo.
Tutto questo per avere la gestione del tempo esclusivamente sul server e quindi evitare ogni necessità di sincronizzazione.
Ma il punto è che nel momento in cui il server chiudesse la connessione oppure inviasse un comando di stop-ricarica potrebbe, probabilmente sarebbe, troppo tardi, l'utente vedrebbe tutto normale e tenterebbe di agire normalmente.Per questo suggerivo la possibilità di chiudere e riaprire. Ciò scatenerebbe un evento che esula dalla "coda dei comandi" e permetterebbe di ripartire puliti.
Appunto, passerebbe comunque per il broker, che altro non è che un server; anche con i websocket puoi inviare qualcosa solo ad un determinato client, sia un'informazione dal server al determinato client, sia una comunicazione da un client ad un altro, passando per il server.Al contrario. Con MQTT (e i messaging in genere) puoi inviare messaggi "privati" tra due client; il messaggio passerebbe comunque tramite broker, ma sarebbe ricevuto solo dal destinatario prescelto.
Ieri sono andato a giocare.Ambo sicuro ad ogni estrazione? Quanto si incassa? Almeno l'equivalente di un caffé con o senza cornetto?
Non male! Hai potuto giocare a ben due giochi e ti è costato solo un euroBeh, spesa 3+3 euro, in realtà ho incassato 2,xx+2,xx, avendo vinto ad entrambi i giochi poco più di 5€.
Vedrebbe la situazione aggiornata e quindi potrebbe essere ancora in gioco (ha ancora x secondi a disposizione) oppure aver saltato il turno (e quindi vedrebbe la mossa giocata dal server per lui). Ovviamente la ricarica dovrebbe avere l'effetto di settare qualcosa che permetta di ignorare eventuali vecchi comandi che dovessero arrivare in seguito.Ma il punto è che nel momento in cui il server chiudesse la connessione oppure inviasse un comando di stop-ricarica potrebbe, probabilmente sarebbe, troppo tardi, l'utente vedrebbe tutto normale e tenterebbe di agire normalmente.