Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 ! roll ) :

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 ! smile

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... hmm


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 smile
Ç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

Watael a écrit :

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... hmm

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. smile


Hizoka a écrit :

Les règles du forum ne parlent pas d'exclusivité des problèmes smile
Ç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 ! smile

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

Hizoka a écrit :

Les règles du forum ne parlent pas d'exclusivité des problèmes smile
Ç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

Watael a écrit :
Hizoka a écrit :

Les règles du forum ne parlent pas d'exclusivité des problèmes smile
Ç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