Python - NameError: name '' is not defined

Max

I am currently expanding by python skills by programming a procedurally generated dungeon level in text format. I am confused as to why my "intersects" define is not working. Here is the class containing the def:

class Room:

    global x1
    global x2
    global y1
    global y2

    global w
    global h

    global centre

    def __init__(self,x,y,w,h):
        x1 = x
        x2 = x + w
        y1 = y
        y2 = y + h
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        centre = math.floor((x1 + x2) / 2),math.floor((y1 + y2) / 2)

    #function that checks if the rooms intersect by comparing corner pins relative to the x,y tile map 
    def intersects(self,room):
        if x1 <= room.x2 and x2 >= room.x1 and y1 <= room.y2 and room.y2 >=  room.y1:
            return True
        return False

Here is where it's called:

def placeRooms(r):
    rooms = []
    #Where the room data is stored

    for r in range(0,r):
        w = minRoomSize + randint(minRoomSize,maxRoomSize)
        h = minRoomSize + randint(minRoomSize,maxRoomSize)
        x = randint(1,map_width - w - 1) + 1
        y = randint(1,map_height - h - 1) + 1

        newRoom = Room(x,y,w,h)

        failed = False

        #for every room generated, this function checks if new room intersects with the last one
        for otherRoom in rooms:
            if newRoom.intersects(otherRoom):
                failed = True
                break

        if failed == False:
            createRoom(newRoom)

            rooms.append(newRoom)

Full traceback:

Traceback (most recent call last):
File "C:\Users\Max\Desktop\LiClipse Workspace\testing\RandomDungeon.py",      line 78, in <module>
placeRooms(2)
File "C:\Users\Max\Desktop\LiClipse Workspace\testing\RandomDungeon.py",  line  65, in placeRooms
if newRoom.intersects(otherRoom):
File "C:\Users\Max\Desktop\LiClipse Workspace\testing\RandomDungeon.py",   line 41, in intersects
if x1 <= room.x2 and x2 >= room.x1 and y1 <= room.y2 and room.y2 >= room.y1:
NameError: name 'x1' is not defined

I hope someone can help me understand why this code won't work, thank you.

I have managed to fix the problem. I'm sorry if my question was not defined very well. I have only been learning Python for around 4 weeks and i am used to Java which has a very different syntax. Here is my solution:

def __init__(self,x,y,w,h):
    self.x1 = x
    self.x2 = x + w
    self.y1 = y
    self.y2 = y + h
    self.x = x
    self.y = y
    self.w = w
    self.h = h
Zanapher

As most previous comments have said, you use global variables that shouldn't be global at all.

The way I understand your code, you meant for x1, x2, y1 and y2 to be attributes of your Room instance, meaning that each room has its own values for x1, x2, y1 and y2. In Python you don't have to declare attributes at the beginning of the class (where you declare all the global variables), you simply need to initialize the attributes in the __init__ method.

This means that you can safely delete all the global lines, and change your __init__ to

def __init__(self,x,y,w,h):
    self.x1 = x
    self.x2 = x + w
    self.y1 = y
    self.y2 = y + h
    self.w = w
    self.h = h
    centre = (self.x1 + self.x2) // 2,(self.y1 + self.y2) // 2

(note that you don't need math.floor since you're already dealing with integers, simply use the integer division operator //)

That way you define x1, y1, x2, y2, w, h and center as attributes of your class meaning that each instance has its own values for these variables. In Python, you need to add self. before all calls to attributes of the object itself, so you should also modify intersects to add self. before each access to an attribute of your current object (all the x1, x2, etc. that are not already prefixed by room. in your code).

Also, while we're at it I don't think your intersect function works as intended, but that's another problem :)

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related