Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937

Ревью "Крестики-нолики"

02.11.2021, 11:54. Показов 2111. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день, просьба глянуть код, буду рад предложениям/замечаниям

Так же буду рад если скажите, что все "Ок"

Вроде все работает)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
class Game:
    def __init__(self) -> None:
        """
        :param: нет
 
        Инициализируем основные категории игры:
        self.players_sticker - список маркеров игроков (крестик и нолик);
        self.field_play - список игрового поля состоящий из int чисел (1-9);
        self.player_id - id игрока (0 - первый игрок, который всегда X, 1 - второй игрок, который всегда О)
        self.win - переменная победы, которая всегда False, пока не наступит событие победы (см. ф-цию winner)
        :return:
        None
 
        """
        self.players_sticker = ["X", "O"]
        self.field_play = [
            1, 2, 3,
            4, 5, 6,
            7, 8, 9,
        ]
        self.player_id = 0
        self.win = False
 
    def play(self) -> None:
        """
        :param: нет
 
        Логика игры:
        1. Показать поле
        2. В бесконечном цикле пока не наступит одно из событий (ничья/победа):
            2.1. Проверка на ничью
            2.2. Ход игрока №_ (ввод № свободного поля, доп. проверки на занятость поля и на int значение)
                2.1.1. Поставить стикер игрока на не занятое поле
                2.1.2. Отобразить поле
                2.1.3. Проверка победы
                2.1.4. Смена игрока
 
        :return:
        None
 
        """
        print("Начинаем игру Tic Tac Toe!")
        print("Игрок №1 ходит первым и он всегда 'X'")
        # показать поле
        self.show_field()
 
        while self.win == False:
 
            # проверка на ничью
            is_draw = self.draw()
            if is_draw:
                print("У нас ничья!")
                break
 
 
            # если ничьи нет продолжаем игру
            print("_" * 30)
            print(f'Ход игрока №{self.player_id + 1}')
 
            try:
 
                select_field = int(input("Ведите № поля 1-9 (исключая занятые): "))
                if str(self.field_play[select_field - 1]).isdigit():
                    self.field_play[select_field - 1] = self.players_sticker[self.player_id]
                    # показать поле
                    self.show_field()
                    # проверка победы
                    self.win = self.winner()
                    if self.win:
                        print(f'Победил игрок №{self.player_id + 1}')
                        break
                    # Смена игрока
                    if self.player_id == 0:
                        self.player_id = 1
                    else:
                        self.player_id = 0
                else:
                    print("Поле уже занято. Попробуйте еще раз!")
                    continue
 
            except:
                print("Что-то не то Вы ввели. Попробуйте еще раз!")
                continue
 
    def show_field(self) -> None:
        """
        :param: нет
 
        Функция отрисовывает игровое поле.
 
        :return:
        None
 
        """
        print("_" * 10, "Поле", "_" * 10)
        print("-" * 13)
        for i in range(3):
            print("|", self.field_play[0 + i * 3], "|", self.field_play[1 + i * 3], "|",
                  self.field_play[2 + i * 3], "|")
            print("-" * 13)
        print("_" * 10, "Поле", "_" * 10)
 
    def winner(self) -> bool:
        """
        :param: нет
 
        Функция проверяет на победу одного из игроков.
        Т.к. выигрышные комбинации заранее известны,
        то функция перебирает их и сравнивает что стоит
        (крестик или нолик) на выигрышных позициях.
 
        :return:
        False - если на выигрышных комбинациях стоят разные знаки, игра продолжается
        True - если на выигрышных комбинациях стоят одинаковые знаки, иградолжна закончится
 
        """
        win_coord = ((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 each in win_coord:
            if self.field_play[each[0]] == self.field_play[each[1]] == self.field_play[each[2]]:
                return True
        return False
 
    def draw(self) -> bool:
        """
        :param: нет
 
        Функция проверяет на ничью.
        Т.к. поле представляет собой список
        состоящий из int чисел, то при их отсутсвии
        в списке self.field_play должна быть объявлена
        ничья и игра должна быть закончена.
 
        :return:
        False - если на поле остались числа, игра продолжается
        True - eсли на поле нет чисел, игра должна закончится
 
        """
        for each in self.field_play:
            if str(each).isdigit():
                return False
        return True
 
 
if __name__ == '__main__':
    game = Game().play()
2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.11.2021, 11:54
Ответы с готовыми решениями:

Нолики-крестики
Напишите программу, которая определяет, кто выиграл в крестики-нолики на увеличенном квадратном поле, выстроив подряд по горизонтали или по...

Крестики-нолики с ИИ
Здравствуйте! помогите разобраться с ошибкой: Traceback (most recent call last): File...

Крестики-нолики 5 х 5
Помогите написать бота на крестики нолики. Игрок против игрока уже написала, осталось только игру с компьютером продумать. Прототип...

6
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
02.11.2021, 13:29
Михалыч, Простенький AI, интерфейс и будет вообще отлично.

Добавлено через 1 минуту
А если модельки поведения заложить и пару стратегий, то можно пускать 2 AI, да пусть рубятся, можно накидать рандома в ходы, на 1000 итерации посмотреть лучшие решения и тд, но это так, фантазия)))))
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,687
Записей в блоге: 29
02.11.2021, 13:37
Цитата Сообщение от Михалыч Посмотреть сообщение
param: нет
и зачем тогда писать?) на нет и суда нет

