← Все вопросы

крестики нолики в консоли на python, помогите доделать поле

Задан 13 месяцев назад1.1к просмотров2 ответа
7

Пишу крестики-нолики на двоих в консоли. Поле рисую, ходы делаю, а вот проверить кто выиграл и нарисовать красиво не получается. Сейчас поле — это список из 9 элементов:

board = [" "] * 9
print(board)  # выглядит ужасно: [' ', ' ', ' ', ...]

Как нарисовать сетку 3х3 и понять что три в ряд?

2 ответа

12
✓ Принятый ответ — помог автору

Держи рабочую версию на двоих. Поле — список из 9 клеток, игрок вводит номер 1-9.

board = [" "] * 9

def draw():
    for i in range(0, 9, 3):
        print(f" {board[i]} | {board[i+1]} | {board[i+2]} ")
        if i < 6:
            print("---+---+---")

wins = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]

def winner():
    for a, b, c in wins:
        if board[a] == board[b] == board[c] != " ":
            return board[a]
    return None

player = "X"
for turn in range(9):
    draw()
    pos = int(input(f"Ход {player}, клетка 1-9: ")) - 1
    if board[pos] != " ":
        print("Занято!")
        continue
    board[pos] = player
    if winner():
        draw()
        print(f"Победили {player}!")
        break
    player = "O" if player == "X" else "X"
else:
    draw()
    print("Ничья!")

Как работает: draw() рисует поле строками по 3 клетки. В wins лежат все 8 выигрышных линий (3 строки, 3 столбца, 2 диагонали). winner() проверяет, не заняты ли три клетки одной линии одним символом. После хода меняем игрока строчкой "O" if player == "X" else "X". Если за 9 ходов никто не выиграл — else у цикла for срабатывает и это ничья.

Как улучшить: добавь простого бота вместо второго игрока — пусть комп ходит в случайную свободную клетку через random.choice.

3

Совет: выведи рядом подсказку с номерами клеток (как на телефоне), новичкам сразу понятно куда ходить:

print(" 1 | 2 | 3")
print(" 4 | 5 | 6")
print(" 7 | 8 | 9")

И оберни int(input()) в try/except, а то от буквы всё падает.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект