Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8359733
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 9, 20262026-06-09T11:14:33+00:00 2026-06-09T11:14:33+00:00

I need to have a 2 radius map drawn off the player’s current room

  • 0

I need to have a 2 radius map drawn off the player’s current room in a MUD I’m building in python (or more, if possible). Rooms are set up as containers with a self.exits = {'west':1, 'north':2} where the key is the direction that the value (UID of the adjacent room) is located. Rooms are linked only in this way. A player with a self.location of 0 could type ‘n’ and their location, based on the above variable, would then be 2 and that room’s contents would have the player’s UID appended to its contents.

So, I would like to have a map displayed that looks like the following, based on the above variable, where ‘u’ is the player’s current location..

    [ ]
     |
[ ]-[u]

I’ve achieved this portion, as this is just a radius of 1. Here is a small (heavily modified for posting here) snippet of how I did this, and you’ll see why I’m posting, as it’s poor code.

mloc = '[u]'
mn = '   '
mw = '   '
spn= ' '
spw= ' '
for Exit in room.exits.keys():
  if Exit == 'north':
    mn = '[ ]'
    spn = '|'
  if Exit == 'west': 
    mw = '[ ]-'
# player.hear() is our function for printing a line to the player's screen
player.hear('    '+mn)
player.hear('     '+sp)
player.hear(mw+mloc)

In my insanity, I managed to make this work with all 8 different directions (diagonals, and not including up or down). But I then have to for loop the rooms I just parsed with my first for loop, and then draw those, and then space it all out, and then take into account the overlap of the (sp)aces such as ‘\’ or ‘|’ if there are paths that cross each other. This small task turned nightmarish immediately, and well into 200 lines before I was done.

Another hurdle is that I can only print line by line. So if the map is 50 characters high, I have to have player.hear() on 50 lines, which I’m not opposed to. Just keep that in mind before posting an answer.

I’m also not picky about formatting. I just simply want a ‘map at a glance’ to aid players while traveling around the world.

