Italian Non solo Penelope - client/server per giochi multiplayer a turni online

Star-Dust

Expert
Licensed User
Longtime User
Mi sembra di ricordare che si parlava di una serata romatica. Poi se giochi bene le tue carte..
Romantica... O Roma Antica? E soprattutto con chi?
 
  • Like
Reactions: udg

udg

Expert
Licensed User
Longtime User
E soprattutto con chi?
Penny!
Magari romantica in giro per Roma Antica
 

LucaMs

Expert
Licensed User
Longtime User
Con Penelope avrai la straordinaria occasione di vincere milioni e milioni di dollari finti. Non solo, addirittura potrai acquistarli e, udite udite, pagandoli con euro (o dollari) veri!!!

Avrei da darvi anche un ambo sicuro per domani, ma dato che raramente la fortuna capita a più persone contemporaneamente, temo di non poterverlo dare.

Vorrà dire che incasserò io 890€, va ("investimento": 5€).
 

LucaMs

Expert
Licensed User
Longtime User
Avrei da darvi anche un ambo sicuro per domani, ma dato che raramente la fortuna capita a più persone contemporaneamente, temo di non poterverlo dare.
C'ho ripensato.
Quando cade un aereo, la sfiga colpisce tutti insieme. Quando atterra male, si schianta ma tutti si salvano, altrettanto comune è la fortuna.
E poi, l'unione fa la forza; magari l'unione della speranza di vincere...!

Direi che potreste giocare su Cagliari 76 - 21 - 4€ (incasso netto 880€) + 1€ per l'estratto (incasso netto con l'uscita di uno dei due 4,90€) oppure questo euro puntarlo solo sul 76 - incasso doppio - 9,80), fate voi.

Dal canto mio giocherò:
Cagliari 76-21 - 900€ (198.000€) e 100€ sul solo 76 (980€). Ovviamente se uscisse l'ambo sarebbero 198.000 + 980 !


P.S. Basta con le stupidaggini, riprendo il filo (o forse mi metto a sviluppare un server per A9, benché sia una'app senza futuro; questo, almeno, mi obbligherà a "prendere" un VPS ed impegnarmi di più con Penny).
 

Star-Dust

Expert
Licensed User
Longtime User
Lo seguirò, su che canale?

Ti vedremmo in tv?
 

LucaMs

Expert
Licensed User
Longtime User
Lo seguirò, su che canale?
"Striscia la notizia", Canale 5.

Ti vedremmo in tv?
Hanno telecamere costose, alle quali tengono molto, non vorrebbero metterle in pericolo inquadrando la mia brutta faccia :p.
No, quasi certamente non verrà nemmeno accennato il fatto che io abbia fatto la segnalazione e pubblicato anche l'app "Striscia il Superenalotto", che in teoria aveva lo stesso scopo del servizio di Striscia, scoperchiare la "magagna" (come direbbe lo stura ingiustizie di Striscia :D).
 

udg

Expert
Licensed User
Longtime User
Il servizio andrà in onda la prossima settimana
Un ottimo risultato. Complimenti!
Magari avranno il buon gusto di citarti e ringraziarti per la segnalazione. Ad ogni modo, che se ne cominci a parlare era ciò che desideravi e il risultato è raggiunto.
 

LucaMs

Expert
Licensed User
Longtime User
Non credo che citeranno né me né l'app. Ovviamente mi farebbe piacere ma me ne avrebbe fatto ancora di più se avessi pubblicato "Penelope"; in questo caso avrei spinto io stesso affinché citassero perlomeno l'app (Striscia il Superenalotto).

Hai ragione, per me è già una soddisfazione che vengano a galla certe cose sporche consentite, se non addirittura messe in atto, dallo Stato!
 

LucaMs

Expert
Licensed User
Longtime User
Formato il tavolo dei giocatori, il sever invierebbe un messaggo al primo di turno invitandolo ad effettuare la sua mossa (attivando un countdown sul server stesso).
Se entro il termine del countdown il server riceve la mossa, la inoltra tramite MQTT a tutti i giocatori che così hanno modo di aggiornare localmente lo stato del gioco sincronizzandosi con il server e gli altri.
Se entro il countdown non arriva la decisione del giocatore, il server seleziona una mossa sostituitiva che comunica a tutti i giocatori (compreso ovviamente quello che avrebbe dovuto giocare).

In caso di caduta collegamento, al ripristino il giocatore riceverebbe tutti i messaggi MQTT in coda per lui e quindi vedrebbe una dopo l'altra le animazioni che lo riporteranno allo stato attuale del gioco.
[Malgrado io attualmente stia tendando di realizzare l' 1-1 per A9 - per il momento sto solo tentando di realizzare una sorta di registrazione-login il più elastico possibile, ovvero riutilizzabile, in sottofondo penso anche a "Penelope", quindi riprendo il post di @udg per qualche considerazione]

Se entro il termine del countdown il server riceve la mossa, la inoltra tramite MQTT a tutti i giocatori
Inviare messaggi tramite MQTT ritengo sia relativamente semplice; ma anche tramite il websocket server lo è, forse ancora di più.
Ogni qualvolta un client si connette, viene creata automaticamente un'istanza di una classe "speciale", di tipo "websocket handler". Questo oggetto, perlomeno nella mia implementazione ma penso sia il modo migliore, rappresenta appunto il client e, più o meno, l'utente. Inserendo tutti questi oggetti in una map (attualmente in una map inserita in un oggetto "stanza di gioco") è poi molto semplice inviare dati a tutti o alcuni utenti-client.

Se entro il termine del countdown il server riceve la mossa, la inoltra tramite MQTT a tutti i giocatori che così hanno modo di aggiornare localmente lo stato del gioco sincronizzandosi con il server e gli altri.
"sincronizzandosi con il server e con gli altri"... non è detto, perché potrebbero ricevere l'nformazione in ritardo - anzi, sicuramente, ma se le cose andassero come dovrebbero, senza eccessivi rallentamenti, il ritardo sarebbe minimo, ininfluente; ma non si può contare su questo.


Dunque ho due problemi principali:
1) decidere se tentare di sfruttare le risorse dei client - CPU - per alleggerire il carico sul server oppure, come è adesso, il server gestirà praticamente tutto;
2) la sincronizzazione.

Per quanto riguarda il punto 2, ho giocato a Zynga Poker ed effettuato una "videoregistrazione". Non ho molta voglia di pubblicare il video su Youtube e, purtroppo, non è possibile inserirlo direttamente qui. Provo a prelevarne qualche fotogramma per spiegare cosa intendo dire.

Durante la partita ho volontariamente sospeso l'app, ovvero premuto il tasto Home, per poi tornare al gioco e vedere se venissero eseguite tutte le animazioni perse durante la pausa oppure soltanto aggiornato lo stato. Per qualche secondo riprende-prosegue la "animazione countdown" iniziata prima della mia pausa, ma poi il tutto viene aggiornato all'ultima situazione.

Forse esiste una sorta di lista messaggi, numerata progressivamente, e quando il client invia al server una notifica circa la propria riconnessione, questi gli invia la lista a partire dal numero salvato sul client in poi e l'app aggiorna lo stato, non esegue tutto.

Non semplicissimo, anche perché nel caso citato ho messo in pausa l'app ma la "risincronizzazione" potrà - forse spesso - essere necessaria anche solo in caso di rallentamenti di connessione, anche quando l'app sia in foreground.

Se riesco a farlo bene :D allego i "fotogrammi" al post successivo.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
So che vi interessa poco (per usare un eufemismo :D) ma tutto questo perlomeno mi aiuta a ragionare ("dice": "e fallo per conto tuo" :p. Giusto, ma è meno divertente :D).

