Выдает ошибку хотя все вроде написано правильно помагите
from utils import randbool
from utils import randcell
from utils import randcell2
from helicopter import Helicopter
CELL_TYPES = "??????"
#
class Map:
def print_map(self, helico): #Для чего функция? Для обводки поля
print('⬜️' * (self.w + 2))
for ri in range(self.h):
print('⬜️', end="")
for ci in range(self.w):
cell = self.cells[ri][ci]
if(helico.x == ri and helico.y == ci):
print('8_2', end='')
if(cell >= 0 and cell < len(CELL_TYPES)):
print(CELL_TYPES[cell], end="")
print( '⬜️')
print('⬜️' * (self.w + 2))
def check_bounds(self, x, y):
if(x < 0 or y < 0 or x >= self.h or y >= self.w):
return False
return True
def generate_river(self, l): # генератор расположения рек l - длина реки
rc = randcell(self.w, self.h)
rx, ry = rc[0], rc[1]
self.cells[rx][ry] = 2
while l > 0:
rc2 = randcell2(rx, ry)
rx2, ry2 = rc2[0], rc2[1]
if self.check_bounds(rx, ry) and self.check_bounds(rx2, ry2):
self.cells[rx2][ry2] = 2
rx, ry = rx2, ry2
l -= 1
def generate_forest(self, r, mxr): # ставим деревья с долей вероятности
for ri in range(self.h):
for ci in range(self.w):
if randbool(r, mxr):
self.cells[ri][ci] = 1
def generate_tree(self):
c = randcell(self.w, self.h)
cx, cy = c[0], c[1]
if(self.check_bounds(cx, cy) and self.cells[cx][cy == 0]):
self.cells[cx][cy] = 1
def add_fire(self):
c = randcell(self.w, self.h)
cx, cy = c[0],c [1]
if self.cells[cx][cy] == 1:
self.cells[cx][cy] = 5
def update_fires(self):
for ri in range (self.h):
for ci in range(self.w):
cell = self.cells[ri][ci]
if cell == 5:
self.cells[ri][ci] = 0
for i in range(10):
self.add_fire
def __init__(self, w, h):
self.w = w
self.h = h
self.cells = [[0 for i in range(w)] for j in range (h)]
tmp = Map(30, 10)
tmp.generate_forest(3, 10)
tmp.generate_river(5)
tmp.generate_river(11)
tmp.generate_river(11)
tmp.print_map()
Traceback (most recent call last):
File "c:\Users\semon\launch.json\map.py", line 76, in <module>
tmp.generate_river(11)
File "c:\Users\semon\launch.json\map.py", line 31, in generate_river
self.cells[rx][ry] = 2
~~~~~~~~~~^^^^
IndexError: list index out of range
выдает такую ошибку что делать?
Ответы (1 шт):
Автор решения: Xander
→ Ссылка
Смотрите, вы генерите поле так:
self.cells = [[0 for i in range(w)] for j in range (h)]
Соответственно, поле у вас представлено как список горизонтальных строк (а не вертикальных колонок!). Получается, что к ячейке поля нужно обращаться так:
self.cells[координата_по_вертикали][координата_по_горизонтали]
а вы в строке 31 к ячейке обрааетесь так:
self.cells[rx][ry] = 2
То есть делаете наоборот - сначала указываете координату по горизонтали, а потом по вертикали. Логично, что при этом для части ячеек вы вылетаете за границы поля, т.к. ширина у вас - от 0 до 29, а высота может быть максимум 9.
Вам нужно переписать 31 строчку, поменяв местами координаты:
self.cells[ry][rx] = 2
# ^^ ^^ вот так вот
В других местах у вас тоже есть такая путаница, там тоже нужно поменять.