-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathGame.py
129 lines (113 loc) · 3.96 KB
/
Game.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
from copy import copy, deepcopy
class Azione:
def __init__(self, x, y, c):
self.x = x
self.y = y
self.c = c
class Game:
def __init__(self):
self.matrix = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]
def nuovaPartita(self):
self.matrix = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]
def ciao(self):
self.matrix[0][0] = "x"
print(self.matrix[0][0])
#ritorna se il gioco è terminato
#oppure se uno ha vinto
def terminal_test(self, stato):
if self.ha_vintoTipo(stato, "x"):
return True
if self.ha_vintoTipo(stato, "o"):
return True
for i in stato:
for j in i:
if j == " ":
return False
return True
#ritorna se hai vinto oppure se hai perso
def utility(self, stato):
r = 0
c = "x"
if self.ha_vintoTipo(stato, "o"):
return -1
#orizzontali per riga
if stato[0][0] == c and stato[0][1] == c and stato[0][2] == c:
return 1
if stato[1][0] == c and stato[1][1] == c and stato[1][2] == c:
return 1
if stato[2][0] == c and stato[2][1] == c and stato[2][2] == c:
return 1
#parti verticali per colonna
if stato[0][0] == c and stato[1][0] == c and stato[2][0] == c:
return 1
if stato[0][1] == c and stato[1][1] == c and stato[2][1] == c:
return 1
if stato[0][2] == c and stato[1][2] == c and stato[2][2] == c:
return 1
#mancano quelli obliqui
if stato[0][0] == c and stato[1][1] == c and stato[2][2] == c:
return 1
if stato[0][2] == c and stato[1][1] == c and stato[2][0] == c:
return 1
return r
def ha_vintoTipo(self, stato, c):
#c = "o"
#orizzontali per riga
if stato[0][0] == c and stato[0][1] == c and stato[0][2] == c:
return True
if stato[1][0] == c and stato[1][1] == c and stato[1][2] == c:
return True
if stato[2][0] == c and stato[2][1] == c and stato[2][2] == c:
return True
# parti verticali per colonna
if stato[0][0] == c and stato[1][0] == c and stato[2][0] == c:
return True
if stato[0][1] == c and stato[1][1] == c and stato[2][1] == c:
return True
if stato[0][2] == c and stato[1][2] == c and stato[2][2] == c:
return True
# mancano quelli obliqui
if stato[0][0] == c and stato[1][1] == c and stato[2][2] == c:
return True
if stato[0][2] == c and stato[1][1] == c and stato[2][0] == c:
return True
return False
#ritorna la lista delle possibili azioni dallo stato corrente
def actions(self, state):
c = self.capisciIlSegno(state)
actions = []
for i in range(len(state)):
for j in range(len(state[i])):
if state[i][j] == " ":
a = Azione(i, j, c)
actions.append(a)
return actions
def capisciIlSegno(self, stato):
nx = 0
no = 0
for i in stato:
for j in i:
if j == "o":
no = no+1
if j == "x":
nx = nx+1
if nx >= no:
return "o"
else:
return "x"
#non so se va creata una nuova matrice
def result(self, stato, azione):
newstate = deepcopy(stato)
newstate[azione.x][azione.y] = azione.c
return newstate
"""stato[azione.x][azione.y] = azione.c
return stato"""
def print(self):
for i in self.matrix:
print("|"+i[0]+"|"+i[1]+"|"+i[2]+"|")
def print2(self, stato):
for i in stato:
print("|"+i[0]+"|"+i[1]+"|"+i[2]+"|")
def mettiSimbolo(self, azione):
if self.matrix[azione.x][azione.y] == " ":
self.matrix[azione.x][azione.y] = azione.c