RCRPG/Python: Difference between revisions
< RCRPG
Content added Content deleted
(Created page with '{{collection|RCRPG}} This Python 3.1 version of RCRPG uses the standard text interface. All the commands listed on the blog post are implemented, as well…') |
m (Fixed syntax highlighting.) |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 4: | Line 4: | ||
All the commands listed on the blog post are implemented, as well as move and unequip. |
All the commands listed on the blog post are implemented, as well as move and unequip. |
||
==Code== |
===Code=== |
||
⚫ | |||
<lang python>import re |
|||
from random import random |
|||
⚫ | |||
'east':(1,0,0), |
'east':(1,0,0), |
||
'south':(0,1,0), |
'south':(0,1,0), |
||
Line 26: | Line 23: | ||
class Room: |
class Room: |
||
passages = [] |
|||
items = [] |
|||
def __init__(self, items=[]): |
def __init__(self, items=[]): |
||
self.passages = dict |
self.passages = dict.fromkeys(directions.keys(), False) |
||
self.items = items |
self.items = items[:] |
||
def describe(self, location): |
def describe(self, location): |
||
result = 'You are at ' |
result = 'You are at ' |
||
if |
if location in roomNames: |
||
result += roomNames[location] |
result += roomNames[location] |
||
else: |
else: |
||
posStr = ",".join |
posStr = ",".join(str(v) for v in location) |
||
result += posStr |
result += posStr |
||
if |
if self.items: |
||
result += '\nOn the ground you can see: '+', '.join(self.items) |
result += '\nOn the ground you can see: '+', '.join(self.items) |
||
result += '\nExits are: ' |
result += '\nExits are: ' |
||
exits = |
exits = [k for k,v in self.passages.items() if v] or ['None'] |
||
result += ', '.join(map(str.capitalize, exits)) |
|||
⚫ | |||
result += ', '.join(list(map(lambda x: x.capitalize(), exits))) |
|||
return result |
return result |
||
def take(self, target): |
def take(self, target): |
||
results = [] |
results = [] |
||
if |
if target == 'all': |
||
results = self.items[:] |
results = self.items[:] |
||
self.items |
del self.items[:] |
||
print('You now have everything in the room.') |
print('You now have everything in the room.') |
||
elif |
elif target in self.items: |
||
self.items.remove(target) |
|||
results = |
results = [target] |
||
self.items = self.items[0:index]+self.items[index+1:] |
|||
print('Taken.') |
print('Taken.') |
||
else: |
else: |
||
Line 71: | Line 62: | ||
def opposite_dir(direction): |
def opposite_dir(direction): |
||
if |
if direction == 'north': |
||
return 'south' |
return 'south' |
||
elif |
elif direction == 'south': |
||
return 'north'; |
return 'north'; |
||
elif |
elif direction == 'west': |
||
return 'east'; |
return 'east'; |
||
elif |
elif direction == 'east': |
||
return 'west'; |
return 'west'; |
||
elif |
elif direction == 'up': |
||
return 'down'; |
return 'down'; |
||
elif |
elif direction == 'down': |
||
return 'up'; |
return 'up'; |
||
else: |
else: |
||
Line 87: | Line 78: | ||
def make_random_items(): |
def make_random_items(): |
||
from random import randrange |
|||
rand = randrange(4) |
|||
if rand == 0: |
|||
return [] |
return [] |
||
elif |
elif rand == 1: |
||
return ['sledge'] |
return ['sledge'] |
||
elif |
elif rand == 2: |
||
return ['ladder'] |
return ['ladder'] |
||
else: |
else: |
||
Line 98: | Line 90: | ||
class World: |
class World: |
||
def __init__(self): |
|||
currentPos = 0,0,0 |
|||
self.currentPos = 0,0,0 |
|||
self.rooms = {(0,0,0): Room(['sledge'])} |
|||
inv = [] |
|||
self.inv = [] |
|||
⚫ | |||
def look(self): |
def look(self): |
||
Line 107: | Line 100: | ||
def move(self, direction): |
def move(self, direction): |
||
if |
if direction == 'up' and \ |
||
'ladder' not in self.rooms[self.currentPos].items: |
|||
print("You'll need a ladder in this room to go up.") |
print("You'll need a ladder in this room to go up.") |
||
return |
return |
||
if |
if direction not in directions: |
||
print("That's not a direction.") |
print("That's not a direction.") |
||
return |
return |
||
if |
if self.rooms[self.currentPos].passages[direction]: |
||
self.currentPos = get_new_coord(self.currentPos, direction) |
self.currentPos = get_new_coord(self.currentPos, direction) |
||
else: |
else: |
||
Line 124: | Line 117: | ||
def inventory(self): |
def inventory(self): |
||
if |
if self.inv: |
||
print('Carrying: '+', '.join(self.inv)) |
print('Carrying: '+', '.join(self.inv)) |
||
else: |
else: |
||
print("You aren't carrying anything.") |
print("You aren't carrying anything.") |
||
if |
if self.equipped: |
||
print('Holding: '+self.equipped) |
print('Holding: '+self.equipped) |
||
Line 135: | Line 128: | ||
def drop(self, target): |
def drop(self, target): |
||
if |
if target == 'all': |
||
self.rooms[self.currentPos].items |
self.rooms[self.currentPos].items.extend(self.inv) |
||
self.inv |
del self.inv[:] |
||
print('Everything dropped.') |
print('Everything dropped.') |
||
elif |
elif target in self.inv: |
||
self.inv.remove(target) |
|||
self.rooms[self.currentPos].items |
self.rooms[self.currentPos].items.append(target) |
||
self.inv = self.inv[0:index]+self.inv[index+1:] |
|||
print('Dropped.') |
print('Dropped.') |
||
else: |
else: |
||
Line 148: | Line 140: | ||
def equip(self, itemName): |
def equip(self, itemName): |
||
if |
if itemName in self.inv: |
||
if |
if self.equipped: |
||
self.unequip() |
self.unequip() |
||
self.inv.remove(itemName) |
|||
self.equipped = |
self.equipped = itemName |
||
self.inv = self.inv[0:index]+self.inv[index+1:] |
|||
print('Equipped '+itemName+'.') |
print('Equipped '+itemName+'.') |
||
else: |
else: |
||
print("You aren't |
print("You aren't carrying that.") |
||
def unequip(self): |
def unequip(self): |
||
if |
if not self.equipped: |
||
print("You aren't equipped with anything.") |
print("You aren't equipped with anything.") |
||
else: |
else: |
||
self.inv |
self.inv.append(self.equipped) |
||
print('Unequipped '+self.equipped+'.') |
print('Unequipped '+self.equipped+'.') |
||
self.equipped = '' |
self.equipped = '' |
||
Line 170: | Line 161: | ||
def dig(self, direction): |
def dig(self, direction): |
||
if |
if self.equipped != 'sledge': |
||
print("You don't have a digging tool equipped.") |
print("You don't have a digging tool equipped.") |
||
return |
return |
||
if |
if direction not in directions: |
||
print("That's not a direction.") |
print("That's not a direction.") |
||
return |
return |
||
if |
if not self.rooms[self.currentPos].passages[direction]: |
||
self.rooms[self.currentPos].passages[direction] = True |
self.rooms[self.currentPos].passages[direction] = True |
||
joinRoomPos = get_new_coord(self.currentPos, direction) |
joinRoomPos = get_new_coord(self.currentPos, direction) |
||
if |
if joinRoomPos not in self.rooms: |
||
self.rooms[joinRoomPos] = Room(make_random_items()) |
self.rooms[joinRoomPos] = Room(make_random_items()) |
||
self.rooms[joinRoomPos].passages[opposite_dir(direction)] = True |
self.rooms[joinRoomPos].passages[opposite_dir(direction)] = True |
||
Line 188: | Line 179: | ||
world = World() |
world = World() |
||
print("Welcome to the dungeon!\nGrab the sledge and make your way to room 1,1,5 for a non- |
print("Welcome to the dungeon!\nGrab the sledge and make your way to room 1,1,5 for a non-existent prize!") |
||
while True: |
while True: |
||
print('\n'+world.look()) |
print('\n'+world.look()) |
||
tokens = |
tokens = input("> ").strip().lower().split() |
||
if |
if tokens[0] == 'quit': |
||
break |
break |
||
while |
while tokens: |
||
if |
if tokens[0] in aliases and tokens[0] != aliases[tokens[0]][0]: |
||
tokens = aliases[tokens[0]] + tokens[1:] |
tokens = aliases[tokens[0]] + tokens[1:] |
||
continue |
continue |
||
Line 207: | Line 198: | ||
break |
break |
||
print("Thanks for playing!") |
print("Thanks for playing!")</syntaxhighlight> |
||
</lang> |
Latest revision as of 12:52, 30 August 2022
RCRPG/Python is part of RCRPG. You may find other members of RCRPG at Category:RCRPG.
This Python 3.1 version of RCRPG uses the standard text interface.
All the commands listed on the blog post are implemented, as well as move and unequip.
Code
directions = {'north':(0,-1,0),
'east':(1,0,0),
'south':(0,1,0),
'west':(-1,0,0),
'up':(0,0,1),
'down':(0,0,-1)}
aliases = {'north': ['move','north'],
'south': ['move','south'],
'east': ['move','east'],
'west': ['move','west'],
'up': ['move','up'],
'down': ['move','down']}
roomNames = {(0,0,0):'the starting room',
(1,1,5):'the prize room'}
class Room:
def __init__(self, items=[]):
self.passages = dict.fromkeys(directions.keys(), False)
self.items = items[:]
def describe(self, location):
result = 'You are at '
if location in roomNames:
result += roomNames[location]
else:
posStr = ",".join(str(v) for v in location)
result += posStr
if self.items:
result += '\nOn the ground you can see: '+', '.join(self.items)
result += '\nExits are: '
exits = [k for k,v in self.passages.items() if v] or ['None']
result += ', '.join(map(str.capitalize, exits))
return result
def take(self, target):
results = []
if target == 'all':
results = self.items[:]
del self.items[:]
print('You now have everything in the room.')
elif target in self.items:
self.items.remove(target)
results = [target]
print('Taken.')
else:
print('Item not found.')
return results
def get_new_coord(oldCoord, direction):
return (oldCoord[0]+directions[direction][0],
oldCoord[1]+directions[direction][1],
oldCoord[2]+directions[direction][2])
def opposite_dir(direction):
if direction == 'north':
return 'south'
elif direction == 'south':
return 'north';
elif direction == 'west':
return 'east';
elif direction == 'east':
return 'west';
elif direction == 'up':
return 'down';
elif direction == 'down':
return 'up';
else:
raise Exception('No direction found: '+direction)
def make_random_items():
from random import randrange
rand = randrange(4)
if rand == 0:
return []
elif rand == 1:
return ['sledge']
elif rand == 2:
return ['ladder']
else:
return ['gold']
class World:
def __init__(self):
self.currentPos = 0,0,0
self.rooms = {(0,0,0): Room(['sledge'])}
self.inv = []
self.equipped = ''
def look(self):
return self.rooms[self.currentPos].describe(self.currentPos)
def move(self, direction):
if direction == 'up' and \
'ladder' not in self.rooms[self.currentPos].items:
print("You'll need a ladder in this room to go up.")
return
if direction not in directions:
print("That's not a direction.")
return
if self.rooms[self.currentPos].passages[direction]:
self.currentPos = get_new_coord(self.currentPos, direction)
else:
print("Can't go that way.")
def alias(self, newAlias, *command):
aliases[newAlias] = list(command)
print('Alias created.')
def inventory(self):
if self.inv:
print('Carrying: '+', '.join(self.inv))
else:
print("You aren't carrying anything.")
if self.equipped:
print('Holding: '+self.equipped)
def take(self, target):
self.inv += self.rooms[self.currentPos].take(target)
def drop(self, target):
if target == 'all':
self.rooms[self.currentPos].items.extend(self.inv)
del self.inv[:]
print('Everything dropped.')
elif target in self.inv:
self.inv.remove(target)
self.rooms[self.currentPos].items.append(target)
print('Dropped.')
else:
print('Could not find item in inventory.')
def equip(self, itemName):
if itemName in self.inv:
if self.equipped:
self.unequip()
self.inv.remove(itemName)
self.equipped = itemName
print('Equipped '+itemName+'.')
else:
print("You aren't carrying that.")
def unequip(self):
if not self.equipped:
print("You aren't equipped with anything.")
else:
self.inv.append(self.equipped)
print('Unequipped '+self.equipped+'.')
self.equipped = ''
def name(self, *newRoomNameTokens):
roomNames[self.currentPos] = ' '.join(newRoomNameTokens)
def dig(self, direction):
if self.equipped != 'sledge':
print("You don't have a digging tool equipped.")
return
if direction not in directions:
print("That's not a direction.")
return
if not self.rooms[self.currentPos].passages[direction]:
self.rooms[self.currentPos].passages[direction] = True
joinRoomPos = get_new_coord(self.currentPos, direction)
if joinRoomPos not in self.rooms:
self.rooms[joinRoomPos] = Room(make_random_items())
self.rooms[joinRoomPos].passages[opposite_dir(direction)] = True
print("You've dug a tunnel.")
else:
print("Already a tunnel that way.")
world = World()
print("Welcome to the dungeon!\nGrab the sledge and make your way to room 1,1,5 for a non-existent prize!")
while True:
print('\n'+world.look())
tokens = input("> ").strip().lower().split()
if tokens[0] == 'quit':
break
while tokens:
if tokens[0] in aliases and tokens[0] != aliases[tokens[0]][0]:
tokens = aliases[tokens[0]] + tokens[1:]
continue
try:
getattr(world, tokens[0])(*tokens[1:])
except AttributeError as ex:
print('Command not found.')
except TypeError as ex:
print('Wrong number of args.')
break
print("Thanks for playing!")