Finalmente, dopo un paio di mesi, ho preso coraggio ed ho deciso di rimettere mano sulla mia app. In realtà questa ha bisogno anche (direi quasi soprattutto) di un "server personalizzato" e mi sono accorto che... quel poco che ho fatto, pure male, ha bisogno di essere totalmente rivoluzionato.
Qualuno ha voglia/tempo di "ragionare" con me in termini teorici su come debba essere strutturato questo server?
Provo a spiegarmi (leggermente) meglio.
A me serve in modo specifico ma vorrei sviluppare una sorta di server base per giochi multiplayer online a turni (ad esempio un gioco di poker classico, 5 carte).
L'idea sarebbe di riuscire a svilupparlo talmente bene, talmente ben organizzato-strutturato-"modulato", che in serguito si possa facilmente modificare per adattarlo ad altri tipi di gioco, sia di carte che non (che so, anche volendo farci un tressette o il gioco dell'oca).
Penso di dover riscrivere (riprogettare) la parte sviluppata sia perché non me gusta ma soprattutto perché fin dall'inizio avevo pensato di creare anche dei BOT (giocatori finti) da far intervenire nelle stanze in cui non si riesca a raggiungere il numero minimo di giocatori umani, altrimenti la partita non avrebbe inizio.
Il server è un web server B4J ed avevo fatto in modo che la classe websocket handler rappresentasse un giocatore, ma questo non è possibile se il giocatore è un BOT.
Va beh, la sto facendo troppo lunga. Vi sto chiedendo se siete interessati-disponibili a progettare un web server di questo tipo ma non dal punto di vista della programmazione vera e propria (B4J) ma della logica, magari usando strumenti per creare diagrammi (cosa che non faccio da un'eternità, tanto che non so nemmeno se ne ho sul pc).
Ad esempio:
1) una classe websocket handler può essere considerata soltanto un "canale di comunicazione" con un generico utente (in questa classe, tramite chiamate ad un modulo DB avverà la registrazione-autenticazione utente);
2) si potrebbe avere una generica classe clsUser dalla quale dovrebbero derivare classi più specifiche clsPlayer e clsBOT, oppure no? Basterebbe una classe e poi usare dei flag che indichino che tipo di utente è quello "corrente"? C'è da ricordare che B4X non consente ereditarietà-polimorfismo, classi astratte, interfacce etc. Per questo stavo iniziando qualcosa di questo tipo (non ero ancora arrivato a verificare la logica):
E' proprio il primo abbozzo, scritto in due minuti.
la wshUser è la web socket class; sotto, qualche esempio di "codice" output/input che dovrebbe gestire.
clsUser rappresenterebbe un generico utente; avrebbe un oggetto ws di tipo wshUser per comunicare e dati vari
clsPlayer sarebbe una specializzazione della classe clsUser; per ottenere questo con B4X, utilizzerei un oggetto pubblico di tipo clsUser.
Stessa cosa per clsBOT che "eredita" (si fa per dire) da Player.
Ma potrebbe non essere giusto né necessario; magari basta una variabile TipoUtente per indicare se è un giocatore umano, un BOT o magari non sta giocando ma chattando (cosa che vorrei aggiungere in parallelo al gioco - o meglio, l'utente dovrebbe scegliere se entrare in una stanza da gioco o in una chat).
Troppo lunga e mal spiegata; parte di questo deriva dal fatto che il BOT avrà il suo modo di giocare (io preferisco farlo totalmente stupido per non far incacchiare i giocatori umani) e di comunicare le sue giocate (nonché ricevere quelle degli altri) in maniera diversa da un giocatore umano; da cui la necessità di ripensare a quello che era la classe web socket handler rappresentante un utente/giocatore.
Ah, una cosa da tenere in considerazione sono i thread, per questioni di performance del server; quindi si dovrà fare in modo che buona parte del codice giri nel thread relativo al singolo utente, ovvero alla classe web socket handler! (ed anche il codice che gestisce gli accessi al db centrale).
Insomma, il tutto è molto meno semplice di quanto sembri. Se qualcuno ha voglia di scervellarsi... altrimenti mi metto lì a modificare quanto fatto finora
Un web server del genere (dimenticavo: i client B4A, non browser), progettato bene, sviluppato bene in modo che sia facilmente adattabile ad altri giochi, sempre a turni, PER ME sarebbe una manna (non dal cielo
).