Prima della pausa/sospensione. Il "cane" in alto ha il turno, iniziato il suo countdown:
upload_2018-2-16_15-14-15.png



Dopo aver riattivato l'app (messo in pausa usando Home e poi riattivata dalle recenti):
upload_2018-2-16_15-15-52.png



"Improvvisamente", visualizzazione nuovo stato - il turno era passato in senso orario, ai due giocatori alla mia destra (io sono l'alieno) e poi a me - il gioco ha deciso in vece mia che io volessi "passare", non partecipare. Il turno è quindi passato al personaggio nero (Star wars?) e si vede il montepremi a 10.500$, dopo le puntate effettuate dai 3 giocatori che hanno partecipato:
upload_2018-2-16_15-19-6.png
 

LucaMs

Expert
Licensed User
Longtime User
Altra cosa che "stupisce" è che, terminata la partita, una dialog ti chiede se vuoi rigiocare, stesso tavolo, stesso capitale iniziale.
Se NON confermi, e comunque anche mentre è visualizzata la dialog, vedrai "gente" entrare nella stanza (e chissà, magari se attendi che questa sia piena, vedresti anche il gioco iniziare e proseguire), pur non essendo tu al tavolo.

Ok, torno ad A9, poi penserò a tutto questo... maremma dissociata!
 

LucaMs

Expert
Licensed User
Longtime User
Per l'ennesima volta, ho la forte tentazione di rifare la parte già fatta.

Tra le tante cose che mancano, c'è la cifratura. Ora leggo che SSL non è sicuro e che si usa TLS; ma questo è implementato in b4j-b4a? Non mi pare.
https://it.wikipedia.org/wiki/Transport_Layer_Security



[senza contare che, almeno per il momento, non posso creare chiavi SSL, non possedendo un dominio]


Pensare che è un'idea di almeno 4 anni fà e se l'avesse sviluppata una sw house a quest'ora avrebbe già incassato svariate centinaia di migliaia di euro sicuramente.

Mi cadono le braccia (e non solo quelle!).
 

LucaMs

Expert
Licensed User
Longtime User
Tra le tante cose che mancano, c'è la cifratura. Ora leggo che SSL non è sicuro e che si usa TLS; ma questo è implementato in b4j-b4a? Non mi pare.
https://it.wikipedia.org/wiki/Transport_Layer_Security
TLS v1.1 is disabled in the latest version of jServer, as it is disabled in the underlying Jetty SDK.
It is considered a weak protocol and should be kept disabled in most cases.
Ecco, qui Erel pare dire l'opposto, che TLS sia un protocollo "debole"! MAH!
 

LucaMs

Expert
Licensed User
Longtime User
Help :)

Due fotogrammi consecutivi prelevati da un video che ho fatto durante una partita a Zynga Poker:

upload_2018-3-14_12-18-59.png


Il cagno sopra ha il turno - la freccia indica la "progress circle" attiva per il countdown per il tempo a disposizione dell'utente.
Il fotogramma indica l'esatto momento in cui l'utente decide di partecipare (puntare); fatto questo, il turno passa all'utente successivo, il cagno di sotto;
upload_2018-3-14_12-21-4.png

In questo momento (fotogramma successivo, quindi si tratta di 4 centesimi di secondo, probabilmente), parte l'animazione per il countdown per il secondo "cane" (contemporaneamente un'animazione per la cifra puntata dall'utente precedente).

Questo non può essere stato gestito dal server, tempi infinitesimali; il server avrebbe dovuto ricevere dal primo utente la cifra che questi ha puntato, farne ciò che deve fare e passare il turno all'utente successivo (informando tutti gli altri utenti, i quali dovranno vedere sia la puntata effettuata dal primo giocatore, sia il passaggio di turno al successivo).

Ma non è nemmeno possibile che avvenga soltanto in locale, appunto perché il tutto dev'essere visto anche dagli altri utenti.

Come pensate che sia architettata la cosa?
 
Last edited:
Top