7
votes

Dans un jeu construit avec une programmation purement fonctionnelle, comment un joueur pourrait-il endommager (Alter State) d'un autre joueur?

Je connais très peu à propos de la programmation fonctionnelle autre que l'idée de fonctions pures. Dans la discussion de Quakecon 2013 de John Carmack, il a mentionné l'une des questions souvent posées sur la programmation fonctionnelle liée aux Jeux: comment allumez-vous une arme à feu et endommagez un autre joueur si vous n'avez pas accès à l'état? (Paraphrasé) Dans mentionné quelque chose à propos d'un système d'événements, que je ne comprenais pas bien, car il me semble qu'un système d'événement aurait toujours besoin d'état?

Comment l'accomplirait-il dans une langue purement fonctionnelle?


4 commentaires

À Haskell, vous pouvez utiliser une monade d'état.


Avez-vous vu la myriade d'autres questions sur le FP et l'état? Certains d'entre eux sont même répertoriés à droite sous "liés". TL; DR - Il y a un état d'accord, mais pas d'état mutable. (L'état MONAD mentionné ci-dessus n'est pas magique, il ne s'agit que de trente lignes de code de bibliothèque.)


Utilisation de "State Monad" (Googlable), oui. Fondamentalement, il ne s'agit que d'indiquer State S A = S -> (A, S) avec monad & CO INSTANCEMENTS. Pour un exemple de "jeu" pur, voir haskellforAl.com/2013/ 05 / ... .


Nous avons eu une rencontre récemment avec une discussion sur la programmation de jeux fonctionnelle. Voici le YouTube Vid: YouTube.com/watch?v=eyj5gonem4k . Voici le lien Meetup avec des diapositives, GitHub Link, etc.: Meetup.com/ Game-Technology-Brisbane / Événements / 139193912


3 Réponses :


8
votes

Pour répéter l'une de mes citations préférées

... Prend dans l'état du monde et retourne un nouveau monde, restant donc pur. P> BlockQuote>

Cela parlait de propre, un cousin de haskell mais c'est toujours lié. Le gist, c'est que vous avez raison, vous avez besoin d'une sorte d'état, mais il n'est pas nécessaire d'être mutable. Considérez P>

 killPlayer :: Game -> Event -> Action
 killPlayer (PlayerDamaged x amount) = if playerHealth g x <= amount
                                       then KillPlayer x
                                       else ReduceHealth x amount


0 commentaires

1
votes

Pour prendre en charge mon commentaire, voici un exemple adapté de http : //www.hakellforall.com/2013/05/programme-imperativé-utilisateur-ukell.html : xxx

lentilles permet d'écrire xxx

transformateur d'état (que vous devez utiliser quand même) permet de mélanger une autre monade (comme < code> io ) à état , mais il est essentiellement tout pur et fonctionne comme ceci:

... Prend dans l'état du monde et retourne un nouveau monde, donc rester pur.

comme un autre commentaire cité.


0 commentaires

2
votes

L'état est juste un ensemble de valeurs dans l'environnement. Haskell vous permet de traiter votre environnement explicitement, afin que nous puissions appeler cela env . Nous créons de nouveaux xxx

et les modifiert-leur xxx

types tels que env -> env sont appelés Endo env dans lequel vous les appliquez de bout en bout pour faire de nombreuses modifications à l'état. xxx

si vous voulez faire plus que Juste Modifier un état Vous devez séquencer d'autres valeurs à côté de votre état endo . Au lieu de ressembler à env -> env Vous commencez à voir env -> (env, a) a modélise votre autre flux de données et construction De là. Cette chose est connue comme la monade d'état car il existe des moyens très intelligents de manipuler ces deux flux d'informations ensemble assez facilement.


0 commentaires