Проверка победы по диагонали игра 5 в ряд Python

Необходимо реализовать функцию для поиска 5 одинаковых знаков Х либо О по диагонали, на игровом поле 10х10, заданное двумерным списком знаков, не могу никак сделать. Ниже код моей попытки self.field является полем. Smb знак, self.counter счетчик подряд идущих знаков.

try:

            for i in range(1,5):
                if self.field[row+i][col+i]['text'] == smb:
                    self.counter+=1
                    print("c",self.counter)
                else:
                    self.counter = 0
            for i in range(1,5):
                if self.field[row-i][col-i]['text'] == smb:
                    self.counter+=1
                    print("c",self.counter)
                else:
                    self.counter = 0
            for i in range(1,5):
                    
                if self.field[row+i][col-i]['text'] == smb:
                    self.counter+=1
                    print("c",self.counter)
                else:
                    self.counter = 0
            for i in range(1,5):        
                if self.field[row-i][col+i]['text'] == smb:

                    counter+=1
                    print("c",self.counter)
                else:
                    self.counter = 0
                    
                           
            if counter == 4:
                print("win")
                self.game_run = False
                self.winner = smb
                answer =  mb.askyesno(title='Game Over',message="Виграли {} Бажаєте продовжити гру?".format(smb))
                if answer == True:
                    self.new_game()
                else:
                    root.destroy()
                        
        except IndexError:
            pass 

Ответы (1 шт):

Автор решения: EzikBro

Все диагонали длины пять на таком поле можно описать координатами (индексами) их левого конца и их направлением (вверх или вниз). Тогда можно разбирать эти два случая отдельно перебором допустимых координат левой границы:

def who_win(table):
    crosses_wins = 0
    noughts_wins = 0
    
    for y in range(6):
        for x in range(6):
            ch = table[y][x]
            win = True
            for i in range(1, 5):
                if table[y + i][x + i] != ch:
                    win = False
                    break
            if win:
                if ch == 'X':
                    crosses_wins += 1
                elif ch == 'O':
                    noughts_wins += 1

    for y in range(4, 10):
        for x in range(6):
            ch = table[y][x]
            win = True
            for i in range(1, 5):
                if table[y - i][x + i] != ch:
                    win = False
                    break
            if win:
                if ch == 'X':
                    crosses_wins += 1
                elif ch == 'O':
                    noughts_wins += 1

    return crosses_wins, noughts_wins

Если вы желаете также реализовать саму игру "крестики-нолики", то я бы рекомендовал использовать не данную функцию для проверки победы, а проверять только те отрезки, которые включают в себя клетку последнего хода, особенно для игры на большом поле.

→ Ссылка