-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnim.py
More file actions
127 lines (95 loc) · 3.43 KB
/
Copy pathnim.py
File metadata and controls
127 lines (95 loc) · 3.43 KB
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
from random import randint
from copy import deepcopy
class etat:
def __init__(self, d=None, t=0):
if d is None:
self.allumettes = {
1: ["X"],
2: ["X", "X", "X"],
3: ["X", "X", "X", "X", "X"],
4: ["X", "X", "X", "X", "X", "X", "X"]
}
else:
self.allumettes = deepcopy(d)
self.ordre = t
def choixValide(self, ligne, nbr):
if ligne not in [1, 2, 3, 4]:
return False
if nbr <= 0:
return False
if nbr > min(len(self.allumettes[ligne]), 3):
return False
return True
def estEtatFinal(self):
return all(len(self.allumettes[i]) == 0 for i in range(1, 5))
def changerEtat(self, ligne, nbr):
if self.choixValide(ligne, nbr):
self.allumettes[ligne] = self.allumettes[ligne][:len(self.allumettes[ligne]) - nbr]
def coupsPossibles(self):
resultat = []
if not self.estEtatFinal():
for ligne in range(1, 5):
for nbr in range(1, min(3, len(self.allumettes[ligne])) + 1):
resultat.append((ligne, nbr))
return resultat
def __repr__(self):
ch = "_____________________________________________\n"
for i in range(1, 5):
ch += f"L{i}: " + "X " * len(self.allumettes[i]) + "\n"
ch += "_____________________________________________"
return ch
def jeu():
ordre = int(input("tapez 0 si vous voulez commencer, sinon tapez 1 : "))
tour = etat(t=ordre)
while True:
print(tour)
if tour.estEtatFinal():
break
if tour.ordre == 0:
joueJoueur(tour)
else:
jouePCminmax(tour)
tour.ordre = (tour.ordre + 1) % 2
if tour.ordre == 0:
print("ous avez gagne")
else:
print("vous avvez perdu")
def joueJoueur(tour):
print("\n*********************************************")
ligne, nbr = -1, -1
while not tour.choixValide(ligne, nbr):
print("(donner des valeurs valides)")
ligne = int(input("donner num de ligne à modifier (1-4): "))
nbr = int(input("donner nb d allumettes à retirer (1-3): "))
print("")
tour.changerEtat(ligne, nbr)
print("_____________________________________________\n")
def jouePC(tour):
options = tour.coupsPossibles()
x = randint(0, len(options) - 1)
print("coup choisi: ", options[x])
tour.changerEtat(options[x][0], options[x][1])
def minmax(etatActuel, joueur):
if etatActuel.estEtatFinal():
return (-1 if joueur == 0 else 1), None
meilleurscore = float("-inf") if joueur == 1 else float("inf")
meilleurcoup = None
for coup in etatActuel.coupsPossibles():
nouvelEtat = etat(deepcopy(etatActuel.allumettes), (etatActuel.ordre + 1) % 2)
nouvelEtat.changerEtat(coup[0], coup[1])
score, _ = minmax(nouvelEtat, (joueur + 1) % 2)
if joueur == 1:
if score > meilleurscore:
meilleurscore = score
meilleurcoup = coup
else:
if score < meilleurscore:
meilleurscore = score
meilleurcoup = coup
return meilleurscore, meilleurcoup
def jouePCminmax(tour):
print("\ntour du PC (fel 39al a sa7bi)")
_, coup = minmax(tour, 1)
print("j ai choisi: ", coup)
tour.changerEtat(coup[0], coup[1])
jeu()