python用Tkinter实现2048小游戏

游戏的介绍

2048是之前很火的一款很火的小游戏,用过操控上下左右来进行游戏,最终达到2048即为胜利

界面显示


在这里插入图片描述
游戏主体继承Tk类,先用一个Frame布局游戏上方的积分,记录和重新开始按钮,再一个用Frame网格布局游戏的16个格子

def initWindow(self):
        bar=Frame(self)
        bar.grid()
        #初始化界面窗口的积分,记录和重新开始按钮
        self.t = Label(bar, justify=LEFT, font=("Verdana", 25, "bold"))
        self.t.pack(side='left')
        Button(bar, text="重新\n开始", command=self.initMatrix,width=7,font=("Verdana", 20, "bold"),bg=BACKGROUND_COLOR).pack(side='right')
        background = Frame(self, bg=BACKGROUND_COLOR)
        background.grid()
        self.gameGrid = []
        #初始化界面窗口中游戏的格子
        for i in range(GAME_SIZE):
            x = []
            for j in range(GAME_SIZE):
                t = Label(background, justify=CENTER, font=("Verdana", 40, "bold"), width=4, height=2)
                t.grid(row=i, column=j, padx=5, pady=5)
                x.append(t)
            self.gameGrid.append(x)

功能操作逻辑

wsad
用一个二维list当作矩阵储存4*4格子中的数字,以向上操作为例:
1.移动:遍历矩阵每一列格子,将矩阵每一列格子中的非零数字全部向上移动
2.合并:遍历矩阵每一列格子,若矩阵每一列格子两个相邻的格子中的数字相同且非零则进行合并,上方的格子中的数字为原来的两倍,下方的格子置位零
3.移动:同1一样遍历矩阵每一列格子,将合并后矩阵每一列格子中的非零数字全部向上移动
4.若操作前后矩阵相等,则这个操作有效

#将矩阵中的数字从下边移动到上边
#将矩阵中的数字从下边移动到上边
    for i in range(GAME_SIZE):
        count=0
        for j in range(GAME_SIZE):
            if mat[j][i]!=0:
                newMatrix[count][i]=mat[j][i]
                count+=1
    #向上合并将矩阵中相邻的数值相同且不为零的数字
    for i in range(GAME_SIZE):
         for j in range(GAME_SIZE-1):
             if newMatrix[j][i]==newMatrix[j+1][i] and newMatrix[j][i]!=0:
                 newMatrix[j][i]*=2
                 newGrade+=newMatrix[j][i]
                 newMatrix[j+1][i]=0

游戏的主体逻辑

首先给出游戏简介窗口,当用户点击确定时进入游戏并关闭简介窗口。
1.首先生成一个全为0的4*4的矩阵,在矩阵数值为0的位置生成两个2,进行显示
2.不断的接收用户的键入,对矩阵进行相应的操作。
3.若操作有效,则在操作后判断矩阵的状态。若矩阵中有2048产生则,游戏胜利,此外若矩阵已满,且没有相邻的两个格子数值相等则游戏失败。
4.若游戏继续且矩阵不满,则在矩阵数值为0的位置生成2/4,更新界面显示,重复2到4的操作

部分代码

def getState(self):
        #矩阵中出现2048,胜利
        for x in self.matrix:
            if 2048 in x:
                return 1
        #矩阵中有空位,游戏继续
        for x in self.matrix:
            if 0 in x:
                return 0
        #矩阵已满但可以进行合并,即左右或者上下有相邻的数值相同的数字,游戏继续
        for i in range(GAME_SIZE): 
            for j in range(GAME_SIZE-1): 
                if self.matrix[i][j]==self.matrix[i][j+1] or self.matrix[j][i]==self.matrix[j+1][i]:
                    return 0
        #否则游戏失败
        return -1
#在矩阵中产生新的2或者4
    def getNewNumber(self):
        index_x=randint(0, GAME_SIZE - 1)
        index_y=randint(0, GAME_SIZE - 1)
        #随机找到为0的坐标
        while self.matrix[index_x][index_y] != 0:
            index_x=randint(0, GAME_SIZE - 1)
            index_y=randint(0, GAME_SIZE - 1)
        if self.grade>2048:#游戏当前的分数大于一定的值产生2或者4
            self.matrix[index_x][index_y] = randint(1, 2)*2
        else:
            self.matrix[index_x][index_y] = 2
#在矩阵中产生新的2或者4
    def getNewNumber(self):
        index_x=randint(0, GAME_SIZE - 1)
        index_y=randint(0, GAME_SIZE - 1)
        #随机找到为0的坐标
        while self.matrix[index_x][index_y] != 0:
            index_x=randint(0, GAME_SIZE - 1)
            index_y=randint(0, GAME_SIZE - 1)
        if self.grade>2048:#游戏当前的分数大于一定的值产生2或者4
            self.matrix[index_x][index_y] = randint(1, 2)*2
        else:
            self.matrix[index_x][index_y] = 2

游戏详细代码链接: link.

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值