@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 для сравнения переменных.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы