Taylor Hill
Taylor Hill

Reputation: 1124

Loop not iterating fully

I'm creating a simple RPG as a learning experience. In my code I have an array of tiles that are displaying on a 25x25 grid just fine, and a separate array that contains the True/False values pertaining to whether the tile is solid. The latter is not working; in my code below I have put a print statement exactly where it is not reaching, and i'm not quite sure what the problem is.

Also, the data for the level is simply a text file with a grid of 25x25 characters representing blocks.

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)

Where exactly is the problem? I feel as though it is a quick fix but I'm simply not seeing it. Thanks!

Upvotes: 1

Views: 91

Answers (3)

Evan
Evan

Reputation: 528

I think you just need to reopen the file. If I recall, python will just keep going from where you left off. If there is nothing left, it can't read anything. You can either re-open it, or use the fyle.seek(0) to go to the first character in the first line.

Upvotes: 0

Simon
Simon

Reputation: 10841

The loop:

for lyne in fyle:

... reads all of fyle and leaves nothing to be read by the loop:

for rows in fyle:

Upvotes: 1

Blender
Blender

Reputation: 298502

You read through the file once with your first for loop, so there isn't anything left to read for the second loop. Seek back to the beginning of the file before starting the second loop:

fyle.seek(0)

Although I'd just cache the lines as a list, if possible:

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

Also, you can replace this:

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

With:

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

Upvotes: 5

Related Questions