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

Крестики-нолики. Кому делать нечего научите как исправить ошибку

01.01.2019, 18:54. Показов 1923. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникает при результате ничья.
File "6tick-tack-toe.py", line 212, in <module>
main()
File "6tick-tack-toe.py", line 205, in main
board[move] = computer
TypeError: list indices must be integers or slices, not NoneType

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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#Крестики-нолики
#Компьютер играет в крестики-нолики против пользователя
#Глобальные константы
X = 'X'
O = 'O'
EMPTY = ''
TIE = 'Ничья'
NUM_SQUARES = 10
 
#Функция display_insrtuct() - выводит на экран инструкцию для игрока
def display_insr():
    '''Выводит на экран инструкцию  для игрока.'''
    print('''
Добро пожаловать на ринг грандиознейших интеллектуальных состязаний всех времен.
Твой мозг и мой процессор  сойдутся в схватке за доской игры "Крестики-нолики".
Чтобы сделать ход, введи число от 0 до 8. Числа однозначно соответствуют полям 
доски - так, как показано ниже:
 
        7|8|9
        -----
        4|5|6
        -----
        1|2|3
 
Приготовься к бою, жалкий белковый человечишка. Вот-вот начнется решающее сражение.\n
        ''')    
 
#Функция ask_yes_no() - функция задает вопрос, ответом на который должно быть "Да" или "Нет"
#Она принимает  текст вопроса и возвращает букву "y" или "n"
def ask_yes_no(question):
    '''Задает вопрос с ответом "Да" или "Нет".'''
    response = None
    while response not in ('y','n'):
        response = input(question).lower()
    return response
 
#Функция ask_number() запрашивает о вводе числа, лежащего в заданном диапазоне.
#Она принимает текст вопроса, нижнюю и верхнюю границы диапазона, а возвращает число 
#из этого диапазона.
def ask_number(question, low, high): ##
    '''Провит ввести число из диапазона'''
    response = None
    while response not in range(low, high): ##
        response = int(input(question))
    return response
 
 
 
#Функция pieces() эта функция спрашивает пользователя желает ли он 
#сделать ход первым и исходя из этого определяет типы фишек игроков. 
#Первый ход - крестики
def pieces():
    '''Определяет принадлежность первого хода'''
    go_first = ask_yes_no('Хочешь оставить за собой первый ход? (y/n): ')
    if go_first == 'y':
        print('\nНу что ж, даю тебе фору: играй крестиками.')   
        human = X
        computer = O
    else:
        print('\nТвоя удаль тебя погубит.. Буду начинать я.')   
        human = O
        computer = X
    return computer, human
 
#Функция new_board() создает новую игровую доску - список из девяти элементов,
#равных EMPTY, и возвращет её:
def new_board():
    '''Создает новую игровую доску.'''
    board = []
    for square in range(NUM_SQUARES):
        board.append(EMPTY)
    return board
 
#Функция display_board() выводит на экран переданную ей доску.
def display_board(board):
    '''Отображает игровую доску на экране.'''
    print('\n\t', board[7], '| ', board[8], '|', board[9])
    print('\t', '---------')         
    print('\n\t', board[4], '| ', board[5], '|', board[6])   
    print('\t', '---------') 
    print('\n\t', board[1], '| ', board[2], '|', board[3],'\n')  
 
#Функция legal_moves() принимает доску и возвращает список доступных ходов.
def legal_moves(board):
    '''Создает список доступных ходов.'''
    moves = []
    for square in range(NUM_SQUARES):
        if board[square] == EMPTY:
            moves.append(square)
    return moves
 
#Функция winner() принимает доску и возвращает победителя игры.
def winner(board):
    '''Определяет победителя игры.'''
    WAY_TO_WIN = ((7, 8, 9),
                  (4, 5, 6),
                  (1, 2, 3),
                  (7, 4, 1),
                  (8, 5, 2),
                  (9, 6, 3),
                  (7, 5, 3),
                  (9, 5, 1))
    for row in WAY_TO_WIN:
        if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner # Х или О если один из игроков побеждает
 
        if EMPTY not in board: #если все поля заняты но победы никто не достиг
            return TIE
    return None # если хотя бы одно из полей пусто, но победителя нет
 
'''Функция human_move() принимает доску и тип фишек игрока-человека, а возвращает номер поля
 на которое игрок хочет поместить свою фишку.'''
def human_move(board, human):
    '''Получает ход человека.'''
    legal = legal_moves(board)
    move = None
    while move not in legal:
            move = ask_number('Твой ход. Выбери одно из полей (1 - 9): ', 1, NUM_SQUARES) 
            if move not in legal:
                print('\nСмешной человек! Это поле уже занято. Выбери другое.\n')   
    print('Ладно...')
    return move 
 
'''Функция computer_move() принимает игровую доску и тип фишек человека, а 
возвращает ход компьютера'''
def computer_move(board, computer, human):
    '''Делает ход за компьютерного противника.'''
    #создадим рабочую копию доски, потому что функция 
    #будет менять некоторые значения в списке.
    board = board[:]    
 
    #поля от лучшего к худшему
    BEST_MOVES = (8, 6, 9, 1, 4, 5, 7, 3, 2) 
    print('Я выберу поле номер: ' , end = '')
 
    for move in legal_moves(board):
        board[move] = computer #computer
        #если следующим ходом может победить компьютер, выбериберем этот ход
        if winner(board) == computer: #computer
            print(move) 
            return move
        #выполним проверку, отменим внесенные изменения
        board[move] = EMPTY
 
    for move in legal_moves(board):
        board[move] = human
        #если следующим ходом может победить человек, блокируем этот ход
        if winner(board) == human:
            print(move) 
            return move
        #выполним проверку, отменим внесенные изменения
        board[move] = EMPTY
 
    #поскольку следующим ходом ни одна сторона не может победить.
    #выберем лучшее из доступных полей
    for move in BEST_MOVES:
        if move in legal_moves(board):
            print(move) 
            return move
 
#Функция next_turn() функция принимает тип фишки, которой был сделан на данный момент 
#последний ход, и возвращает тип фишки которой должен быть сделан следеющий ход.
#параметр turn, принимающий значение  Х или О, показывает , чей был последний ход - крестик или нолик.
 
def next_turn(turn):
    '''Осуществляет переход хода.'''
    if turn == X:
        return O
    else:
        return X #Эта функция используется для того, чередовать ходы по 
                    #мере того, как игроки будут их совершать. 
 
#Функция congrat_winner() принимает тип фишек победителя  игры, типы фишек 
#компьютерного противника и игрока человека.
def congrat_winner(the_winner, computer, human):
    '''Поздравляем победителя игры.'''
    if the_winner != TIE:
        print('Три', the_winner, 'в ряд!\n')    
    else:
        print('Ничья!\n')   
    if the_winner == computer:
        print('Как я и предсказывал, победа в очередной раз осталась за мной.\n'\
            'Вот ещё один довод в пользу того, что компьютеры превосходят людей решительно во всем.')   
    elif the_winner == human:
        print('О нет, этого не может быть! Неужели ты сумел как-то перехитрить меня, белковый\n'\
            'Клянусь: я, компьютер, не допущу этого больше никогда!')   
    elif the_winner == TIE:
        print('Тебе несказанно повезло, дружок: ты сумел свести игру вничью.\n\
            Радуйся же сегодняшнему успеху! Завтра тебе не суждено его повторить.') 
 
#Функция main() 
def main():
    display_insr()                                       # вывести инструкцию игрока на экран
    computer, human = pieces()                           # решить кому принадлежит первый ход
    turn = X
    board = new_board()                                  # создать пустую доску для игры  в "Крестики-нолики"
    display_board(board)                                 # отобразить эту доску
    while not winner(board):                             # до тех пор пока никто не выиграл или не состоялась ничья
        if turn == human:                                # если сейчас ход пользователя
            move = human_move(board, human)              # получить ход из пользовательского ввода
            board[move] = human                          # изменить вид доски
        else:                                            # иначе
            move = computer_move(board, computer, human) # рассчитать ход компьютера
            board[move] = computer 
        display_board(board)                              # изменить вид доски # вывести на экран обновленный вид доски
        turn = next_turn(turn)                            # осуществить переход хода
    the_winner = winner(board)  
    congrat_winner(the_winner, computer, human)           # поздравить победителя или объявить ничью
 
#запуск программы
main()
input('\n\nНажмите Enter, чтобы выйти.')
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.01.2019, 18:54
Ответы с готовыми решениями:

Кому скучно и нечего делать, у меня есть нерабочий код
проблема нетривиальная. Вообщем я вроде всё в коде подписал. привожу пример того как должен работать класс на словах: Мы взяли число 73,...

Если кому-то нечего делать по выходным в ближайшие полтора года
Просто делюсь интересной ссылкой) http://www.cppgm.org/

Как создать логическую игру “Крестики-нолики” на консоли функцию winner не могу до делать c++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;iomanip&gt; using namespace std; int polya; class o; class x { ...

1
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
02.01.2019, 17:00
move в 205 строке ничего не содержит. Индекс не может быть None.
В ф-и computer_move return'ы в for'ах стоят, а они у тебя всегда выполняются?
Если не всегда то, т.к. ф-я ничего не возвращает, она по умолчанию будет возвращать None.
Вот тебе и первое место где возможно кроется ошибка. Попробуй в конце ф-и вернуть какое-нибудь значение (например return 666) и после 204 строки выведи (print(move)) и посмотри, что выводит. И это может говорит только о том, что legal_moves возможно возвращает пустой список, или список в котором не содержится ни одного элемента, который ты ищешь в том списке. Если так, то нужно придумать как обрабатывать, какое-значение возвращать...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.01.2019, 17:00
Помогаю со студенческими работами здесь

Как создать логическую игру “Крестики-нолики” на неограниченном поле 5на5. не могу до конца до делать
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;iomanip&gt; using namespace std; char polya; class o; class x { ...

Крестики-нолики: исправить код
Процедура getcoordinates работает неправильно. Только для клеток 3,6,7,8,9 program crozz; uses graphabc; procedure...

Программа крестики-нолики, исправить код
Написать программу крестики-нолики. Создана программа, но может чего-то пропустил. Не правильно работает программа. Версия у меня 2003...

Крестики-нолики - найти ошибку
Крестики - нолики. Поле 3х3. Играют два игрока. Первый крестиками,второй ноликами.Ходы задаются цифрами так как показано ниже: 7 8 9 4...

Программа крестики нолики, исправить ошибки в коде
Уже неделю пишу программу для игры крестики нолики и понял, что всё очень печально. Был бы очень признателен за помощь. Есть проблема,с...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru