【问题标题】:Chess Gui change player with tkinterChess Gui 用 tkinter 改变玩家
【发布时间】:2018-05-25 15:27:20
【问题描述】:

问题是当我更换播放器时它不会卡住播放器

编辑:我编辑了代码。

这个函数创建了棋盘的外壳,它只是代码的一半,因为它对每个部分都是一样的:

def cree_case(ligne, colonne):

    case = Canvas(frame, width=100, height = 100,highlightthickness=1,highlightbackground="black")
    def click(event):
        joue(ligne,colonne)
    def click2(event):
        label_joueur["text"]="cchzohdc" 
        joue2(ligne,colonne,l,c,joue)
    label_joueur["text"]=("choissisez une piece")
    case.bind('<Button-1>',click)
    case.bind('<Button-3>',click2)
    x, y = 55, 55
    if board[ligne][colonne][0]== "F" and board[ligne][colonne][2]=="W":
        case.create_image(x,y,image=fou_blanc)
    elif board[ligne][colonne][0]== "F" and board[ligne][colonne][2]=="N":
        case.create_image(x,y,image=fou_noir)

这里有三个功能,我用来玩和移动以及改变播放器:

def joue(ligne, colonne):
    global l,c
    print( ligne, colonne)
    l,c= ligne,colonne

def player(): # cette fonction permet de jouer et changer de joueur
    if joueur == "joueur1":
        return "joueur2"
    elif joueur=="joueur2":
        return "joueur1"
def joue2(ligne,colonne,l,c,joue,):
     player()
     m=ligne
     n=colonne
    if not est_valide(joueur,l,c,m,n) or not pion_valide(l,c,m,n,joueur) or not dame_valide(l,c,m,n,joueur) or not  fou_valide(l,c,m,n) or not roi_valide(l,c,m,n) or not  cavalier_valide(l,c,m,n) or not tour_valide(l,c,m,n,joueur) or not  pion_valide(l,c,m,n,joueur)  :
        print("mauvais")
        faux=Toplevel(Fenetre, height= 100, width = 100)
        case1 = Canvas(faux, width=100, height     100,highlightthickness=1,highlightbackground="black")
        v= 50 
        w= 50
        case1.create_image(v,w,image=stop)
        case1.grid()
        faux.mainloop()
    elif est_victorieux(joueur):
        board[m][n]=board[l][c]
        board[l][c]="___"
        frame.destroy()
        label_joueur["text"]=("Echec et mat")
    else:
        board[m][n]=board[l][c]
        board[l][c]="___"
        if est_victorieux(joueur):
            frame.destroy()
            label_joueur["text"]=("Echec et mat")
        else:
            affiche_grille()


joueur="joueur1"
affiche_grille()

【问题讨论】:

  • 你做了什么来调试这个?是什么阻止您更换播放器?
  • 我在 player() 中添加了 print(joueur),播放器确实显示“joueur1”,但每次都显示“joueur1”
  • 这是因为函数播放器里面有joueur="joueur1"。

标签: python python-3.x tkinter chess


【解决方案1】:

当您调用函数player 时,您不会将返回值分配给任何变量。

def click3(event):
    player(joueur)

您在函数player 中使用变量joueur 来检查哪个玩家处于活动状态,但是当您为joueur 分配一个新值时,您会在本地范围 中执行此操作,即意味着这个赋值不会影响全局变量。

Sooo...,您必须从player 获得回报,或者将变量joueur 设为全局变量。

答案更新

我已将代码减少到最低限度以显示机制。这可以通过多种方式完成,我选择其中一种。

您不需要将joueur 作为函数player() 的参数。您只有 一个 变量来指示哪个玩家处于活动状态,因此应该很容易跟踪。当你运行一个函数时,它会在函数内查找变量joueur,但如果它没有找到它,它将在全局范围内查找。

函数player() 不会改变变量joueur,它只是返回一个值。语句joueur = player(joueur) 将新值赋给全局变量joueur

def click3(event):  # Callback for middle mouse button
    return player() # Change player

def player(): # cette fonction permet de jouer et changer de joueur
    if joueur == "joueur1":
        return "joueur2"    # Return the other player
    else:
        return "joueur1"    # Return the other player

joueur = "joueur1"  # Variable joueur in the global scope
print(joueur)

# Switch player a couple of times and print it
joueur = player() 
print(joueur)
joueur = player()
print(joueur)
joueur = player()
print(joueur)

【讨论】:

  • 当我输入return joueur 时,它确实将播放器更改为“joueur2”,但问题是它保持为“joueur2”。每次我玩它都不会改变
  • 好吧,每次我再玩时它都会改变播放器,我在函数affiche_grille()print(joueur)中添加了joueur=player(),但我仍然扮演“joueur1”,因为函数joue2采用第一个任务我做了joueur="joueur1"作为玩家的名字。
  • 我不使用click3(event),因为我认为只需要将player() 添加到affiche_grille
  • 抱歉,如果您需要一些代码方面的帮助,请提供您需要帮助的代码。由于您的代码也不完整(不运行),我试图解释一种机制。你了解它的工作原理吗?
【解决方案2】:

所以我终于成功了,我只是添加了这个:

if joueur == "joueur1":
    joueur = "joueur2"
    label_joueur["text"] = joueur #This is optionnal, it's just details
else:
    joueur = "joueur1"
    label_joueur["text"] = joueur

joue2(ligne,colonne,l,c,joue)这样的:

def joue2(ligne,colonne,l,c,joue):
    global joueur
    m=ligne
    n=colonne
    if not est_valide(joueur,l,c,m,n) or not pion_valide(l,c,m,n,joueur) or not dame_valide(l,c,m,n,joueur) or not  fou_valide(l,c,m,n) or not roi_valide(l,c,m,n) or not  cavalier_valide(l,c,m,n) or not tour_valide(l,c,m,n,joueur) or not  pion_valide(l,c,m,n,joueur)  :
        print("mauvais")
        faux=Toplevel(Fenetre, height= 100, width = 100)
        case1 = Canvas(faux, width=100, height = 100,highlightthickness=1,highlightbackground="black")
        v= 50 
        w= 50
        case1.create_image(v,w,image=stop)
        case1.grid()
        faux.mainloop()
    elif est_victorieux(joueur):
        board[m][n]=board[l][c]
        board[l][c]="___"
        frame.destroy()
        label_joueur["text"]=("Echec et mat")
    else:
        board[m][n]=board[l][c]
        board[l][c]="___"
        if est_victorieux(joueur):
            frame.destroy()
            label_joueur["text"]=("Echec et mat")
        else:
            if joueur == "joueur1":
                joueur = "joueur2"
                label_joueur["text"] = joueur
            else:
                joueur = "joueur1"
                label_joueur["text"] = joueur
        affiche_grille()

您需要添加全局 jueur 才能使这项工作。

【讨论】:

  • 这是为了回答这个问题吗?如果是这样,如果你解释你做了什么不同的事情会更好。否则,我们必须将这段代码与原始代码逐行​​逐字符进行比较。
  • 不是当前代码的答案,它仍然不起作用
  • 答案部分仅用于答案。如果您需要提供更多信息,请编辑您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多