1 / 1 / 0
Регистрация: 18.08.2017
Сообщений: 44
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Пытаюсь создать змейку на 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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 ==...

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

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

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

6
Эксперт Python
691 / 474 / 204
Регистрация: 22.03.2020
Сообщений: 1,052
11.04.2020, 22:36 2
Пока не успел толком просмотреть. Но заметил кое-что очень важное.
Имя 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  [ТС] 3
Цитата Сообщение от unfindable_404 Посмотреть сообщение
44 строка:
Строка, которую вы указали: 48, и на ней написано:
Python
1
hvost[o] = [hvost[o - 1]]
0
Эксперт Python
691 / 474 / 204
Регистрация: 22.03.2020
Сообщений: 1,052
11.04.2020, 23:45 4
Лучший ответ Сообщение было отмечено 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  [ТС] 5
Цитата Сообщение от 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 6
Неплохо, лучше чем предыдущая версия. Попробуйте добавить смерть от укуса за хвост
0
1 / 1 / 0
Регистрация: 18.08.2017
Сообщений: 44
12.04.2020, 00:22  [ТС] 7
Цитата Сообщение от DmitryOST Посмотреть сообщение
Неплохо, лучше чем предыдущая версия. Попробуйте добавить смерть от укуса за хвост
Это, естественно, не последняя версия, я буду дорабатывать и дорабатывать.
0
12.04.2020, 00:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2020, 00:22
Помогаю со студенческими работами здесь

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

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

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

list index out of range ошибка
Задача:Даны действительные числа а1 . . . , а 50. Получить «сглаженные» значения а1 . . . , а50,...

Проблема с кодом на 1 пк работает на другом вылетает IndexError: list index out of range
вот этот код def Car_list(): cars={} car=input().split() cars=car cars=car ...

Ошибка: IndexError: list index out of range
file = open('info.txt', mode='r', encoding='utf-8') peoples = nums = for row in...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru