-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJeu de la vie.py
135 lines (121 loc) · 4.53 KB
/
Jeu de la vie.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import copy
import os
import random
import time
clear = lambda: os.system('cls') #Pour effacer la console
def voisin(tabl, x, y):
if x == 0:
leftedge = True
else:
leftedge = False
if x == len(tabl[y]) - 1:
rightedge = True
else:
rightedge = False
if y == 0:
topedge = True
else:
topedge = False
if y == len(tabl) - 1:
bottomedge = True
else:
bottomedge = False
#
voisins = 0
if not leftedge:
# Voisin a gauche
if tabl[y][x - 1]:
voisins += 1
if not topedge:
# Voisin en haut a gauche
if tabl[y - 1][x - 1]:
voisins += 1
if not bottomedge:
# Voisin en bas a gauche
if tabl[y + 1][x - 1]:
voisins += 1
if not rightedge:
# Voisin a droite
if tabl[y][x + 1]:
voisins += 1
if not topedge:
# Voisin en haut a droite
if tabl[y - 1][x + 1]:
voisins += 1
if not bottomedge:
# Voisin en bas a droite
if tabl[y + 1][x + 1]:
voisins += 1
if not topedge:
# Voisin en haut
if tabl[y - 1][x]:
voisins += 1
if not bottomedge:
# Voisin en bas
if tabl[y + 1][x]:
voisins += 1
return voisins
def step(tabl,steps=False):
if steps:
steps-=1
editing = copy.deepcopy(tabl)
for y in range(len(tabl)):
for x in range(len(tabl[y])):
if tabl[y][x]:
if voisin(tabl, x, y) <= 1 or voisin(tabl, x, y) >= 4:
editing[y][x] = False
print(" ", end=" ")
else:
print("■", end=" ")
else:
if voisin(tabl, x, y) == 3:
editing[y][x] = True
print("■", end=" ")
else:
print(" ", end=" ")
print()
time.sleep(0.2)
if not steps:
"""
Enlever le # sur la ligne 85 pour que le programme s'arrête une fois une seul étape finie ou bien une fois que le nombre d'étapes défini dans la fonction est passé
(pour vérifier le temps
"""
#return
if editing==tabl:
print("Votre tableau de jeu ne va plus changer, donc vous pouvez arrêter maintenant si vous voulez.")
return
#
else:
clear()
return editing
#
input("Entrée pour l'étape suivante...")
clear()
return editing
else:
print("--Etape suivante (reste "+str(steps)+")--")
return [editing,steps]
clear()
h=int(input("Pour générer un tableau de jeu aléatoire, il me faut le nombre de lignes... "))
v=int(input("Et maintenant, le nombre de colonnes... "))
print("Ok, je suis en train de créer ça, un peu de patience...")
liste=[[random.choice([True,False]) for j in range(0,v)] for i in range(0,h)]
#step([[False, False, False, False, False],[False, True, True, True, False],[False, False, False, False, False]],5)
clear()
while True:
liste=step(liste)
"""
La fonction step() qui fait une étape du jeu de la vie prend 2 arguments (1 optionel) :
La liste qui est le tableau du jeu, et le nombre d'étapes à faire d'emblée (optionel) qui effectue un certain nombre d'étapes automatiquement.
Pour un tableau de 3x3 avec une ligne de carrés au milieu le format de la liste est :
[[False,False,False],
[True,True,True],
[False,False,False]]
où True est un carré allumé et False est un carré éteint.
Cela permet de faire un fichier un chouïa plus léger en disant "if not a" au lieu de "if a==(valeur)" pour vérifier si a est false par exemple.
La fonction voisin() peût sûrement être optimisée mais vu que j'avais un peu de mal avec je l'ai divisée en 2 parties
La première partie vérifie si le carré dont on cherche les voisins est sur un bord. Cela évite un out of range si le nombre est au bord du tableau
La deuxième partie prend en compte les résultats de la première partie pour vérifier les voisins.
Cette partie est assez optimisée car il vérifie uniquement les voisins des diagonales si le carré est déjà au bord
Par exemple si le carré est sur le bord gauche, on sait qu'il n'aura pas de voisin en ↙, ️⬅ et ️↖️, donc on passe outre ces vérifications pour gagner du temps.
"""