|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
import copy
import random
class game2048:
totalscore=0 #分数
flag=True #记录状态
v=[[1,2,2,4],
[4,2,4,8],
[2,4,2,0],
[4,2,4,0]]
def __init__(self):
for i in range(4):
self.v[i]=[random.choice([0,0,0,2,2,4])for x in range(4)]
def display(self):#打印列表
print('{0:4} {1:4} {2:4} {3:4}'.format(self.v[0][0], self.v[0][1], self.v[0][2], self.v[0][3]))
print('{0:4} {1:4} {2:4} {3:4}'.format(self.v[1][0], self.v[1][1], self.v[1][2], self.v[1][3]))
print('{0:4} {1:4} {2:4} {3:4}'.format(self.v[2][0], self.v[2][1], self.v[2][2], self.v[2][3]))
print('{0:4} {1:4} {2:4} {3:4}'.format(self.v[3][0], self.v[3][1], self.v[3][2], self.v[3][3]))
print('得分为:{0:4}'.format(self.totalscore))
def addsame(self,vlist,direction):#相加相同项
q = [] #添加相同项后的新二维列表
for num in vlist:
if direction == 'right': #判断方向,如果为右则把列表反向排序,因为左右两个方向的算法其实是相同的,只是方向反了而已
num.reverse()
i = 0
array = [] #临时的一维列表
while i <= 3:
if i + 1 <= 3 and num[i] == num[i + 1]: #判断相邻项是否相同
array.append(2 * num[i])
self.totalscore+=num[i] #计分
array.append(0) #将相加后的空缺位填0
i += 1
else:
array.append(num[i])
i += 1
total0 = array.count(0) #total0主要是计算一维列表的0的数目,并将中间项的0全部往后排
for j in range(total0):
array.remove(0)
for j in range(total0):
array.append(0)
if direction == 'right': #如果方向为右,最后记得把反序的列表在反序
array.reverse()
q.append(array)
self.v=copy.deepcopy(q)
zero=self.calcCharNumber(0) #这里用于判断游戏是否结束,请原谅我没有把它们分开写,时间确实有点急
if zero==0: #如果相加后没有新的0项说明游戏结束
print('你输了哈哈')
self.flag=False
def matrix(self, vlist): #矩阵转置,目的是将上下两个方向的算法换到使用左右算法
for x in range(4):
for y in range(x, 4):
vlist[x][y], vlist[y][x] = vlist[y][x], vlist[x][y]
self.v=copy.deepcopy(vlist)
def handle(self,vlist,direction):#将列表的0全部往后排
q = []
for i in vlist:
if direction == 'right':
i.reverse()
total0 = i.count(0)
for j in range(total0):
i.remove(0)
for j in range(total0):
i.append(0)
if direction == 'right':
i.reverse()
q.append(i)
self.v=copy.deepcopy(q)
def calcCharNumber(self, char): #计算二维列表的0数目
n = 0
for q in self.v:
n += q.count(char)
return n
def addelement(self): #产生随机数
N=self.calcCharNumber(0)
if N!=0:
num=random.choice([2,2,2,4])
k=random.randrange(1,N+1)
n=0
for i in range(4):
for j in range(4):
if self.v[i][j]==0:
n+=1
if n==k:
self.v[i][j]=num
return
def moveLeft(self):
self.moveHorizontal('left')
def moveRight(self):
self.moveHorizontal('right')
def moveHorizontal(self,direction):
self.handle(self.v,direction)
self.addsame(self.v,direction)
def moveUp(self):
self.moveVertical('left')
def moveDown(self):
self.moveVertical('right')
def moveVertical(self,direction):
self.matrix(self.v)
self.handle(self.v,direction)
self.addsame(self.v,direction)
self.matrix(self.v)
def operation(self):
op=input('operator:')
if op in ['a','A']:
self.moveLeft()
self.addelement()
elif op in ['d','D']:
self.moveRight()
self.addelement()
elif op in ['w','W']:
self.moveUp()
self.addelement()
elif op in ['s','S']:
self.moveDown()
self.addelement()
else:
print('错误的输入。请输入[w,s,a,d]或者[W,S,A,D]')
print('输入:W() S() A() D(),press <CR>.')#CR为回车键
g=game2048()
while g.flag:
g.display()
g.operation() |
评分
-
查看全部评分
|