Python版2048小游戏源码

准备工作:要确保编译器已经安装Tkinter库
2048源码解释在过程中有详细解释,废话不多说直接上码》》

bgs={0:"#FFFFF0",2:"#eee4da", 4:"#ede0c8", 8:"#f2b179", 16:"#f59563", 32:"#f67c5f", 64:"#f65e3b", 128:"#edcf72", 256:"#edcc61",
    512:"#edc850", 1024:"#edc53f", 2048:"#edc22e"}#颜色的16进制值
mp = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]#当做二维数组来记录4*4方格的变化
vis=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]#用来标记4*4方格都有哪几个位置已经有值
newmp=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]#作为中介数组来使用
vc=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]#判断是否每一个位置都有数据


#随机在空位找一个坐标赋值为2或4
def random_num():
    while True:
        x1=random.randint(0,3)  #整型数据范围0-3
        y1=random.randint(0,3)
        if vis[x1][y1]==0:
            mp[x1][y1]=random.choice([2,4,2,2])  #随机在2和4之间取值
            vis[x1][y1]=1
            return


#初始化newmp,vis
def init():
    for i in range(4):
        for j in range(4):
            newmp[i][j]=0
            vis[i][j]=0


#初始化mp
def init_mp():
    for i in range(4):
        for j in range(4):
            mp[i][j]=0


#改变界面
def print_interface():
    for i in range(4):
        for j in range(4):
            cs=bgs[mp[i][j]]
            c1.create_rectangle(j*100,i*100,j*100+100,i*100+100,fill="%s"%(cs))
            if mp[i][j]!=0:  #控制0的输出
                c1.create_text((j*100+100)-50,(i*100+100)-50,text="%d"%(mp[i][j]),font=("楷体",30))


#判断是否结束
def gameover():
    if vis==vc and panduan()==False:  #如果每一位都有数据而且每一个元素和它相邻的位置的数都不相等则在界面上输出结束游戏
        c1.create_oval(100,150,300,250,fill="#FF4500")
        c1.create_text(200,200,text="游戏结束")


#判断是否还可以继续操作
def panduan ():
    movex=[-1,1,0,0]
    movey=[0,0,-1,1]
    for i in range(4):  #判断每一位元素的周围
        for j in range(4):
            for l in range(4):
                newx=int(i+movex[l])
                newy=int(j+movey[l])
                if (newx<0 or newx>3)or(newy<0 or newy>3):
                    continue
                else:
                    if mp[i][j]==mp[newx][newy]:
                        return True
    return False


#向上
def put_up():
    init()  #初始化,newmp,vis
    for i in range(4):  #向上合并,去除为0的格子
        l=0
        for j in range(4):
            if mp[j][i]==0:
                continue
            else:
                newmp[l][i]=mp[j][i]
                l+=1
    for i in range(4):  #从第二个开始只和它前一个数比较,如果相等则加上去并让这个位置等于0
        for j in range(1,4):
            if newmp[j][i]==0:
                break
            else:
                if newmp[j][i]==newmp[j-1][i]:
                    newmp[j-1][i]=newmp[j][i]+newmp[j-1][i]
                    newmp[j][i]=0
    if newmp==mp:  #如果向上合并后,和和相邻位置加后和之前未修改的一样则说明该方向无法操作直接跳出
        return
    init_mp()  #初始化mp把加后的值再次向上合并然后传给mp
    for i in range(4):
        l=0
        for j in range(4):
            if newmp[j][i]==0:
                continue
            else:
                mp[l][i]=newmp[j][i]
                vis[l][i]=1
                l+=1
    random_num()  #合并以后再空位随机产生一个2或4
    print_interface()  #修改界面并显示
    gameover()  #先判断是否结束
    return


