kno 发表于 2021-12-2 08:29:52

132行2048小游戏,应该没什么大问题

import copy
import random

class game2048:
    totalscore=0 #分数
    flag=True #记录状态
    v=[,
       ,
       ,
       ]
    def __init__(self):
      for i in range(4):
            self.v=)for x in range(4)]

    def display(self):#打印列表
      print('{0:4} {1:4} {2:4} {3:4}'.format(self.v, self.v, self.v, self.v))
      print('{0:4} {1:4} {2:4} {3:4}'.format(self.v, self.v, self.v, self.v))
      print('{0:4} {1:4} {2:4} {3:4}'.format(self.v, self.v, self.v, self.v))
      print('{0:4} {1:4} {2:4} {3:4}'.format(self.v, self.v, self.v, self.v))
      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 == num: #判断相邻项是否相同
                  array.append(2 * num)
                  self.totalscore+=num#计分
                  array.append(0)#将相加后的空缺位填0
                  i += 1
                else:
                  array.append(num)
                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, vlist = vlist, vlist
      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()
            k=random.randrange(1,N+1)
            n=0
            for i in range(4):
                for j in range(4):
                  if self.v==0:
                        n+=1
                        if n==k:
                            self.v=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('错误的输入。请输入或者')

print('输入:W() S() A() D(),press <CR>.')#CR为回车键
g=game2048()
while g.flag:
    g.display()
    g.operation()

ren1195400471 发表于 2022-5-5 14:52:49

有bug
页: [1]
查看完整版本: 132行2048小游戏,应该没什么大问题