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!