#向下
def put_down():
    init()
    for i in range(4):
        l=3
        j=3
        while j>=0:
            if mp[j][i]==0:
                j-=1
                continue
            else:
                newmp[l][i]=mp[j][i]
                l-=1
                j-=1
    for i in range(4):
        j=2
        while j>=0:
            if newmp[j][i]==0:
                break
            else:
                if newmp[j][i]==newmp[j+1][i]:
                    newmp[j+1][i]=newmp[j][i]+newmp[j+1][i]
                    newmp[j][i]=0
            j-=1
    if newmp==mp:
        return
    init_mp()
    for i in range(4):
        l=3
        j=3
        while j>=0:
            if newmp[j][i]==0:
                j-=1
                continue
            else:
                mp[l][i]=newmp[j][i]
                vis[l][i]=1
                l-=1
            j-=1
    random_num()
    print_interface()
    gameover()  #先判断是否结束
    return


#向左
def put_left():
    init()
    for i in range(4):
        l=0
        for j in range(4):
            if mp[i][j]==0:
                continue
            else:
                newmp[i][l]=mp[i][j]
                l+=1
    for i in range(4):
        for j in range(1,4):
            if newmp[i][j]==0:
                break
            else:
                if newmp[i][j]==newmp[i][j-1]:
                    newmp[i][j-1]=newmp[i][j]+newmp[i][j-1]
                    newmp[i][j]=0
    if newmp==mp:
        return
    init_mp()
    for i in range(4):
        l=0
        for j in range(4):
            if newmp[i][j]==0:
                continue
            else:
                mp[i][l]=newmp[i][j]
                vis[i][l]=1
                l+=1
    random_num()
    print_interface()
    gameover()  #先判断是否结束
    return


#向右
def put_right():
    init()
    for i in range(4):
        l=3
        j=3
        while j>=0:
            if mp[i][j]==0:
                j-=1
                continue
            else:
                newmp[i][l]=mp[i][j]
                l-=1
                j-=1
    for i in range(4):
        j=2
        while j>=0:
            if newmp[i][j]==0:
                break
            else:
                if newmp[i][j]==newmp[i][j+1]:
                    newmp[i][j+1]=newmp[i][j]+newmp[i][j+1]
                    newmp[i][j]=0
            j-=1
    if newmp==mp:
        return
    init_mp()
    for i in range(4):
        l=3
        j=3
        while j>=0:
            if newmp[i][j]==0:
                j-=1
                continue
            else:
                mp[i][l]=newmp[i][j]
                vis[i][l]=1
                l-=1
            j-=1
    random_num()
    print_interface()
    gameover()  #先判断是否结束
    return


#主函数部分
import random  #随机数库
import tkinter  #窗体库
t1=tkinter.Tk()  #创建实体窗体
t1.geometry("650x400")  #窗体大小
t1.title("2048")  #窗体标题
btn1=tkinter.Button(t1,text="向上",font=("楷体",11),fg="black",command=put_up)  #第一个按钮,以及点击后会发生的事件(command)
btn2=tkinter.Button(t1,text="向下",font=("楷体",11),fg="black",command=put_down)  #第二个按钮,和事件
btn3=tkinter.Button(t1,text="向左",font=("楷体",11),fg="black",command=put_left)
btn4=tkinter.Button(t1,text="向右",font=("楷体",11),fg="black",command=put_right)
btn4.pack(side="right",padx="2m",anchor="e")  #所要放得位置,e表示右中部
btn3.pack(side="right",padx="2m",anchor="e")
btn2.pack(side="right",padx="2m",anchor="e")
btn1.pack(side="right",padx="2m",anchor="e")
t1['background']='#F4A460'  #窗体的背景颜色
c1=tkinter.Canvas(t1,width=400,height=400)  #创建和确定画布窗体的大小
c1.pack(side="left")  #窗体上以左对齐设置画布
random_num()  #在没有数的位置随机产生一个2或4
for i in range(4):  #for循环输出界面
    for j in range(4):
        cs=bgs[mp[i][j]]
        c1.create_rectangle(j*100,i*100,j*100+100,i*100+100,fill="%s"%(cs))  #在画布上创建一个方块,四个值分别为方块的左顶点和右下角顶点
        if mp[i][j]!=0:
            c1.create_text((j*100+100)-50,(i*100+100)-50,text="%d"%(mp[i][j]),font=("楷体",30))  #在方块内填上对应的数字
t1.mainloop()  #启动窗体消息循环功能值

运行结果截图:
在这里插入图片描述

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值