Глава 17 · Проект: «Крестики-нолики»

Проверяем после каждого хода, победил ли игрок

Восемь возможных выигрышных линий — три строки, три столбца, две диагонали.

После каждого хода нужно проверить: не выстроились ли три одинаковых символа подряд. Всего в игре восемь возможных «выигрышных линий» — три строки, три столбца и две диагонали:

proverka_pobedy.py
def proverit_pobedu():
    linii_pobedy = [
        (0, 1, 2), (3, 4, 5), (6, 7, 8),  # строки
        (0, 3, 6), (1, 4, 7), (2, 5, 8),  # столбцы
        (0, 4, 8), (2, 4, 6),             # диагонали
    ]
    for a, b, c in linii_pobedy:
        znacheniya = (polya[a]["text"], polya[b]["text"], polya[c]["text"])
        if znacheniya[0] != "" and znacheniya[0] == znacheniya[1] == znacheniya[2]:
            return znacheniya[0]   # 'X' или 'O' — есть победитель
    return None   # победителя пока нет
Список кортежей — компактный способ описать 8 линий
Каждая линия — кортеж (глава 11) из трёх индексов поля. Список из восьми таких кортежей заменяет восемь отдельных проверок if, которые пришлось бы писать вручную.

Ничья

Если все девять клеток заполнены, а победителя нет — это ничья:

proverka_nichyej.py
def polye_zapolneno():
    return all(knopka["text"] != "" for knopka in polya)
Практика в Jupyter Notebook
17-05-pobeda.ipynb · проверка победы и ничьей
Открыть ноутбук →