Bonjour à tous !

j'avance sur mon projet de jeu de plateau pour 3 ou 2 joueurs; mais je rencontre quelques difficultés pour intégrer correctement la logique de jeu dans une application SvleteKit avec ses Stores réactifs.

Résumé: modes de jeu

il y a en principe 4 (x2) modes de jeu à coder, dans cet ordre:

* DEMO-3 et DEMO-2: mode de démonstration avec bot players (random au début), local, 3 ou 2 bots, sert à tester les règles du jeu, et à montrer au visiteurs du site comment jouer avant de le faire quand ils sont prêts;

* SOLO-3 et SOLO-2: mode entraînement, un joueur physique réel local, contre 2 ou 1 bots locaux;

* NET-3 et NET-2: 3 ou 2 joueurs distants, pas de bots, serveur à l"écoute avec SocketIO;

* REPLAY-3 ou REPLAY-2: capacité à rejouer l'historique des parties localement (SOLO) ou réseau (NET) à l'initiative des joueurs qui viennent de terminer leur partie

Bien entendu j'aimerai pouvoir utiliser le même plateau de jeu, sans avoir à en ré-écrire tous les composnants pour chaque mode. J'utilise SvelteKit et ses stores (writable et derived) pour représenter cela et du SVG pour le rendu du plateau.

Il est à noter que certains des stores du jeu sont des stores personnalisés qui reprennent des automates (finite state machine) pour différentes usages:

* modal-machine: gère les enchainements de fenêtees , menus et aire de jeu, splash screens (READY et GAME OVER) et cela fonctionne très bien;

* turn-machine: présentée ici en pièce jointe, reprend les enchaînements d'états pour la validation des tours de jeu par la pairs (validation distribuée des règles du jeu avec serveur qui fait juste le relai ("passe-plats"); C'EST LA DIFFICULTE mais aussi la beauté de la chose...

* action-machine: étapes de réalisation d'une action de jeu, nom de l'action, case de départ, case d'arrivée e figure choisie optionnelles. Réagit à des appuis sur le panneau de commande en bas du plateau ou à des saisies directes sur les cases du plateau. (testé, cela fonctionne)

REMARQUE:

j'ai opté pour un système de validation par les pairs (en mode NET) dans lequel les joueurs ne s'échangent que des actions de jeu, et des sommes de contrôle de l'état du jeu pour valider de façon distribuée chaque tour de jeu.

C'est un façon de limiter la charge sur le serveur. Le hack est limité par l'utilisation de sommes de contrôle : je pars de toutes façon du principe optimiste qu'on n'a pas besoin d'arbitre externe quand on joue aux cartes chez soi entre amis ...

Cette validation se fait en deux étapes:

* échange de l'action de jeu et des sommes de controle du plateau, comparaison/propagation des sommes de controle;

* si l'initiateur du tour de consensus de validation recoit la même somme que celle qu'il a calculé lui même, alors le tour est bon et on peut passer à la propagation de l'ordre de commit du plateau.

Le joueur qui initialise ses deux tours de validation est le joeur courant.

QUESTIONS:

* quel est votre avis ? Comment implémenter un Game/Player Controller à l'aide de stores réactifs ? Faudrait-il prévoir un module séparé des stores et des composants ? Je précise que j'ai codé le moteur de règles du jeu dans une lib spéarée, afin de faciliter les tests. Cette lib ne gère aucunement les apects de rendu graphique, puisque j'utilise SvelteKit et SVG...

* comment implemter la décision à qui le tour ? bot local, humain local ou humain distant ?

* faudrait il définir un graphe de dépendances entre les stores (writables et dérivés) à utiliser ?

* pour le mode NET : comment implémenter cela avec des stores Svelte et SocketIO ?

je recherche surtout des avis et des suggestions, pas besoin de grands morceaux de code, je pense savoir me débrouiller avec ce que vous me direz.



A + F - E

Nom : 20210912-fsm-and-board.png
Affichages : 109
Taille : 316,6 Ko