/
py2048.py
139 lines (139 loc) · 3.91 KB
/
py2048.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
# Author : Rakesh Gariganti 15/Jan/2016
from random import choice
from os import system
from string import center
class New2048:
def __init__(self,size):
self.grid = [[' ']*size for i in range(size)]
self.size = size
self.score = 0
self.cellwidth = 6
self.rowsize = 2*size+1+(size*self.cellwidth)
def printGrid(self):
system("clear")
print "_"*self.rowsize
for i in range(self.size):
print "|",
for j in range(self.size):
print center(str(self.grid[i][j]),self.cellwidth)+"|",
print "\n"+"_"*self.rowsize
print "Score: ",self.score
def isOver(self):
for i in xrange(self.size):
for j in xrange(i,self.size-1):
if self.grid[i][j] == self.grid[i][j+1] or self.grid[j][i] == self.grid[j+1][i] or ' ' in [self.grid[i][j], self.grid[i][j+1], self.grid[j][i], self.grid[j+1][i]]:
return False
return True
def getRandomEmptyCell(self):
empty_cells = []
for i in range(0, self.size):
for y in range(0, self.size):
if self.grid[i][y] == ' ':empty_cells.append((i,y))
if len(empty_cells) > 0:return choice(empty_cells)
else:return None
def addNewNumber(self):
new_cell = self.getRandomEmptyCell()
if new_cell == None:return False
else:
i,j = new_cell
self.grid[i][j] = 2
return True
def cleanRow(self,row):
temp = []
for j in row:
if j != " ":
temp.append(j)
return temp
def settleDown(self, op):
if op in "aaAA":
for i in range(0, self.size):
row = self.grid[i]
temp = self.cleanRow(row)
if len(temp)>1:
t = 1
while t < len(temp):
if temp[t] == temp[t-1]:
temp[t] = 2*temp[t]
self.score += temp[t]
temp.pop(t-1)
t += 2
else:t += 1
temp.extend([" "]*(self.size-len(temp)))
self.grid[i] = temp
elif op in "ddDD":
for i in range(0, self.size):
row = self.grid[i]
temp = self.cleanRow(row)
if len(temp)>1:
t = len(temp)-2
while t >= 0:
if temp[t] == temp[t+1]:
temp[t] = 2*temp[t]
self.score += temp[t]
temp.pop(t+1)
t -= 2
else:t -= 1
temp2 = [" "]*(self.size-len(temp))
temp2.extend(temp)
self.grid[i] = temp2
elif op in "wwWW":
for i in xrange(self.size):
column = []
for j in xrange(self.size):
column.append(self.grid[j][i])
temp = self.cleanRow(column)
if len(temp)>1:
t = 1
while t < len(temp):
if temp[t] == temp[t-1]:
temp[t] = 2*temp[t]
self.score += temp[t]
temp.pop(t-1)
t += 2
else:t += 1
temp.extend([" "]*(self.size-len(temp)))
for j in xrange(self.size):
self.grid[j][i] = temp[j]
elif op in "ssSS":
for i in xrange(self.size):
column = []
for j in xrange(self.size):
column.append(self.grid[j][i])
temp = self.cleanRow(column)
if len(temp)>1:
t = len(temp)-2
while t >= 0:
if temp[t] == temp[t+1]:
temp[t] = 2*temp[t]
self.score += temp[t]
temp.pop(t+1)
t -= 2
else:t -= 1
temp2 = [" "]*(self.size-len(temp))
temp2.extend(temp)
for j in xrange(self.size):
self.grid[j][i] = temp2[j]
else:
if raw_input("Do you want to quit the game?(y/n):") in ['y','Y']:exit()
else:self.settleDown(raw_input("Move: "))
def start(self):
self.addNewNumber()
self.addNewNumber()
while True:
self.printGrid()
op = raw_input("Move: ")
if op != "" and op != None:
self.settleDown(op)
self.addNewNumber()
if self.isOver():
self.printGrid()
print "Game Over, your Score: ",self.score
exit()
def Main():
print "Starting the game engine...\n\t\t Press 'a' to move the Grid Left\n\t\t Press 's' to move the Grid Down\n\t\t Press 'd' to move the Grid Right\n\t\t Press 'w' to move the Grid Up\n\t\t At anytime press 'Ctrl+c' to exit"
size = -1
while size<2:size = int(raw_input("Enter the size of the grid(greater than 1 please): "))
New2048(size).start()
if __name__ == '__main__':
try:Main()
except KeyboardInterrupt:print "\nExiting.."