如图,而且一直是在def位置提示错误
import random#导入随机数
from tkinter import*
def add_number():#这是用于添加新块的函数
number=[]#定义一个空列表用于存储序号
for j in range(4):
for i in range(4):
if keyboard[j][i]==0:
number.append([j,i])#找到所有没有数字的位置
length=len(number)
if length==0:
Label(game,text="game over").pack()
exit
k=random.randint(0,length-1)
c=number[k][0]
d=number[k][1]
keyboard[c][d]=2#在没有数字的位置添加2
def origin():
for j in range(4):
for i in range(4):
keyboard[j][i]=key[j][i]
#注:在表达两个列表相同时,要用循环逐一判断其中元素。
#key=keyboard的写法是不正确的。
change()
def Right(event):
for j in range(4):
for i in range(4):
key[j][i]=keyboard[j][i]
for j in range(4): #对于同一行数
a=['0']*4 #a表示读到的这些数有没有被加过,没有则为0,有则为1
#避免出现合并后的块再次被合并的情况
i=2
while i>=0:
n=1 #初始化n,n表示向右移动几位
while (i+n)<=3: #通过循环得出每个数需要上移几位
if keyboard[j][i+n]==0:
keyboard[j][i+n]=keyboard[j][i+n-1]
keyboard[j][i+n-1]=0#若为空则上移一位
elif keyboard[j][i+n-1]==keyboard[j][i+n] and a[i+n]=='0' and a[i+n-1]=='0':
keyboard[j][i+n]=keyboard[j][i+n-1]*2
keyboard[j][i+n-1]=0
a[i+n]='1' #记录上面格已经加过一次
a[i+n-1]='0' #下面的格初始化
n=n+1
i=i-1
add_number()
change()
def Left(event):
for j in range(4):
for i in range(4):
key[j][i]=keyboard[j][i]
for j in range(0,4): #对于同一行数
a=['0']*4 #a表示读到的这些数有没有被加过,没有则为0,有则为1,避免出现合并后的块再次被合并的情况
for i in range(1,4):
n=1 #初始化n,n表示向上移动几位
while (i-n)>=0: #通过循环得出每个数需要上移几位
if keyboard[j][i-n]==0:
keyboard[j][i-n]=keyboard[j][i-n+1]
keyboard[j][i-n+1]=0#若为空则上移一位
elif keyboard[j][i-n]==keyboard[j][i-n+1] and a[i-n]=='0' and a[i-n+1]=='0':
keyboard[j][i-n]=keyboard[j][i-n+1]*2
keyboard[j][i-n+1]=0
a[i-n]='1' #记录上面格已经加过一次
a[i-n+1]='0' #下面的格初始化
n=n+1
add_number()
change()
def Upward(event):
for j in range(4):
for i in range(4):
key[j][i]=keyboard[j][i]
for i in range(0,4): #对于同一列数
a=['0']*4 #a表示读到的这些数有没有被加过,没有则为0,有则为1,避免出现合并后的块再次被合并的情况
for j in range(1,4):
n=1 #初始化n,n表示向上移动几位
while (j-n)>=0: #通过循环得出每个数需要上移几位
if keyboard[j-n][i]==0:
keyboard[j-n][i]=keyboard[j-n+1][i]
keyboard[j-n+1][i]=0#若为空则上移一位
elif keyboard[j-n][i]==keyboard[j-n+1][i] and a[j-n]=='0' and a[j-n+1]=='0':
keyboard[j-n][i]=keyboard[j-n+1][i]*2
keyboard[j-n+1][i]=0
a[j-n]='1' #记录上面格已经加过一次
a[j-n+1]='0' #下面的格初始化
n=n+1
add_number()
change()
def Downward(event):
for j in range(4):
for i in range(4):
key[j][i]=keyboard[j][i]
for i in range(4):
a=['0']*4
j=2
while j >=0:
n=1
while(j+n)<=3:
if keyboard[j+n][i]==0:
keyboard[j+n][i]=keyboard[j+n-1][i]
keyboard[j+n-1][i]=0#若为空则上移一位
elif keyboard[j+n][i]==keyboard[j+n-1][i] and a[j+n]=='0' and a[j+n-1]=='0':
keyboard[j+n][i]=keyboard[j+n-1][i]*2
keyboard[j+n-1][i]=0
a[j+n]='1' #记录上面格已经加过一次
a[j+n-1]='0' #下面的格初始化
n=n+1
j=j-1
add_number()
change()
def change():
color_map = {0:('white'),2: ('#eee4da'),
4: ( '#ede0c8'), 8: ( '#f2b179'),
16: ('#f2b179'),32: ( '#f67c5f'),
64: ('#f65e3b'),128:('#edcf72'),
256: ( '#edcc61'),512: ('#edc850'),
1024: ('#f9f6f2'), 2048: ('#f9f6f2')}
#定义一个字典,颜色和色块相对应
for j in range(4):
for i in range(4):
if keyboard[j][i]!=0:
btns[j][i]['text']=keyboard[j][i]
else:
btns[j][i]['text']=('')
btns[j][i]['background']=color_map[keyboard[j][i]
def panduan():
for j in range(4):
for i in range(4):
if keyboard[j][i]!=key[j][i]:
add_number()
pass
#用于判断在进行移动变换后整个数据是否有变。如果没有变化,则不能生成新的2
key=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]#先定义一个全是0的列表
keyboard=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
#keyboard0为基准列表,用于存储上一步的原始数据,用于还原上一步操作
a=random.randint(0,3)
b=random.randint(0,3)
keyboard[a][b]=2
#游戏初始化时, 手动随机生成一个位置,把2放上去
game=Tk()
game.geometry('320x400')
#设定一个320x400的GUI窗口,取名为game,主窗口
btns = []
#定义了一个名为btns(buttons)的列表,用于存储界面上16个button的信息
#为什么2048的方块要使用button呢?在实际游戏中,2048用的都是较有立体感的滑块,
#因此用button比较有质感,和按钮的功能无关。
for j in range(4):
btns.append([])
for i in range(4):
btns[j].append(
Button(game,width=10,height=5))
btns[j][i].place(x=80*i,y=80*j)
#利用4x4循环把这些button都写出来,并放到指定位置。
#自己在写这里时犯了一个逻辑上的小错误,把x\y放反了,导致函数逻辑出现错误。
origin=Button(game,text='return',command=origin).place(x=200,y=360)
#返回上一步的函数,即显示的数字均根据操作前的来显示。这里有个小问题是不能返回多步。
change()
game.bind("",Right)
game.bind("",Left)
game.bind("",Upward)
game.bind("",Downward)
代码原文如下