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

Проблема с игрой "Змейка". Ошибка: list index out of range

11.04.2020, 19:39. Показов 1539. Ответов 6

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Пытаюсь создать змейку на python с выводом в консоль. Вот код:
Кликните здесь для просмотра всего текста
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
import time
import os
import keyboard
import random
 
#Изначальное напрваление
s_move = 'r'
 
#Поворот
def sUp():
        global s_move
        s_move = 'u'
def sDown():
        global s_move
        s_move = 'd'
def sRight():
        global s_move
        s_move = 'r'
def sLeft():
        global s_move
        s_move = 'l'
 
#Нажатия
keyboard.add_hotkey('up', sUp)
keyboard.add_hotkey('down', sDown)
keyboard.add_hotkey('right', sRight)
keyboard.add_hotkey('left', sLeft)
 
 
#Позиция змеи
food = [random.randint(0, 9), random.randint(0, 9)]
s_pos = [0, 0]
map = []
hvost = []
score = 1
 
 
while True:
    #Отчистка консоли
    os.system('cls')
    
    #Добавление хвоста если добавилось очко
    if len(hvost) + 1 < score:
        hvost.append([s_pos[0], s_pos[1]])
 
    #Перезаписываение хвостов
    for o in range(1, len(hvost)):
        hvost[o] = [hvost[o - 1]]
    
    #Первый хвост, тдущий за змеёй
    if len(hvost) > 0:
        hvost[0] = [s_pos[0], s_pos[1]]
 
 
 
    print("Массив хвостов:", hvost)
 
    #Изменение напрваления
    if s_move == 'u':
        s_pos[1] -= 1
    elif s_move == 'd':
        s_pos[1] += 1
    elif s_move == 'r':
        s_pos[0] += 1
    elif s_move == 'l':
        s_pos[0] -= 1
 
    #Проверка на выход за пределы
    if s_pos[0] < 0 or s_pos[1] < 0 or s_pos[0] > 9 or s_pos[1] > 9:
        # Проигрыш
        quit()
 
    #Карта  
    map = [
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|']
    ]
 
        
 
    #Позиция еды
    if s_pos == food:
        score += 1
        food = [random.randint(0, 9), random.randint(0, 9)]
 
    
    
    #Вывод хвоста
    if len(hvost) > 0:
        map[hvost[0][1]][hvost[0][0]] = 'X'
    if len(hvost) == 2:
        print(hvost[1])
        map[hvost[1][1]][hvost[1][0]] = 'X'
    #Здесь возникает ошибка, хотя hvost[1] существует, это показывает print(hvost[1])
    '''
    map[hvost[1][1]][hvost[1][0]] = 'X'
IndexError: list index out of range
    '''
 
 
    print("Очки", score)
    print("Направление:", s_move)
    
              
            
 
 
    #Вывод еды, поз. игрока и карты
    map[s_pos[1]][s_pos[0]] = 'X'
 
    map[food[1]][food[0]] = 'O'
    
 
 
    for n in range(len(map)):
            for word in range(len(map[n])):
                    print(map[n][word],end=' ')
            print('')
 
 
    time.sleep(0.5)


Я все максимально подписал и на месте ошибки написал об этом. Запускайте змейку через консоль. Чтобы увидеть ошибку, запустите через компилятор. Буду рад помощи!

Добавлено через 8 минут
В hvost массиве хранятся координаты "хвостов" змеи. Каждый раз первому хвосту присваивается координата змеи, а остальным координаты предыдущих. Выдает ошибку:
Traceback (most recent call last):
File "C:\Users\Gin\Desktop\Python\snaketetst. py", line 100, in <module>
map[hvost[1][1]][hvost[1][0]] = 'X'
IndexError: list index out of range
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2020, 19:39
Ответы с готовыми решениями:

Проблема с list index out of range
На вход дается html-страница, там в теге и классе есть ФИО, надо распарсить . С этим проблем не возникло, только с циклом беда. При...

