Я новичок в Python (изучаю его чуть более 1 месяца), и я попытался создать Ti c Ta c Toe. Однако, как только я закончу это, я решу расширить доску (с 3x3 до 9x9 в зависимости от ввода клиента) и разрешить выигрыш, соединив 4 в ряд, столбец или диагональ в любом месте доски.
Поэтому я нужна была функция, которая ищет - в зависимости от ввода клиента - во всех направлениях на доске, не выходя за борт, для 3-х подключенных ячеек с одной и той же отметкой.
Тогда я понимаю, что на самом деле мне нужно проверять одновременно в обоих в противоположном направлении от отметки, поскольку существует вероятность того, что размещенная в данный момент отметка может соединить другие группы с такой же отметкой и выиграть, выполнив это.
Ниже вы можете найти мое решение вышеуказанного условия выигрыша, которое работает, однако это не выглядит красиво, поскольку есть много повторяющихся, почти идентичных для циклов. Но я понятия не имею, как их объединить.
Есть 8 петель (так как есть 8 направлений), в 4 группах противоположных направлений, и каждая l oop проверяет, есть ли следующая ячейка с тем же значение (отметка) как то, которое в данный момент размещено клиентом (либо «O», либо «X»). Если это значение, то переменная count увеличивается на 1. Если нет - l oop разрывается. Затем я проверяю, удалось ли двум противоположным петлям направления считать == 4. Если да - у нас есть победитель. Если нет - мы go к следующей паре.
Я уверен, что поддерживать код проще, но я не могу придумать ни одного.
Спасибо за вашу помощь !
PS если есть необходимость, я выложу больше из своего кода
def do_we_have_a_winner(position, current_mark):
global game_board
connect = 4
# unpacking the coordinates of the current position
x, y = coordinates[position]
length = len(game_board)
count = 0
for i in range(0, connect):
if (x-i in range(0, length)) and (y+i in range(0, length)):
if game_board[x-i][y+i] != current_mark:
break
else:
count += 1
for i in range(1, connect):
if (x+i in range(0, length)) and (y-i in range(0, length)):
if game_board[x+i][y-i] != current_mark:
break
else:
count += 1
if count == connect:
print("We have a winner!")
return True
count = 0
for i in range(0, connect):
if (x+i in range(0, length)) and (y+i in range(0, length)):
if game_board[x+i][y+i] != current_mark:
break
else:
count += 1
for i in range(1, connect):
if (x-i in range(0, length)) and (y-i in range(0, length)):
if game_board[x-i][y-i] != current_mark:
break
else:
count += 1
if count == connect:
print("We have a winner!")
return True
count = 0
for i in range(0, connect):
if (y+i in range(0, length)):
if game_board[x][y+i] != current_mark:
break
else:
count += 1
for i in range(1, connect):
if (y-i in range(0, length)):
if game_board[x][y-i] != current_mark:
break
else:
count += 1
if count == connect:
print("We have a winner!")
return True
count = 0
for i in range(0, connect):
if (x+i in range(0, length)):
if game_board[x+i][y] != current_mark:
break
else:
count += 1
for i in range(1, connect):
if (x-i in range(0, length)):
if game_board[x-i][y] != current_mark:
break
else:
count += 1
if count == connect:
print("We have a winner!")
return True
return False