Проверка победы по диагонали игра 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 шт):
Все диагонали длины пять на таком поле можно описать координатами (индексами) их левого конца и их направлением (вверх или вниз). Тогда можно разбирать эти два случая отдельно перебором допустимых координат левой границы:
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
Если вы желаете также реализовать саму игру "крестики-нолики", то я бы рекомендовал использовать не данную функцию для проверки победы, а проверять только те отрезки, которые включают в себя клетку последнего хода, особенно для игры на большом поле.