Thanks guys. I hope I provided enough info. Let me know, if not.
(Here is a link to the entire (unfinished and HORRIBLE) module I’m referencing. Map.py

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-09T11:14:37+00:00Added an answer on June 9, 2026 at 11:14 am

    This code is in serious trouble. Let’s start designing from scratch. This will hopefully serve as a good lesson in how to design and build classes and data structures.

    To start with, you should organize your code around a Map class, which then represents your rooms as a grid. You shouldn’t think about “room 1”, “room 2”, etc (which is very hard to keep track of on a map), and rather think of rooms in terms of coordinates.

    Now, there are a few possible features we are ignoring at the beginning, including the player seeing only rooms he’s been to, the player remaining at the center of the map, and diagonal paths. If you want them you can put them in later, once the basic functionality works. For now, we are aiming for something that looks a little like this:

    [ ]-[u] [ ] [ ]
     |
    [ ]-[ ]-[ ] [ ]
         |
    [ ]-[ ]-[ ] [ ]
     |
    [ ]-[ ]-[ ]-[ ]
    

    That is, we’re representing it as a grid where some rooms are connected and others are not. Let’s have each room have a coordinate pair, a little like this:

          0   1   2   3
       0 [ ]-[u] [ ] [ ]
          |
       1 [ ]-[ ]-[ ] [ ]
              |
       2 [ ]-[ ]-[ ] [ ]
          |
       3 [ ]-[ ]-[ ]-[ ]
    

    Let x be along the top and y be along the side. The top left is (0, 0), the one with [u] in it is (0, 1).

    Now, what are the components of our Map class?

    1. map height: integer

    2. map width: integer)

    3. player_x, player_y: coordinates of player

    4. possible paths: a list of pairs of rooms that we can move between. The above map would be represented as:

      [((0, 0), (1, 0)), ((0, 0), (1, 0)), ((1, 0), (1, 1)), ((1, 1), (2, 1)),
       ((1, 0), (1, 2)), ((0, 2), (1, 2)), ((1, 2), (2, 2)), ((0, 2), (0, 3)),
       ((0, 3), (1, 3)), ((1, 3), (2, 3)), ((2, 3), (3, 3))]
      

    Notice that I ordered each pair such that the larger tuple goes first (that’s important later).

    So now that we have our design, let’s write that Map class!

    I can think of four methods we want: print_map, move, and an initializer. Intitialization is simple: just set the four attributes we listed above:

    class Map:
        def __init__(self, height, width, player_x, player_y, paths):
            self.height = height
            self.width = width
            self.x = player_x
            self.y = player_y
            self.paths = paths
    

    Now, move is quite simple. Given a direction n/e/s/w:

        def move(self, direction):
            if direction == "n":
                if ((self.x, self.y - 1), (self.x, self.y)) not in self.paths:
                    print "Cannot go north"
                else:
                    self.y -= 1
    

    The move function for “north” just checks if there is a path to the room above the one we are in.

    Now for the most interesting part: printing the map. You do this by looping over the rows (0 to self.height) and over the columns (0 to self.width). (Note: you can’t use print in this situation since it automatically puts a newline or space after the string. Instead we use sys.stdout.write.

    def print_map(self):
        for y in range(0, self.height):
            # print the yth row of rooms
            for x in range(0, self.width):
                if self.x == x and self.y == y:
                    sys.stdout.write("[u]")  # this is the player's room
                else:
                    sys.stdout.write("[ ]")  # empty room
                # now see whether there's a path to the next room
                if ((x, y), (x + 1, y)) in self.paths:
                    sys.stdout.write("-")
                else:
                    sys.stdout.write(" ")
            # now that we've written the rooms, draw paths to next row
            print  # newline
            for x in range(0, self.width):
                sys.stdout.write(" ")  # spaces for above room
                if ((x, y), (x, y + 1)) in self.paths:
                    sys.stdout.write("|  ")
                else:
                    sys.stdout.write("   ")
            print
    

    Now, let’s put it all together and try it out. Here’s the code:

    import sys
    
    class Map:
        def __init__(self, height, width, player_x, player_y, paths):
            self.height = height
            self.width = width
            self.x = player_x
            self.y = player_y
            self.paths = paths
    
        def move(self, direction):
            if direction == "n":
                if ((self.x, self.y - 1), (self.x, self.y)) not in self.paths:
                    print "Cannot go north"
                else:
                    self.y -= 1
            if direction == "s":
                if ((self.x, self.y), (self.x, self.y + 1)) not in self.paths:
                    print "Cannot go south"
                else:
                    self.y += 1
            if direction == "e":
                if ((self.x, self.y), (self.x + 1, self.y)) not in self.paths:
                    print "Cannot go east"
                else:
                    self.x += 1
            if direction == "w":
                if ((self.x - 1, self.y), (self.x, self.y)) not in self.paths:
                    print "Cannot go west"
                else:
                    self.x -= 1
    
        def print_map(self):
            for y in range(0, self.height):
                # print the yth row of rooms
                for x in range(0, self.width):
                    if self.x == x and self.y == y:
                        sys.stdout.write("[u]")  # this is the player's room
                    else:
                        sys.stdout.write("[ ]")  # empty room
                    # now see whether there's a path to the next room
                    if ((x, y), (x + 1, y)) in self.paths:
                        sys.stdout.write("-")
                    else:
                        sys.stdout.write(" ")
                # now that we've written the rooms, draw paths to next row
                print  # newline
                for x in range(0, self.width):
                    sys.stdout.write(" ")  # spaces for above room
                    if ((x, y), (x, y + 1)) in self.paths:
                        sys.stdout.write("|  ")
                    else:
                        sys.stdout.write("   ")
                print
    
    
    paths = [((0, 0), (1, 0)), ((0, 0), (1, 0)), ((1, 0), (1, 1)), ((1, 1),
             (2, 1)), ((1, 1), (1, 2)), ((0, 2), (1, 2)), ((1, 2), (2, 2)),
             ((0, 2), (0, 3)), ((0, 3), (1, 3)), ((1, 3), (2, 3)), ((2, 3),
             (3, 3))]
    m = Map(4, 4, 0, 0, paths)
    
    while True:
        m.print_map()
        direction = raw_input("What direction do you want to move? [n/e/s/w] ")
        m.move(direction)
    

    Notice that I added a section on the bottom that creates a map and allows the player to move around it. Here’s how it looks when it runs:

    Davids-MacBook-Air:test dgrtwo$ python Map.py 
    [u]-[ ] [ ] [ ] 
         |          
    [ ] [ ]-[ ] [ ] 
         |          
    [ ]-[ ]-[ ] [ ] 
     |              
    [ ]-[ ]-[ ]-[ ] 
    
    What direction do you want to move? [n/e/s/w] e
    [ ]-[u] [ ] [ ] 
         |          
    [ ] [ ]-[ ] [ ] 
         |          
    [ ]-[ ]-[ ] [ ] 
     |              
    [ ]-[ ]-[ ]-[ ] 
    
    What direction do you want to move? [n/e/s/w] s
    [ ]-[ ] [ ] [ ] 
         |          
    [ ] [u]-[ ] [ ] 
         |          
    [ ]-[ ]-[ ] [ ] 
     |              
    [ ]-[ ]-[ ]-[ ] 
    
    What direction do you want to move? [n/e/s/w] w
    Cannot go west
    [ ]-[ ] [ ] [ ] 
         |          
    [ ] [u]-[ ] [ ] 
         |          
    [ ]-[ ]-[ ] [ ] 
     |              
    [ ]-[ ]-[ ]-[ ] 
    
    What direction do you want to move? [n/e/s/w] e
    [ ]-[ ] [ ] [ ] 
         |          
    [ ] [ ]-[u] [ ] 
         |          
    [ ]-[ ]-[ ] [ ] 
     |              
    [ ]-[ ]-[ ]-[ ] 
    

    There are many improvements that can be made to this code (in particular, the move method is repetitive), but it’s a good start. Try making the map 20×20 and you’ll see it expands just fine.

    ETA: I should note that print_map could be rewritten in a much shorter form as something like:

    def print_map(self):
        for y in range(0, self.height):
            print "".join(["[%s]%s" %
                        ("u" if self.x == x and self.y == y else " ",
                         "-" if ((x, y), (x + 1, y)) in self.paths else " ")
                            for x in range(0, self.width)])
            print " " + "   ".join(["|" if ((x, y), (x, y + 1)) in self.paths
                                  else " " for x in range(0, self.width)])
    

    But this is a bit more intense.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a map view that draws radius overlay from current location. But for
I have a very uniform set of data from Radius messages that I need
I have a website and i need to implement border radius for text box
I have a MKMapView. I need to add a circle as a radius around
Possible Duplicate: How to put this code in v3 instead v2 map I have
i have a polygon with some radius. Something like this . Now i need
I need to have two columns inside a <div> : CURRENT HTML <div id=corpo>
I need to implement 2D collision detection by arc. I have player(black dot) and
I have need to produce LINE, BAR, and PIE charts in Rails. I have
I have need to return multiple results from a subquery and have been unable

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.