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!
 
   
   
   
 
 
 
 
  

 
   
  