Проблема в решении 2 задачи проекте Euler. list index out of range
array = for i in range(0,4000000): if i==1 | i==2: array.append(i) if i % 2 == 0: array.append(array +...

Ошибка list index out of range
Есть код для предсказания вторичной структуры РНК, но он выдает ошибку IndexError: list index out of range в строке: ...

6
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
11.04.2020, 22:36
Пока не успел толком просмотреть. Но заметил кое-что очень важное.
Имя map - это имя встроенной функции. Вы её перезаписали. Не надо так. Переименуйте свой список.

Добавлено через 42 минуты
44 строка:
Python
1
        hvost[o] = [hvost[o - 1]]
Замените на:
Python
1
        hvost[o] = hvost[o - 1]
Помимо этого у вас есть кое-какие баги, но это уже совсем другая история.
1
1 / 1 / 0
Регистрация: 18.08.2017
Сообщений: 44
11.04.2020, 23:06  [ТС]
Цитата Сообщение от unfindable_404 Посмотреть сообщение
44 строка:
Строка, которую вы указали: 48, и на ней написано:
Python
1
hvost[o] = [hvost[o - 1]]
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
11.04.2020, 23:45
Лучший ответ Сообщение было отмечено Maxet24 как решение

Решение

Цитата Сообщение от Maxet24 Посмотреть сообщение
Строка, которую вы указали: 48
Ой, да 48. Замените её на:
Python
1
        hvost[o] = hvost[o - 1]
Квадратные скобочки не нужны. Из-за них появляется ещё одна вложенность списка
Вместо:
Python
1
[[1, 2], [1, 3]]
Образуется список:
Python
1
[[1, 2], [[1, 3]]]
И из-за этого появляется ошибка.
1
1 / 1 / 0
Регистрация: 18.08.2017
Сообщений: 44
12.04.2020, 00:03  [ТС]
Цитата Сообщение от unfindable_404 Посмотреть сообщение
Квадратные скобочки не нужны. Из-за них появляется ещё одна вложенность списка
Вместо:
Спасибо вам огромное!!! Заработало!! Я немного доработал и вот что сейчас:
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
import time
import os
import keyboard
import random
 
#Изначальное напрваление
s_move = 'r'
 
#Поворот
def sUp():
        global s_move
        s_move = 'u'
def sDown():
        global s_move
        s_move = 'd'
def sRight():
        global s_move
        s_move = 'r'
def sLeft():
        global s_move
        s_move = 'l'
 
#Нажатия
keyboard.add_hotkey('up', sUp)
keyboard.add_hotkey('down', sDown)
keyboard.add_hotkey('right', sRight)
keyboard.add_hotkey('left', sLeft)
 
 
#Позиция змеи
food = [random.randint(0, 9), random.randint(0, 9)]
s_pos = [0, 0]
smap = []
hvost = []
score = 1
 
 
while True:
    #Отчистка консоли
    os.system('cls')
    
    #Добавление хвоста если добавилось очко
    if len(hvost) + 1 < score:
        hvost.append([s_pos[0], s_pos[1]])
 
    #Перезаписываение хвостов
    for o in range(len(hvost) - 1, 0, -1):
        hvost[o] = hvost[o - 1]
    
    #Первый хвост, тдущий за змеёй
    if len(hvost) > 0:
        hvost[0] = [s_pos[0], s_pos[1]]
 
 
 
    print("Массив хвостов:", hvost)
 
    #Изменение напрваления
    if s_move == 'u':
        s_pos[1] -= 1
    elif s_move == 'd':
        s_pos[1] += 1
    elif s_move == 'r':
        s_pos[0] += 1
    elif s_move == 'l':
        s_pos[0] -= 1
 
    #Проверка на выход за пределы
    if s_pos[0] < 0 or s_pos[1] < 0 or s_pos[0] > 9 or s_pos[1] > 9:
        # Проигрыш
        quit()
 
    #Карта  
    smap = [
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|'],
    ['|','|','|','|','|','|','|','|','|','|']
    ]
 
        
 
    #Позиция еды
    if s_pos == food:
        score += 1
        food = [random.randint(0, 9), random.randint(0, 9)]
 
    
    
    #Вывод хвоста
    if len(hvost) > 0:
        smap[hvost[0][1]][hvost[0][0]] = 'X'
    for h in range(1, len(hvost)):
        smap[hvost[h][1]][hvost[h][0]] = 'X'
    #Здесь возникает ошибка, хотя hvost[1] существует, это показывает print(hvost[1])
    '''
    map[hvost[1][1]][hvost[1][0]] = 'X'
IndexError: list index out of range
    '''
 
 
    print("Очки", score)
    print("Направление:", s_move)
    
              
            
 
 
    #Вывод еды, поз. игрока и карты
    smap[s_pos[1]][s_pos[0]] = 'X'
 
    smap[food[1]][food[0]] = 'O'
    
 
 
    for n in range(len(smap)):
            for word in range(len(smap[n])):
                    print(smap[n][word],end=' ')
            print('')
 
 
    time.sleep(0.3)
Можете сыграть, если хотите))
1
8 / 6 / 2
Регистрация: 09.04.2020
Сообщений: 31
12.04.2020, 00:17
Неплохо, лучше чем предыдущая версия. Попробуйте добавить смерть от укуса за хвост
0
1 / 1 / 0
Регистрация: 18.08.2017
Сообщений: 44
12.04.2020, 00:22  [ТС]
Цитата Сообщение от DmitryOST Посмотреть сообщение
Неплохо, лучше чем предыдущая версия. Попробуйте добавить смерть от укуса за хвост
Это, естественно, не последняя версия, я буду дорабатывать и дорабатывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.04.2020, 00:22
Помогаю со студенческими работами здесь

Ошибка list index out of range
word, s, k, a, save = input(), , 0, , for t in range(len(word)): s.append(word) save = s for i in range(int(input())): ...

Ошибка list index out of range
Дано натуральное трехзначное число. Если все цифры в нем одинаковы, то оставить заданное число без изменения; если все цифры в нем разные,...

Ошибка list index out of range
Версия питона: 3.10 Я не могу разобраться как исправить ошибку list index out of range. Я делаю игру пин понк и вот строчки...

Ошибка 'List index out of range'
Добрый день! Возникла проблема - выскакивает ошибка 'List index out of range'. Я не понимаю, в чем ошибка. a = list(map(str,...

Ошибка list index out of range
Есть функция: def TablSopr(X1min,X1max,X2min,X2max,m1,m2): &quot;&quot;&quot;Расчет по номин.факторам таблицы сопряженности&quot;&quot;&quot; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru