如图,而且一直是在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("<KeyPress-d>",Right)game.bind("<KeyPress-a>",Left)game.bind("<KeyPress-w>",Upward)game.bind("<KeyPress-s>",Downward)代码原文如下
3 回答
添加回答
举报
0/150
提交
取消