Help (I can't think of a better title)
Alex Hall
mehgcap at gmail.com
Sat May 22 20:53:30 EDT 2010
On 5/22/10, MRAB <python at mrabarnett.plus.com> wrote:
> Lanny wrote:
>> The answer may be right infront of me but I really can't figure this
>> out.
>> I'm trying to build a interactive fiction kind of game, silly I know
>> but I
>> am a fan of the genre. I'm trying to build up an index of all the
>> rooms in
>> the game from an outside file called roomlist.txt. The only problem is
>> that
>> every room ends up having four exits. Here's the code.
>>
>>
>> class room() :
>> room_id = 'room_id'
>> name = 'room'
>> description = 'description'
>> item_list =
>> exits = {}
> > visits = 0
>
> These attributes are being defined as belonging to the class, so they
> will be shared by all the instances of the class. This isn't a problem
> for immutable items such as strings, but is for mutable items such as
> dicts. In short, all the rooms share the same 'exits' dict.
>
> You should really define the instance attributes (variables) in the
> '__init__' method.
I just ran into something similar to this in my Battleship game. I had
a Craft class, which defined attributes for any craft (a recon plane,
a submarine, a battleship, and so on). One such attribute was a
weapons list, much like your exits dictionary; I would assign a couple
weapons to a battleship, but suddenly all my ships and airplanes had
those same weapons. What the great people on this list said to do was
something like this:
class Room():
def __init__(self, exits):
if exits==None:
self.exits={}
else:
self.exits=exits
In this way, you can create a new Room object with exits,
r=Room(exits_dict)
or you can create a Room with no exits, and add them later:
r2=Room()
r2.exits["exit1"]="doorway"
but the code in the __init__ method, which will get called as soon as
you create a new Room object, ensures that passing an exits dictionary
will set that instance's exits to what was passed in, while passing
nothing will create a room with an empty dictionary (the if
statement). I hope this made some sense!
>
>> def leave(self, direction)
>> global roomlist
>> global player_current_room
>> if direction not in player_current_room.exitskeys() :
>> print 'There is no exit in that direction.'
>> return 1
>> roomlist[self.room_id] = self
>> player_current_room =
>> roomlist[player_current_room.exits[direction]]
>> print player_current_room.name
>> if player_current_room.visits < 1 :
>> print player_current_room.description
>> if player_current_room.item_list != [] :
>> stdout.write('You can see ')
>> for item in player_current_room.item_list :
>> stdout.write('a')
>> if item.display_name[0] in ['a','e','i','o','u'] :
>> stdout.write('n ' + item.display_name
>> +
>> ',')
>> else :
>> stdout.write(item.display_name + ',')
>> pass
>>
>> print
>> print 'Exits:',
>> for way in player_current_room.exits :
>> print way.capitalize(),
>> print
>> player_current_room.visits += 1
>> pass
>> else :
>> player_current_room.visits += 1
>> pass
>> pass
>>
>> def build_rooms(room_file) :
>> global roomlist
>> rfile = open(room_file)
>> tmp_builder = ''
>> for line in rfile :
>> tmp_builder = tmp_builder + line[:-1]
>> pass
>> for location in tmp_builder.rsplit('::') :
>> if location.rsplit(';')[-1] == '' :
>> location = location[:-1]
>> if len(location.rsplit(';')) != 5 :
>> if '-dev' or '-v' in argv :
>> print location.rsplit(';')[0], 'had',
>> len(location.rsplit(';')), 'values in it, 5 expected'
>> for value in location.rsplit(';') :
>> print; print value
>> foobar.append(value)
>> print 'A room failed to initalize due to either too
>> much or
>> not enough values being present in the build file'
>> pass
>> pass
>> else :
>> roomlist[location.rsplit(';')[0]] = room()
>> roomlist[location.rsplit(';')[0]].room_id =
>> location.rsplit(';')[0]
>> roomlist[location.rsplit(';')[0]].name =
>> location.rsplit(';')[1]
>> roomlist[location.rsplit(';')[0]].description =
>> location.rsplit(';')[2]
>> if location.rsplit(';')[3] != 'none' :
>> pass
>> tmp_var = location.rsplit(';')[4]
>> print location.rsplit(';')[0],
>> roomlist[location.rsplit(';')[0]].exits, 'before'
>> for way in tmp_var.rsplit(',') :
>> roomlist[location.rsplit(';')[0]].exits[way.rsplit(':')
>> [0]]
>> = way.rsplit(':')[1]
>>
>> roomlist = {}
>> build_rooms('room_list.txt')
>>
>> And here is the roomlist.txt file :
>>
>> start_room;
>> Starting Room;
>> This is the starting room, if you can read this text it means that at
>> least
>> one part of this beta is working.;
>> none;
>> north:second_room,west:aux_room;
>> ::
>> second_room;
>> Second Room;
>> Yo, Yo! This is the second room, if you can see this text a
>> substantitally
>> greater amount of the game is running than would have been if you
>> didn't see
>> this text.;
>> apple;
>> south:start_room;
>> ::
>> aux_room;
>> Auxillary Room;
>> No, there aren't any barbarian conscripts here, but there is a table!;
>> none;
>> east:start_room;
>>
>> Ideally roomlist['start_room'].exits would equal {'aux_room' :
>> 'west',
>> 'second_room' : 'north'} but it doesn't. Sorry if this is unclear or
>> too
>> long, but I'm really stumped why it is giving bad output
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
--
Have a great day,
Alex (msg sent from GMail website)
mehgcap at gmail.com; http://www.facebook.com/mehgcap
More information about the Python-list
mailing list