Skip to content
theory-sma
Jeu en cours, des zombies chasse des humains en exploration pour la sortie

Synopsys

Des humains tentent de survivre et à s'échapper face à des hordes de zombies.

Le projet est à réaliser par groupe de deux à trois personnes.

Chaque groupe devra réaliser les objectifs, en ajoutant une à des fonctionnalités supplémentaires par rapport au minimum demandé dans le cahier des charges ci-dessous. Ces dernières sont laissé libre à

Le code Netlogo devra être rendu le 6 janvier au format zip, avec les noms du groupe, à l'enseignant, par mail à sebastien.rey-coyrehourcq (-/at/-] univ-rouen.fr

Le projet réalisé fera l'objet d'une démonstration à l'oral lors des partiels.

Le groupe sera jugé à la fois :

  • sur l'oral qui proposera une démonstration de la ou les fonctionnalités supplémentaires,
  • sur la qualité et la finition du projet : code et interface,
  • sur la qualité des réponses aux questions, celles-ci pouvant porter sur le code écrit et/ou les mécanismes.

Agents

Au minimum il devra y avoir 2 types d'agents :

  • zombie
  • humain

Caractéristiques Zombies

Attributs :

  • Santé
  • Vitesse

Comportements :

  • Les zombies se déplacent de façon aléatoire si ils n'ont pas de cible
  • Ils sont aveugles mais peuvent sentir si un humain est passé sur une case (phéromones), si c'est le cas ils peuvent le suivre et l'attaquer => voir modèle ANTS dans la bibliothèque Netlogo
  • Un zombie attaque 1 personne à la fois
  • Si un zombie marche sur un piège il perd la moitié de sa santé tout de suite.

Caractéristiques Humain

Attributs :

  • Santé
  • Vitesse
  • Armes (max 2)
  • Pièges (max 2)

Comportements :

  • Les humains sont situés dans la zone de Base, c'est là qu'ils reviennent systématiquement après chaque sortie.
  • Les humains partagent la nourriture qui est dans la base, chaque humain mange tous les jours. Si un humain ne peut pas manger il perd de la santé.

Combats

Lorsque un humain et un zombie sont sur la même case, on déclenche un combat :

  • Le zombie attaque une fois, l'humain riposte une fois si il le peut.
  • Un humain avec 1 ou 2 armes inflige 2x ou 4x plus de dégat.
  • Si un humain ou un zombie a 0 en santé, il meurt
  • Un zombie qui a déjà tué un humain ne peut pas tuer tout de suite une autre personne, il doit digérer.

Joueur et Environnement

shapes at 23-11-26 21.36.43

Les zombies ne peuvent pas rentrer dans la Base, par contre ils peuvent rentrer dans les batiments C1, C2 et A

Le joueur peut envoyer un % humains de la base à un instant t dans les missions suivantes :

  • explorer à la recherche de la zone de "Rescue", avec armes si on en a.
    • si un humain trouve la zone rescue il rentre immédiatement, mais il doit survivre pour que la nouvelle mission se débloque
  • déposer des pièges, chaque humain peut en porter jusqu'à 2, 1 piège par patch
  • chasser des zombies, chaque humain peut en chasser jusqu'à 2
  • mission à l'armurerie :
    • il faut revenir vivant pour que les pièges et les armes soient stockés dans la base
    • les armes et pièges appartiennent à tout le monde
  • mission au commerce C1 ou C2 pour récupérer de la nourriture
    • il faut revenir vivant pour que la nourriture soit comptabilisé
  • etc ...

Il est possible d'envoyer plusieurs vagues d'humains à différents endroits (ce qui permet de faire diversion par exemple) mais une fois un humain en mission il doit l'executer jusqu'au bout avant de pouvoir avoir une nouvelle mission.

Si un explorateur réussit à trouver la sortie et à rentrer alors une nouvelle mission apparait : envoyer des humains armés vers la sortie.

Indices

Indice 0

Pour ajouter un moniteur, cad un indicateur toujours à jour qui peut être réutilisé dans votre programme :

  • Ajouter dans l'interface un monitor "nb-humans"
  • Ajouter une fonction :
to-report nb-humans
  report count humans
end

Le chiffre rapporté par le moniteur sera toujours à jour avec le nombre d'humains.

Cela peut être utile par exemple pour calculer la somme de nourriture ou d'armes présent dans la base.

Par exemple pour savoir à tout moment combien d'armes ont été déposé à la base par les humains dans l'attribut "quantity-gun" du patch lorsqu'ils reviennent :

Dans l'initialisation on écrit :

patches-own [
 quantity-gun
 quantity-food
 quantity-trap
]

Dans le setup, on distribue les armes au hasard, mais on pourrait aussi les attribuer seulement au patch ou se situe un humain :

let random-guns random 5

 ask n-of random-guns patches with [pcolor = grey][
    set quantity-gun quantity-gun + 1
  ]

N'importe ou dans le code :

to-report nb-guns
  report sum [quantity-gun] of patches with [pcolor = grey]
end

Indice 1

Pour selectionne un pourcentage d'humain, on ajoute un bouton send-human-explore et un slider sent-nb-humans. Lorsqu'on clique sur un bouton cela selectionne une proportion d'humain et cela les met en ordre de mission "random-move"

to send-human-explore

  ask n-of round ( sent-nb-humans * nb-humans / 100 ) humans [ 
    set mission "random-move"
  ]
end

Indice 2

Jouer avec les comportements de mes humains.

Ajouter un attributs "mission" au format chaine de caractère avec un compteur à chaque humain permet de leur attribuer facilement des missions comme :

  • mission "random-move" => se déplacer aléatoirement pendant "explore-time" pas de temps
  • mission "go-back" => revenir à la maison, c'est à dire au patch origine-x origine-y
  • ... etc ...

Ce qui se traduit par le code suivant :

humans-own [
 mission
 origine-x
 origine-y
 explore-time
]
  create-humans 10 [
    set color green
    set size 1.5
    set shape "dot"
    set mission ""
    set explore-time 10
  ]

Après avoir initilisé les bonnes valeurs dans le setup, dans le go on ajoute :

 ask humans with [explore-time = 0][
    set mission "go-back"
  ]

  ask humans with [mission = "random-move"] [
   set heading (heading - 45 + (random 90))
    set explore-time explore-time - 1
    fd 1 
  ]

  ask humans with [mission = "go-back"] [
   facexy origine-x origine-y
   fd 1
   if distance patch origine-x origine-y <= 1
    [
    set xcor origine-x
    set ycor origine-y 
    set mission ""
    set explore-time 10
    ]
  ]

Le déroulement est le suivant :

  • lorsqu'on clique sur un bouton, les agents passent de l'état mission = "" à mission = "random-move"
  • les agents qui sont dans "random-move" avance de 1 et on décrémente leur temps d'exploration "explore-time" de 1
  • les agents qui ont un "explore-time = 0" on les met en mission "go-back"
  • les agents qui sont en missions "go-back" se déplace vers leur origine (comme les gazelles avec leur maison). Lorsqu'ils atteignent leur maison on remet le compteur "explore-time" à 10

Indice 3

Pour transmettre l'information d'une zone à tous les humains, ex de la rescue zone :

  • Ajout de la rescue zone dans le setup
  ask patch -12 14 [
    set pcolor red
    ask neighbors [
      set pcolor red 
    ]
  ]
  • On ajoute un attribut "found-rescue-zone" aux humains :
humans-own [
 found-rescue-zone
]
  • On utilise la couleur de l'agent humain pour déterminer si ils connaissent la sortie ou pas. Au départ tous les humains sont verts.

  • Pour chaque humain, on va tester si le patch sur lequel je suis est de couleur rouge. Si c'est le cas, l'humain voit l'attribut found-rescue-zone qui change, et prend la valeur de patch-here (donc dans dans le go)

 if [pcolor] of patch-here = red [
      set mission "go-back"
      set found-rescue-zone patch-here
    ]
  • A chaque pas de temps on vérifie si il y a des humains qui ont trouvés la sortie (donc dans le go)
ask humans with [found-rescue-zone != 0] [set color red]
  • Si l'humain est rentré sauf à la base avec l'information, c'est à dire qu'il est rouge, et qu'il n'a plus de missions attribués, alors je transmet l'information "found-rescue-zone" à tous les autres humains :
let human-with-info humans with [color = red and [pcolor] of patch-here = grey] 

  if any? human-with-info [
    let info-rescue [found-rescue-zone] of one-of human-with-info  
    ask humans [
    set found-rescue-zone info-rescue
    ]
  ] 

Indice 4

Ajouter des phéronomes, basé sur l'exemple ANTS dans Netlogo :

  • On ajoute un attribut "chimique" qui contient la quantité de phéromones pour chaque patch
patches-own [
 ...
 chemical
]
  • On indique à tous les humains qui se déplacent de laisser une trace chimique derrière eu à chaque pas de temps, donc dans le go :
  ask humans with [mission != ""][
   set chemical chemical + 60 
  ]
  • Pour gérer la diffusion des traces chimiques dans l'espace, on utilise la fonction 'diffuse'
  • Pour gérer l'intensité de la couleur pour la trace chimique, on utilise la fonction scale color de netlogo : https://ccl.northwestern.edu/netlogo/docs/dictionary.html#scale-color

A chaque pas de temps :

  • on diffuse la trace chimique en fonction d'un pourcentage "diffusion-rate"
  • on recalcule pour chaque patche la valeur de l'attribut "chemical" en fonction d'un pourcentage d'évaporation "evaporation-rate"
  • on recalcule la couleur de chaque patches en fonction de cette intensité
  let evaporation-rate 60
  let diffusion-rate 30 

  diffuse chemical (diffusion-rate / 100)

  ask patches [
   set chemical chemical * (100 - evaporation-rate) / 100 
  ]

  ask patches with [pcolor != grey][
    set pcolor scale-color green chemical 5  0.1
  ]

Ensuite vous pouvez vous baser sur la suite du modèle NETLOGO ANTS : si vos zombies croise une zone avec des phéromones alors ils vont suivre cette trace, en prenant la plus forte dans leur champ de vision.

Il faut réutiliser ces procédures là :

to-report chemical-scent-at-angle [angle]
  let p patch-right-and-ahead angle 1
  if p = nobody [ report 0 ]
  report [chemical] of p
end

to uphill-chemical  ;; turtle procedure
  let scent-ahead chemical-scent-at-angle   0
  let scent-right chemical-scent-at-angle  45
  let scent-left  chemical-scent-at-angle -45
  if (scent-right > scent-ahead) or (scent-left > scent-ahead)
  [ ifelse scent-right > scent-left
    [ rt 45 ]
    [ lt 45 ] ]
end

But du jeu

Sauver le plus d'humain :)