Пишу игру крестики нолики. Как организовать проверку победных случаев?

Naive014

Новичок
Пользователь
Окт 10, 2022
18
0
1
Всем привет. Пишу игру крестики нолики с GUI на tkinter. Начал так, что при нажатии на кнопку командной ноликов clicked_button.use_btn_toe = True и также для крестиков, то есть можно отследить какой командой нажималась кнопка . Также создал словарь с парочкой победных случаев. Но как сделать так, чтобы это проверялось и при этом победа засчитывалась определенной из команд.
Вот код:
Python:
import tkinter as tk
from tkinter.messagebox import showinfo

class MyButton(tk.Button):

    def __init__(self, master, x, y, number=0, *args, **kwargs):
        super(MyButton, self).__init__(master, *args, **kwargs)
        self.x = x
        self.y = y
        self.number = number

    def __repr__(self):
        return f'MyButton {self.x} {self.y}'

win_m = {
    1: ['.!mybutton', '.!mybutton2', '.!mybutton3'],
    2: ['.!mybutton3', '.!mybutton5', '.!mybutton7'],
    3: ['.!mybutton', '.!mybutton5', '.!mybutton9']

}

class TTT:
    window = tk.Tk()
    queue = [1, 2]
    use_btn_cross = False
    use_btn_toe = False

    def __init__(self):
        self.buttons = []
        count = 0
        for i in range(1, 4):
            temp = []
            for j in range(1, 4):
                btn = MyButton(TTT.window, x=i, y=j,  width=3, font='Calibri 15 bold')
                btn.config(command=lambda button=btn: self.click(button))
                temp.append(btn)
                count += 1
            self.buttons.append(temp)


    def click(self, clicked_button: MyButton):
        print(clicked_button)
        if TTT.queue[0] == 1:
            clicked_button.config(text='x', fg='black')
            clicked_button.TTT.use_btn_cross = True
            TTT.queue.pop(0)
            TTT.queue.append(1)
            self.check_win(clicked_button)
        else:
            clicked_button.config(text='O', fg='red')
            clicked_button.TTT.use_btn_toe = True
            TTT.queue.pop(0)
            TTT.queue.append(2)
            self.check_win(clicked_button)
        
    def menu(self):
        print('Вы находитесь в текстовом меню игры',
        'Крестики-Нолики',
        'Если Вы хотите запустить игру, то введите "старт"',
        'Если Вы хотите выйти, то введите "выход"',
        end='\n'
        )
        x = input('Вводить сюда:')
        if x == 'старт':
            self.start
        elif x == 'выход':
            exit()

    def check_win(self, clicked_button: MyButton):
        wins = win_m
        if clicked_button.use_btn:
            if TTT.queue[1] == 1:
                    showinfo('WIN', 'Выиграла команда крестиков')
            elif TTT.queue[1] == 1:
                showinfo('WIN', 'Выиграла команда ноликов')


    def create_widgets(self):
        count = 0
        for i in range(3):
            for j in range(3):
                btn = self.buttons[i][j]
                btn.number = count
                btn.grid(row=i, column=j)#, stick='NEWS')
                count += 1

    def start(self):
        self.create_widgets()
        TTT.window.mainloop()

ttt = TTT()
[QUOTE]
ttt.start()
[/QUOTE]
[QUOTE]

[/QUOTE]
[QUOTE]
[/QUOTE]
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
932
208
43
20
Москва
по хорошему надо хранить где-то, например в списке, все поле, и менять его, и проверять победу по нему, и по нему же отрисовывать поле
 

Naive014

Новичок
Пользователь
Окт 10, 2022
18
0
1
сделал вот такую функцию:
Python:
def check_win(self):
        temp1 = []
        for i in win_m.values():
            for g in i:
                if TTT.queue[1] == 2:
                    for j in TTT.use_btn_toe:
                        if g == j:
                            temp1.append(g)
                    if len(temp1) == len(i):
                        showinfo('WIN', 'Победила команда ноликов')
                else:
                    for j in TTT.use_btn_cross:
                        if g == j:
                            temp1.append(g)
                    if len(temp1) == len(i):
                        showinfo('WIN', 'Победила команда крестиков')
и словарь с случаями победы:
Python:
win_m = {
    1: ['MyButton 0', 'MyButton 1', 'MyButton 2'],
    2: ['MyButton 3', 'MyButton 4', 'MyButton 5'],
    3: ['MyButton 6', 'MyButton 7', 'MyButton 8'],
    4: ['MyButton 0', 'MyButton 3', 'MyButton 6'],
    5: ['MyButton 1', 'MyButton 4', 'MyButton 7'],
    6: ['MyButton 2', 'MyButton 5', 'MyButton 8'],
    7: ['MyButton 0', 'MyButton 4', 'MyButton 8'],
    8: ['MyButton 2', 'MyButton 4', 'MyButton 6'],
}
но ничего не работает
 

Форум IT Специалистов