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 自定义py文件中方法导入 博客分类: python
下一篇: PB 第一个窗口