-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgame.py
141 lines (139 loc) · 5.35 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
129
130
131
132
133
134
135
136
137
138
139
140
141
import numpy as np;
np.random.seed(12345)
class Game:
def __init__(self):
self.board = [];
for i in range(0,4):
self.board.append([]);
for j in range(0,4):
self.board[i].append(0);
self.randomlyAdd()
def step(self, move):
if(not self.moveTiles(move)):
if self.isFull():
return 0
return -1
self.randomlyAdd()
return 1;
def getLogState(self):
final = []
for row in self.board:
for val in row:
if val == 0:
final.append(0)
else:
final.append(np.log2(val))
return final
def moveTiles(self, direction):
madeMove = False
if(direction == 0):
for i in range(0, 4):
limit = 4
for j in range(2, -1, -1):
if(self.board[i][j] != 0):
while j+1 < limit:
if(self.board[i][j+1] == 0):
self.board[i][j+1] = self.board[i][j];
self.board[i][j] = 0
madeMove = True;
elif(self.board[i][j+1] == self.board[i][j]):
self.board[i][j+1] += self.board[i][j]
self.board[i][j] = 0
limit = j+1
madeMove = True;
break;
else:
limit = j+1
break;
j+=1
elif direction == 1:
for i in range(0, 4):
limit = -1
for j in range(1, 4):
if(self.board[j][i] != 0):
while j-1 > limit:
if(self.board[j-1][i] == 0):
self.board[j-1][i] = self.board[j][i];
self.board[j][i] = 0
madeMove = True
elif(self.board[j-1][i] == self.board[j][i]):
self.board[j-1][i] += self.board[j][i]
self.board[j][i] = 0
limit = j-1
madeMove = True
break;
else:
limit = j-1
break;
j-=1
elif direction == 2:
for i in range(0, 4):
limit = -1
for j in range(1, 4):
if(self.board[i][j] != 0):
while j-1 > limit:
if(self.board[i][j-1] == 0):
self.board[i][j-1] = self.board[i][j];
self.board[i][j] = 0
madeMove = True
elif(self.board[i][j-1] == self.board[i][j]):
self.board[i][j-1] += self.board[i][j]
self.board[i][j] = 0
limit = j-1
madeMove = True
break;
else:
limit = j-1
break;
j-=1
else:
for i in range(0, 4):
limit = 4
for j in range(2, -1, -1):
if(self.board[j][i] != 0):
while j+1 < limit:
if(self.board[j+1][i] == 0):
self.board[j+1][i] = self.board[j][i];
self.board[j][i] = 0
madeMove = True
elif(self.board[j+1][i] == self.board[j][i]):
self.board[j+1][i] += self.board[j][i]
self.board[j][i] = 0
limit = j+1
madeMove = True
break;
else:
limit = j+1
break;
j+=1
return madeMove
def randomlyAdd(self):
possibilities = []
for i in range(0,4):
for j in range(0,4):
if(self.board[i][j] == 0):
possibilities.append([i, j]);
if(len(possibilities) == 0):
return False;
position = possibilities[np.random.randint(len(possibilities))]
if(np.random.random() <= 0.9):
self.board[position[0]][position[1]] = 2
else:
self.board[position[0]][position[1]] = 4
return True;
def isFull(self):
for i in range(0,4):
for j in range(0,4):
if(self.board[i][j] == 0):
return False;
return True
def __str__(self):
string = ""
for i in range(0, 4):
string += str(self.board[i]) +"\n"
return string
if __name__ == "__main__":
g = Game()
g.randomlyAdd()
while not g.step(randrange(4)) == 0:
nextMove = randrange(4)