Выдает ошибку хотя все вроде написано правильно помагите

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
         # ^^  ^^ вот так вот

В других местах у вас тоже есть такая путаница, там тоже нужно поменять.

→ Ссылка