猿问

用python编写简易2048,代码运行时为什么一直提示invalid syntax?


如图,而且一直是在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)

代码原文如下

qq_缱绻流年_03682441
浏览 2275回答 3
3回答

慕的地8582982

GMSGAQVVUISPRUHKNGQPPXTVEIIOORAHUNJQXQLBKGTNIEUCWPMJPSSOBUAVICSRILKEHNQANAPGGIEQRXKHQPJGYNXNKDXTOBFTPROZKARQXDLAWUKUKNAXNKMXQTDAJCFWAJLBKOOCLOCEADTWEHDTWMQXGILWFBXURVRGQGWFBKUDLIROEOKNPLJBKTKNPSPPFVRMBLOXBRGJYNZCYIEULURFQZLVPBBYBALFVRBGPXKZWQNXNFCPVYLOOFLFCVGGJIJWMSBUEHPSMKULPEIQMJSURUZUKAQGISAEAAWTDTIKHQNWFVQMXUDUKUWIENQTWSOEUQKMIRUKHJLOEETKOROKZOFUBQZVEMJBWAQWMBPLIRHQARMILNLODZIFPSHDUXTDAJGCODMPMCYODNXDTWGCFILADLTIRTWZIRZWZHQMOMJZJEHEFHXHKSJLOGWENJUQMWFBTCABLARHRMIFBRZCEHKAJMJGVSUXBEIMHXAJFCXUKOEMWMVFFPYVEBKNQBKEHRTDTJTWKMQNXMKNWNQNJLURNXAJFBVYURUKAQSOYIRTQTCLUJTJZUDNDGJMHRUDFCRHDZCRHSUJSPTJKBLHXBXZJGDYIRUYRTPQGDZDLVSVXTJUQTPKVYNPSHZIXAWGCVDGVSORHQADZPLAQNJZIYPDSBYWZISGQNUPSADTJTCYIMBYBMBLBEUPNWFUYPFBDNRAQTXGQMJDNQWFOXTJMIROELHRYOMVKAQAYORHPSISISVQMVDNQMOLOXSBDMQZPSOYBVKTCHKTCYTWDGPFIEHFARNAWYITVTJRVENVRNQGVEMWSGPXAQZIKGJZIEGWFPFAPZBYNWYOEGCYOKOEZVDNWSUEGYHDGWMVYTQS

weibo_医生说药不能停_0

错误信息中文意思是语法错误,你缩进不对

习惯受伤

Python需要严格注意缩进
随时随地看视频慕课网APP

相关分类

Python
我要回答