2013-04-04 3 views
1

Я создаю простую РПГ как опыт обучения. В моем коде у меня есть массив плиток, которые отображаются на сетке 25x25, только отлично, и отдельный массив, содержащий значения True/False, относящиеся к тому, является ли плитка сплошной. Последний не работает; в моем коде ниже я поставил оператор печати точно там, где он не достиг, и я не совсем уверен, в чем проблема.Петля не полностью повторяется

Кроме того, данные для уровня - это просто текстовый файл с сеткой из 25x25 символов, представляющих блоки.

def loadLevel(self, level): 
    fyle = open("levels/" + level,'r') 
    count = 0 
    for lyne in fyle: 
     if lyne.startswith("|"): 
      dirs = lyne.split('|') 
      self.north = dirs[1] 
      self.south = dirs[2] 
      self.east = dirs[3] 
      self.west = dirs[4] 
      continue 

     for t in range(25): 
      tempTile = Tiles.Tile() 
      tempTile.value = lyne[t] 
      tempTile.x = t 
      tempTile.y = count 
      self.levelData.append(tempTile) 
     count += 1 

    rowcount = 0 
    colcount = 0 

    for rows in fyle: 
     print('Doesnt get here!') 
     for col in rows: 
      if col == 2: 
       self.collisionLayer[rowcount][colcount] = False 
      else: 
       self.collisionLayer[rowcount][colcount] = True 
      colcount += 1 
      print(self.collisionLayer[rowcount[colcount]]) 
     if rows == 2: 
      self.collisionLayer[rowcount][colcount] = False 
     else: 
      self.collisionLayer[rowcount][colcount] = True 
     rowcount += 1 

    print(self.collisionLayer) 

Где именно проблема? Я чувствую, что это быстрое решение, но я просто не вижу его. Благодаря!

ответ

5

Вы просматриваете файл один раз с помощью своего первого цикла for, так что во втором цикле читать нечего. Ищи назад к началу файла перед началом второго цикла:

fyle.seek(0) 

Хотя я только кэшировать строки в виде списка, если это возможно:

with open('filename.txt', 'r') as handle: 
    lines = list(handle) 

Кроме того, вы можете заменить это:

if rows == 2: 
    self.collisionLayer[rowcount][colcount] = False 
else: 
    self.collisionLayer[rowcount][colcount] = True 

С:

self.collisionLayer[rowcount][colcount] = rows != 2 
+0

Ах! Я не знал, как это сработало. Благодаря! –

1

Петля:

for lyne in fyle: 

... читает все fyle и не оставляет ничего для чтения цикла:

for rows in fyle: 
0

Я думаю, вам просто нужно открыть файл. Если я помню, python будет просто продолжать движение с того места, где вы остановились. Если ничего не осталось, он ничего не может прочитать. Вы можете либо повторно открыть его, либо использовать fyle.seek (0), чтобы перейти к первому символу в первой строке.

Смежные вопросы