#1 Le 02/01/2019, à 14:19
- Zethra
Aide : Jeu de la vie en Bash
Bonjour,
Je suis en alternance en informatique et mon tuteur, après une série d'exercice, me demande de développer un jeu de la vie en Bash. Pour ceux qui ne connaissent pas, voici les principes de bases :
À chaque étape, l’évolution d’une cellule est entièrement déterminée par l’état de ses huit voisines de la façon suivante :
- Une cellule morte possédant exactement trois voisines vivantes devient vivante (elle naît).
- Une cellule vivante possédant deux ou trois voisines vivantes le reste, sinon elle meurt.
Et une petite vidéo expliquant le principe : https://www.youtube.com/watch?v=S-W0NX97DB0
Voici où j'en suis pour le moment :
#!/bin/bash
echo ""
echo "+~ ----------------------- Conway's Game of Life --------------------- ~+"
echo "| |"
echo "| This is the Bash script version of John Conway's "Game of Life". |"
echo "| "Life" is a simple implementation of cellular automata. |"
echo "| |"
echo "| --------------------------------------------------------------------- |"
echo "| |"
echo "| Rules : |"
echo "| |"
echo "| 1) A living cell with either 2 or 3 living neighbors remains alive. |"
echo "| |"
echo "| 2) A dead cell with 3 living neighbors comes alive.echo | "
echo "| 3) All other cases result in a dead cell for the next generation. |"
echo "| |"
echo "+ --------------------------------------------------------------------- +"
echo ""
echo ""
read -p "> Press any key to continue ... "
clear
#################### HEADER ####################
header_function()
{
echo ""
echo " +~ ---------------- Conway's Game of Life ---------------- ~+ "
echo ""
}
header_function
echo " How many lines ? "
echo -n " > "
read Lines
echo " How many columns ? "
echo -n " > "
read Columns
echo ""
declare -A tab
declare -A tabfutur
num_lines=$Lines
num_columns=$Columns
Counter=0
#################### ARRAY FUNCTION ####################
init_array_function()
{
for ((x=1;x<=num_lines;x++))
do
for ((y=1;y<=num_columns;y++))
do
tab[$x,$y]=".";
done
done
}
#################### DISPLAY FUNCTION ####################
display_function()
{
header_function
f1="%$((${#num_lines}+1))s"
f2="%3s"
printf "$f1"
for ((x=1;x<=num_lines;x++))
do
printf "$f2" $x
done
echo
for ((y=1;y<=num_columns;y++))
do
printf "$f1" $y
for ((x=1;x<=num_lines;x++))
do
printf "$f2" ${tab[$x,$y]}
done
echo
done
}
#################### ASK COORDINATES ####################
coord_function()
{
echo ""
echo ""
while true
do
echo -n " + Place your cell using the array coordinates ( like '1,1' ) or press 's' to start : "
read coord
if [ $coord = "s" ]
then
start_function
else
if [[ "$coord" =~ ^[0-9]+,[0-9]+$ ]] ; then x=${coord%, *} ; y=${coord#*, } ;
if [[ $x -ge 0 ]] && [[ $x -le 9 ]] && [[ $y -ge 0 ]] && [[ $y -le 9 ]]
then
echo " > Coordinates confirmed for "$coord"."
tab[$coord]="o"
display_function
echo ""
else
echo
echo -e " \033[91m> Error ! Coordinates are out of the grid ! Retry ! <\033[0m "
echo
fi
fi
fi
done
}
init_array_function
display_function
coord_function
Là où je bloque totalement, c'est la prochaine étape : créer une fonction qui va parcourir tout le tableau, compter le nombre de o et les afficher dans le tableau afin de pouvoir appliquer les règles suivantes :
0 ou 1 o voisins : mort d'isolement
2 o voisins : rien ne change
3 o voisins : naissance d'une cellule
Entre 4 et 8 o voisins : mort de la cellule car surpopulation
Voilà ce que j'ai essayé de faire ( ça ne fonctionne pas et niveau synthaxe, c'est foireux aussi ! ) :
living_cell_function()
{
if (($x > 0 )) && (( $x <= $num_lines+1)) && (($y > 0 )) && (( $y <= $num_columns-1))
then
if [[ "${tab[$((x-1)),$((y+1))]}"="o" ]] ; then ((Counter++)) ; fi
if [[ "${tab[$((x)),$((y+1))]}"="o" ]] ; then ((Counter++)) ; fi
if [[ "${tab[$((x+1)),$((y+1))]}"="o" ]] ; then ((Counter++)) ; fi
if [[ "${tab[$((x-1)),$((y))]}"="o" ]] ; then ((Counter++)) ; fi
if [[ "${tab[$((x+1)),$((y))]}"="o" ]] ; then ((Counter++)) ; fi
if [[ "${tab[$((x-1)),$((y-1))]}"="o" ]] ; then ((Counter++)) ; fi
if [["${tab[$((x)),$((y-1))]}"="o" ]] ; then ((Counter++)) ; fi
if [[ "${tab[$((x+1)),$((y-1))]}"="o" ]] ; then ((Counter++)) ; fi
fi
display_function
}
La variable Counter devrait être déclaré avant dans mon code et serait égale à 0. Ainsi, si ma fonction tourne correctement, le nombre de cellule devrait changer... Mais je n'y arrive pas !
Auriez-vous quelques idées ?
Merci d'avance !
Hors ligne
#2 Le 02/01/2019, à 16:44
- Watael
Re : Aide : Jeu de la vie en Bash
salut,
pourquoi postes-tu sur plusieurs forums ?
si les réponses qui t'ont été données ailleurs ne te conviennent pas il faut le dire.
et si tu espères nous faire croire, ou te donner l'impression, que tu as tout fait tout seul...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 02/01/2019, à 23:23
- Hizoka
Re : Aide : Jeu de la vie en Bash
Les règles du forum ne parlent pas d'exclusivité des problèmes
Ça permet potentiellement de toucher plus d'aidants.
Tu peux remplacer :
if [[ "${tab[$((x-1)),$((y+1))]}"="o" ]] ; then ((Counter++)) ; fi
par
[[ "${tab[$((x-1)),$((y+1))]}"="o" ]] && ((Counter++))
N’hésite pas à ajouter des echo avant et après les changement de variables afin de voir si elles ont les valeurs attendues.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 03/01/2019, à 11:01
- Zethra
Re : Aide : Jeu de la vie en Bash
salut,
pourquoi postes-tu sur plusieurs forums ?
si les réponses qui t'ont été données ailleurs ne te conviennent pas il faut le dire.et si tu espères nous faire croire, ou te donner l'impression, que tu as tout fait tout seul...
Bah, je demande l'avis de plusieurs personnes, comme ça j'ai plus d'explications, donc je comprends plus vite et donc mon problème sera résolu plus vite. Sur ce code, la seule chose qui n'a pas été entièrement faite par moi, c'est la fonction qui analyse le tableau car, je l'avoue, j'ai du mal à comprendre comment ça fonctionne. Le reste ça vient de moi, ce sont des fonctions que j'ai récupéré d'exercices que j'ai fait juste avant et qui allaient servir à faire le jeu de la vie ( tout vient du morpion avec un tableau à multidimension que j'ai du faire en bash => https://github.com/Zethra59/TicTacToe-Bash ).
Donc non, je n'essaie pas de vous faire croire que je fait tout moi-même. Certaines choses viennent de moi, d'autres choses sont un mix de ce que d'autres personnes m'ont montré et de ce que j'ai pu trouver sur le net ! Et j'essaie, autant que faire se peut, de comprendre ce qu'on me montre et le remixer le plus possible à ma sauce.
Les règles du forum ne parlent pas d'exclusivité des problèmes
Ça permet potentiellement de toucher plus d'aidants.Tu peux remplacer :
if [[ "${tab[$((x-1)),$((y+1))]}"="o" ]] ; then ((Counter++)) ; fi
par
[[ "${tab[$((x-1)),$((y+1))]}"="o" ]] && ((Counter++))
N’hésite pas à ajouter des echo avant et après les changement de variables afin de voir si elles ont les valeurs attendues.
Merci pour l'aide, je vais regarder ça !
Hors ligne
#5 Le 03/01/2019, à 11:10
- pingouinux
Re : Aide : Jeu de la vie en Bash
[[ "${tab[$((x-1)),$((y+1))]}"="o" ]]
Le signe = doit être entouré d'espaces, sinon l'expression est toujours vraie.
Hors ligne
#6 Le 03/01/2019, à 14:08
- Watael
Re : Aide : Jeu de la vie en Bash
Les règles du forum ne parlent pas d'exclusivité des problèmes
Ça permet potentiellement de toucher plus d'aidants.
ça crée du "rustinage" dans un script.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 03/01/2019, à 14:16
- diesel
Re : Aide : Jeu de la vie en Bash
Hizoka a écrit :Les règles du forum ne parlent pas d'exclusivité des problèmes
Ça permet potentiellement de toucher plus d'aidants.ça crée du "rustinage" dans un script.
Bah..., si tu voyais l'état de certains scripts qui s'occupent du noyau...
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#8 Le 04/01/2019, à 19:06
- Watael
Re : Aide : Jeu de la vie en Bash
on ne peut/doit pas justifier les mauvais comportements à venir par les mauvais comportements passés !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne