È passato un po’ di tempo da quando avevo detto di aver cominciato a lavorare sul progetto della Bisca online. Da allora mi sono laureato, sono andato a trovare dei miei amici in giro per l’Europa, ma ce l’ho anche fatta ad andare avanti col progetto, tanto che ce n’è anche una versione online qui, sul mio VPS.
Il frontend è stato fatto senza usare alcun framework, l’unica dipendenza da terzi è socket.io, che uso per gestire i vari eventi su websocket, per il resto ho implementato tutto io. Comunque non è troppo curato e, di sicuro, se vorrò continuare con questo progetto, dovrò sistemarlo. Anzi, il Javascript che gestisce il gioco potrebbe essere un esempio di come non scrivere codice in questo linguaggio 😅️ .
Ma ciò di cui voglio parlare in questo articolo non è tanto il frontend, quanto il backend.
Come avevo già accennato, avevo valutato di usare il server ufficiale di socket.io, scritto in Javascript per Node.js, ma alla fine ho deciso di usare il port in Python.
Bisca come gioco non è difficile, tuttavia ci sono alcune cose a cui bisogna prestare attenzione.
La prima è l’asso di denari, che può essere sia la carta più bassa, che la più alta del gioco.
Un’altra cosa è che bisogna stare attenti a gestire correttamente gli stati. In particolare tra un giro e l’altro, o tra una mano e l’altra, i turni non continuano, ma si riprende da chi per ultimo ha preso le carte (essere primo di mano può essere abbastanza uno svantaggio, ed essere l’ultimo invece è vantaggioso, perché si hanno molte più informazioni, specialmente nella fase di scommessa).
Come approccio di sviluppo, ho deciso di sviluppare una classe per la gestione del gioco che faccia il minor numero di assunzioni possibili: nessuna assunzione sull’interfaccia del gioco (potrebbe essere un local multiplayer, anziché un gioco via rete), nessuna assunzione sull’oggetto che viene usato per identificare i giocatori, se non che deve ammettere hash, in modo da fare da chiave per un OrderedDict
e addirittura un numero ridotto di assunzioni sulle carte stesse.
Infatti, la classe che gestisce le carte può essere specificata come argomento del costruttore della classe Game
e qualsiasi classe può essere specificata, purché implementi:
- le relazioni d’ordine (per verificare quale sia la carta “massima”);
- il meccanismo della carta alta/bassa;
- un metodo per ottenere dalla carta una lista, da passare all’encoder JSON;
- un
classmethod
per la distribuzione delle carte stesse.
Inoltre ho pensato la classe Game
affinché sia estendibile, anzi, l’etensione è un modo per ricevere tutta una serie di eventi, quali la richiesta per un giocatore di scommettere o di fare la sua mossa.
Queste decisioni si sono rivelate abbastanza buone al momento di scrivere l’interfaccia Bisca-Socket.io: fondamentalmente si è trattato di fare l’override di quelle varie callback affinché emettessero un evento, più creare tutta una serie di handler di eventi che facessero un po’ di controlli e sanificazione dell’input, prima di chiamare i vari metodi della classe Game
.
L’unico problema che ho riscontrato, è che la mia funzione per gestire gli stati e mandare avanti il gioco (letteralmente, forward_game
) a volte è un po’ precipitosa: per esempio, finito un giro o una mano, distribuisce subito le nuove carte. Magari in futuro potrei inventarmi qualcosa per cambiare questo comportamento.
Ho sfruttato questo progetto anche per migliorarmi in alcuni aspetti che volevo analizzare da tempo, uno tra tutti il test automatico.
Qualche volta lo avevo già effettuato, ma sempre controvoglia, invece questa volta mi è piaciuto, mi sono stati super utili, anche se in realtà me ne manca ancora qualcuno da implementare.
Un altro strumento che finora avevo sempre sottovalutato, invece, sono i linter: da anni sono abituato a programmare principalmente nell’editor di testo, senza avere più di tanti aiuti, se non l’evidenziazione della sintassi.
Ho deciso di provare un linter basato su flake8
per Python e un linter per standard js per Javascript. Onestamente penso che mi abbiano fatto risparmiare davvero tantissimo tempo, quindi sono felice di averli abilitati e penso non tornerò più indietro.
Per il frontend invece non ho molti commenti da fare, se non che potrebbe essere migliorato parecchio. Dei miei amici mi hanno già dato alcuni feedback, in particolare su alcune ottimizzazioni da fare per i dispositivi mobili.
Per il momento però vi lascio il download di quello che ho fatto finora, e vi invito a provare il gioco stesso, qualora ne abbiate voglia 😊️ .