Seelies, un jeu de stratégie persistant - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Les réalisations de la communauté (https://jeuweb.org/forumdisplay.php?fid=39) +--- Forum : Jeux en développement (https://jeuweb.org/forumdisplay.php?fid=53) +--- Sujet : Seelies, un jeu de stratégie persistant (/showthread.php?tid=7996) |
RE: Seelies, un jeu de stratégie persistant - niahoo - 29-07-2019 (29-07-2019, 06:18 PM)Meraxes a écrit : Mais du coup par exemple, typiquement pour ce cas de TDD : imaginons qu'à un moment donné tu veuilles que le nb de ressources récupérées ait un petit delta (i.e. qu'il y ait une petite variation avec un random) alors tu devras réécrire ces tests-là ? Il faudra le réécrire, en s'aidant par exemple de assert_in_delta pour tester qu'un nombre est proche d'un autre dans une certaine limite.
RE: Seelies, un jeu de stratégie persistant - Meraxes - 29-07-2019 OK d'accord. (oui, donc là, du coup, c'est un exemple concret du fait que c'est le test qui va définir le comportement du jeu ; d'accord). RE: Seelies, un jeu de stratégie persistant - Sephi-Chan - 01-08-2019 Ces jours-ci j'ai bossé sur le convoyage de ressources. Citation :DepositsExploitationTest La suite du programme :
Il y a pas mal de cas d'erreur à gérer ici, mais ça ne devrait pas prendre trop de temps. Quand ça sera fait, j'aurai atteint ma première milestone et il sera temps de définir le contenu de la suivante. RE: Seelies, un jeu de stratégie persistant - Sephi-Chan - 02-08-2019 J'ai terminé le code pour charger/décharger un convoi. Je suis assez content du résultat. Voici les nouveaux cas que je couvre : Citation :ConvoysTest Pour représenter les quantités de ressources, je raisonne avec des maps qui sont comme des value objects. J'ai créé des fonctions add et substract pour manipuler ces value objects.
Ainsi, je peux m'en servir pour charger/décharger mes convois :
Une fois que la fonction de décision execute de l'action LoadResourcesIntoConvoy a validé que tout était en ordre, elle émet l'événement ResourcesLoadedIntoConvoy . Quand il reçoit cet événement, l'aggregate peut changer d'état grâce à sa fonction de mutation apply . Il retourne donc le même état game (qui arrive en premier argument), mais en changeant les clés convoys et territories . Dans chacune de ces deux clés on trouve des maps dans lesquelles ont associe respectivement des informations à l'id d'un convoi ou à l'id d'un territoire. On modifie donc uniquement le convoi et le territoire concernés grâce à la fonction update_in qui permet de plonger en profondeur dans des maps imbriqués et on met à jour les quantités de ressources grâce aux fonctions citées plus haut.
RE: Seelies, un jeu de stratégie persistant - niahoo - 02-08-2019 Code : def has_enough?(available_quantity, needed_quantity) do J'arrive pas à piger pourquoi tu utilises <= au lieu de >= ! Mais sinon cool, intéressant. Je trouve que déclencher un évènement qui est garanti d'être persisté c'est aussi un bon emplacement pour envoyer au joueur "il s'est passé ça" ; au lieu de stocker du log dans le state, ou alors dans le process dictionary, ou autres trucs du genre.
RE: Seelies, un jeu de stratégie persistant - Sephi-Chan - 02-08-2019 Parce que je suis un boulet ! J'ai ajouté quelques tests :
Et j'en ai profité pour corriger l'implémentation.
J'utilise any? plutôt que all? pour m'arrêter dès le premier montant insuffisant.
RE: Seelies, un jeu de stratégie persistant - Thêta Tau Tau - 02-08-2019 J'avais commencé à coder un jeu de stratégie sur Unity (en C#). Pour la gestion des ressources j'avais trouvé très pratique de définir des opérateurs +, -, >=, =<, +=, -= etc. Ça permettait d'écrire des truc du genre :
Aucune idée de si ça peut être utile, mais j'avais trouvé que ça rendait le code plus intuitif.
RE: Seelies, un jeu de stratégie persistant - Sephi-Chan - 02-08-2019 Elixir est un langage fonctionnel et non objet mais l'esprit est bien le même. RE: Seelies, un jeu de stratégie persistant - Sephi-Chan - 02-08-2019 (02-08-2019, 10:43 AM)niahoo a écrit : Je trouve que déclencher un évènement qui est garanti d'être persisté c'est aussi un bon emplacement pour envoyer au joueur "il s'est passé ça" ; au lieu de stocker du log dans le state, ou alors dans le process dictionary, ou autres trucs du genre. C'est l'esprit oui. Seuls les events sont stockés et immutables. C'est pour ça qu'ils sont nommés en conjuguant le temps au passé : ce qui est passé ne peut plus être altéré et il faudra gérer ces événements jusqu'à la fin de vie de l'application. RE: Seelies, un jeu de stratégie persistant - niahoo - 03-08-2019 Techiniquement il est possible de définir des opérateurs dans un module Elixir :
Mais le test run() ci-dessus renvoie la liste suivante : [:yep, :nope, false, true, :yep] . Les deux premiers résultats montrent qu'on peut appeler l'opérateur préfixé de son module, jusque là tout va bien. Les deux tests suivants montrent que quand utilisés normalement (infixes, sans module), les opérateurs renvoient des booléens. C'est dû au fait qu'ils sont automatiquement importés du module Kernel et le langage ne vérifie pas que l'opérateur soit redéfini dans un module qui définit la struct (ici %Resources{} ). Car les strucs sont en fait de simples objets avec une clé __struct__ .Cependant, il existe des opérateurs disponibles qui ne sont pas définis par défaut, et qu'on peut donc utiliser librement : \\, <-, |, ~>>, <<~, ~>, <~, <~>, <|>, <<<, >>>, |||, &&& et ^^^ . (fuck le smiley, l'opérateur est trois `^`.Mais ils sont définis comme des fonctions locales. Le dernier résultat de run() montre qu'appeler Resources.inside_module permet bien d'utiliser l'opérateur ~> au sein du module Resources . Par contre la ligne du dessous dans le test renvoie une erreur de compilation parce que la fonction ~> n'est pas définie.Dans le test run2() , j'ai importé les fonctions du module Resources (au lieu de l'importer de façon classique au niveau du module Test , ceci afin de ne pas avoir a créer deux modules de tests, et puis ça montre au passage qu'on peut importer des contextes où on veut, puissant mais à utiliser avec parcimonie) ; on peut donc appeler ~> et contains directement.Par contre, l'opérateur >= déclenche une erreur de compilation : "function >=/2 imported from both Resources and Kernel, call is ambiguous". Kernel est toujours importé automatiquement, mais n'a pas de précédence sur un autre module.Il serait possible d'importer une sélection : import Resources, only: [{:~>, 2}, {:contains, 2}] , mais dans ce cas %Resources{} >= %BuildingCost{} renverrait un booléen et pas :yep .Allez j'arrête d'étaler ma science ! Mais en conclusion je dirais qu'il vaut mieux utiliser contains dans tous les cas.Edit: Le fait que %Resources{} < %BuildingCost{} renvoie false est simplement dû à l'ordre alphabétique
|