Шахматный Gui сменить игрока с ткинтер - PullRequest
0 голосов
/ 25 мая 2018

Проблема в том, что он не блокирует игрока, когда я меняю игрока

Редактировать: я редактировал код.

Эта функция создает корпус доски, это только половина кодапотому что это одинаково для всех фигур:

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()

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Итак, я наконец-то заставил это работать, я просто добавил это:

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()

Вам нужно добавить глобальный joueur, чтобы сделать эторабота.

0 голосов
/ 26 мая 2018

Когда вы вызываете функцию player, вы не назначаете возврат какой-либо переменной.

def click3(event):
    player(joueur)

Вы используете переменную joueur в функции player, чтобы проверить, какой игрок активен, но когда вы присваиваете новое значение для joueur, вы делаете это в локальной области действия , что означает, что это назначение не повлияет на глобальную переменную.

О-о-о-о-о, вам нужно будет извлечь возврат из 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)
...