Цитата Сообщение от Михалыч Посмотреть сообщение
:return:
       None
опять же - очевидно что инит ничего не вернет

Цитата Сообщение от Михалыч Посмотреть сообщение
["X", "O"]
список можно изменить, а что нельзя менять, но похоже на список?)

Цитата Сообщение от Михалыч Посмотреть сообщение
self.field_play
playfield?

Цитата Сообщение от Михалыч Посмотреть сообщение
# показать поле
лишний (очевидный) коммент, убери все

Цитата Сообщение от Михалыч Посмотреть сообщение
while self.win == False:
while not self.win:
Цитата Сообщение от Михалыч Посмотреть сообщение
# проверка на ничью
            is_draw = self.draw()
            if is_draw:
                print("У нас ничья!")
                break
коммент не нужен, переменная не нужна. то есть
if self.draw():
...
Цитата Сообщение от Михалыч Посмотреть сообщение
except:
                print("Что-то не то Вы ввели. Попробуйте еще раз!")
а если дело не в вводе? перехватывай конкретное исключение

Цитата Сообщение от Михалыч Посмотреть сообщение
for each in self.field_play:
            if str(each).isdigit():
                return False
        return True
any или all?
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
02.11.2021, 15:53  [ТС]
Цитата Сообщение от enx Посмотреть сообщение
А если модельки поведения заложить и пару стратегий, то можно пускать 2 AI, да пусть рубятся, можно накидать рандома в ходы, на 1000 итерации посмотреть лучшие решения и тд, но это так, фантазия)))))
надо непременно попробовать, спасибо)
Цитата Сообщение от Welemir1 Посмотреть сообщение
а что нельзя менять, но похоже на список?
понял, люблю я списки)
Цитата Сообщение от Welemir1 Посмотреть сообщение
while not self.win:
Вооот! А то препод говорит "while self.win is False:" нельзя, ладно, "while self.win == False:" тоже не рекомендуется... Да как нельзя-то работает же
Цитата Сообщение от Welemir1 Посмотреть сообщение
any или all?
Так можно?
Python
1
2
3
4
        if all(x == "X" or x == "O" for x in self.play_field):
            return True
        else:
            return False
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
02.11.2021, 16:14
Цитата Сообщение от Михалыч Посмотреть сообщение
Так можно?
Масло масляное:
Python
1
return all(x == "X" or x == "O" for x in self.play_field)
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
02.11.2021, 16:17  [ТС]
Arsegg, Спасибо)
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
02.11.2021, 16:22
Михалыч,
Python
1
return all(map("XO".__contains__, self.play_field))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2021, 16:22
Помогаю со студенческими работами здесь

Крестики-нолики
Два игрока играют в крестики-нолики. Напишите программу, которая после каждого хода игрока проверяет поле и, если игра завершилась, выводит...

Крестики-нолики
Напишите функцию tic_tac_toe(field), которая принимает на вход список списков 3х3 — поле игры в крестики-нолики. На этом поле отражен...

Крестики-нолики
Пишу крестики нолики, этот кусок кода отвечает за считывание матрицы и проверку на победителя, вот в чем заключается проблема: Не понимаю...

Крестики - нолики
Есть готовый код, дали задание разобрать логику кода, шаг за шагом... что-то у меня всё запуталось в голове, может кто-то поможет...

Крестики-нолики
Напишите функцию Tic_tac_toe(field), которая принимает на вход список списков 3х3 - поле игры в крестики-нолики. Незанятой (пустой) клетке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru