Tixlegeek's DevBlog Code, Gringo, Silicium

qrcode

Une LootTable en BASH, pour vos jeux... En bash.

Salut!

Je suis un gros fan de BASH. Il ne se passe pas une journée sans que je trouve une bonne raison de scripter quelque-chose. Parfois, je me lance des petits défis un peu ridicule, comme, écrire un jeu...

C'est exactement ce genre de petit projet qui m'a amené à créer, il y'a quelque jours, un algorithme de LootTable en BASH, que voici:


#!/bin/bash
# fonction qui s'utilise comme ceci:
# loot ./itemlist.csv $player_level
function loot() {
  # déclaration d'un tableau qui va stocker les items
  declare -a lt
  # on lit la variable csv "$1"
  while read i; do
    # On parse le CSV: n=nom, c=chances, l=niveau
    IFS=',' read -r n c l <<<"$i"
    # Si le niveau du joueur est compatible avec celui de l'item
    if [[ $l -le $2 ]];then
      # On l'ajoute $c fois au tableau
      for j in `seq 0 $c`;do lt+=("$n");done
    fi
  done <<< "$1"
  # On choisi un item au hasard dans le tableau.
  echo ${lt[$RANDOM % ${#lt[@]} ]}
}

Comme vous pourrez peut-être le remarquer, sa taille est minimale, mais, ne vous y trompez pas; sa distribution est mathématiquement juste. Pour le prouver, faisons un petit test:

Alors, en premier lieu, on génère une variable qui contiens les informations sur les items qu'on souhaite lootDropper. Le format, est celui précisé en commentaire, à savoir: nom, chances, niveau requis.(c'est donc du csv...)

#!/bin/bash
test_loot=$(cat <<EOF
rien,200,1
capsule,50,1
bouteille,10,2
pièce en argent,20,2
pièce en or,5,3
gemme,5,3
EOF
)

On peut alors utiliser trivialement la fonction comme ceci: loot test_loot 10 .

Du coup, pour faire notre test, on va réaliser 100 tirages sur ce set, et analyser les résultats. et, pour ça, on va continuer a utiliser du BASH, parce que, on est velu.

#!/bin/bash

# On jette les dés 100 fois
for i in `seq 0 100`; do
# On enregistre le résultat dans /tmp/results
loot "$test_loot" 10 >> /tmp/results
done;
# On dresse les statistiques de distribution pour chaque item.
cat /tmp/results | sort | uniq -c

Ce qui nous donne un résultat qui ressemble à celui là:

      7 bouteille
     18 capsule
      2 gemme
      8 pièce en argent
      3 pièce en or
     63 rien

Et on constate que la distribution est bonne.

Voilà.

HppHckng!