鱼C论坛

 找回密码
 立即注册
查看: 889|回复: 2

[技术交流] 2048游戏作品,132行,可能会有bug,请各位指教

[复制链接]
发表于 2021-12-1 23:42:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-4 21:39:31 | 显示全部楼层
本帖最后由 lassiter 于 2021-12-4 21:42 编辑

nice,不过怎么把按键映射到上下左右按键上?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-5 10:09:13 | 显示全部楼层
lassiter 发表于 2021-12-4 21:39
nice,不过怎么把按键映射到上下左右按键上?

op=input('operator:')
通过input和if结构判断用户输入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 21:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表