欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python版2048小游戏源码

程序员文章站 2024-03-19 18:44:10
...

准备工作:要确保编译器已经安装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()  #启动窗体消息循环功能值

运行结果截图:
Python版2048小游戏源码

相关标签: Python