@ganstar565

В чем заключается ошибка в коде python?

Ниже представлена часть кода игры "крестики нолики"
В функции court переменные s1, s2, s3 - это три строки. c1, c2, c3 - столбци. В общем под ними подразумеваются победные комбинации.
Пример:
self.s1 = self.b1.background_color and self.b2.background_color and self.b3.background_colo
b1 - это верхняя левая клетка, b2 - вторая, верхняя и b3 - клетка расположенная в верхнем правом углу.


Дальше идут условия. В моём ошибочном(я так понимаю) понимании первое условие
if self.s1 == color1 or color2:
            print("s1")
            return self.s1


расшифровывается следующим образом.
Если первые 3 клетки(на которых должен стоять крестик или нолик) желтые или фиолетовые - вернуть эти клетки.
НО проблема заключается в том, что это условие срабатывает всегда (причем s1 иногда печатается по 2 раза), вне зависимости от того какого цвета клетки, помимо того даже если все клетки в строке одного цвета - игра перезапускается через раз и уже тут мне нужна помощь. Пожалуйста помогите найти причину по которой так происходит.

spoiler
color1 = [1,1,0,1]
color2 = [.5, 0, .5 ]

c = 1
class freestyle(GridLayout):
    def court(self):
        global color1
        global color2
        self.s1 = self.b1.background_color and self.b2.background_color and self.b3.background_color
        self.s2 = self.b4.background_color and self.b5.background_color and self.b6.background_color
        self.s3 = self.b7.background_color and self.b8.background_color and self.b9.background_color
        self.c1 = self.b1.background_color and self.b4.background_color and self.b7.background_color
        self.c2 = self.b2.background_color and self.b5.background_color and self.b8.background_color
        self.c3 = self.b3.background_color and self.b6.background_color and self.b9.background_color
        self.d1 = self.b1.background_color and self.b5.background_color and self.b9.background_color
        self.d2 = self.b3.background_color and self.b5.background_color and self.b7.background_color
        

        if self.s1 == color1 or color2:
            print("s1")
            return self.s1
        
        if self.s2 == color1  or color2:
            print("s2")
            return self.s2
        
        if self.s3 == color1  or color2:
            return self.s3
        
        if self.c1 == color1  or color2:
            print("c1")
            return self.c1

        if self.c2 == color1  or color2:
            return self.c2

        if self.c3 == color1  or color2:
            return self.c3

        if self.d1 == color1  or color2:
            return self.d1

        if self.d2 == color1  or color2:

            return self.d2


    def reload(self):   
        global c
        self.b1.background_color =[0, .79, .05, 1]
        self.b2.background_color =[0, .79, .05, 1]
        self.b3.background_color =[0, .79, .05, 1]
        self.b4.background_color =[0, .79, .05, 1]
        self.b5.background_color =[0, .79, .05, 1]
        self.b6.background_color =[0, .79, .05, 1]
        self.b7.background_color =[0, .79, .05, 1]
        self.b8.background_color =[0, .79, .05, 1]
        self.b9.background_color =[0, .79, .05, 1]
        c +=1
    def win(self):
        if self.court() == [1,1,0,1]:
            self.lab.text = f"{player1} WIN"
            sleep(2)
            self.reload()
        
        if self.court() == [.5, 0, .5 ]:
            self.lab.text = f"{player2} WIN"
            sleep(2)
            self.reload()
             
    def bb1(self):
        global c
        if c % 2 or c == 0:
            self.lab.text = f"ходит: {player1}"
            self.b1.background_color = [1, 1, 0, 1 ]
            c +=1
        else: 
            self.b1.background_color = [.5, 0, .5 ]
            self.lab.text = f"ходит: {player2}"
            c = 1
        self.win()

    def bb2(self):
        global c
        if c % 2 or c == 0:
            self.lab.text = f"ходит: {player1}"
            self.b2.background_color = [1, 1, 0, 1 ]
            c +=1
        else: 
            self.b2.background_color = [.5, 0, .5 ]
            self.lab.text = f"ходит: {player2}"
            c +=1
        self.win()
    

    def bb3(self):
        global c
        if c % 2 or c == 0:
            self.lab.text = f"ходит: {player1}"
            self.b3.background_color = [1, 1, 0, 1 ]
            c +=1
        else: 
            self.b3.background_color = [.5, 0, .5 ]
            self.lab.text = f"ходит: {player2}"
            c +=1
        self.win()
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 2
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Это типичная ошибка тех, кто не учил язык. Попробуйте так:
if self.s1 in [color1, color2]:
Ответ написан
solotony
@solotony
покоряю пик Балмера
Проблема в вашем коде заключается в неправильном понимании того, как Python обрабатывает условия с использованием оператора or и сравнения объектов.

Вот строка кода, которая вызывает проблему:

python

if self.s1 == color1 or color2:

В этой строке вы предполагаете, что условие проверяет, равна ли переменная self.s1 цвету color1 или цвету color2. Однако это не совсем верно.

Вместо этого, вы сравниваете self.s1 с color1, а затем проверяете, является ли color2 истинным (True) или ложным (False). Если color2 не равно None, то это условие всегда будет выполняться, потому что любое непустое значение в Python считается истинным.

Чтобы исправить это, вы должны явно сравнивать self.s1 с color1 и self.s2 с color2. Вот исправленный фрагмент кода:

python

if self.s1 == color1 or self.s1 == color2:
    print("s1")
    return self.s1


Вы должны применить аналогичные исправления ко всем условиям, где вы используете оператор or для сравнения переменных.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы