我目前正在创建一个冒险游戏,您可以通过在输入(“ NORTH”,“ SOUTH” ...)中输入命令来在地牢的房间中移动。因此,我尝试使用字典将每个房间链接在一起,以便我可以使用“ North”,“ South”等键在这些房间中移动。但我似乎无法弄清楚。有什么想法吗?
答案 0 :(得分:1)
您的想法在劣势方面有几个优点:
如果您想要经典的“ roguelike-ish”运动(在带有某种瓷砖的2d网格中),则图地牢表示会遇到很多问题(实际上,您现在正在使用图)。让我们来看看这个地牢:
ROOM1 > ROOM2 > NORTH
ROOM2 > ROOM3 > NORTH
ROOM3 > ROOM1 > NORTH
您将获得一个房间环。不好,但是您可以执行以下操作:
ROOM1 > ROOM2 > NORTH
ROOM1 > ROOM2 > SOUTH
这真的很令人困惑,因为您可以朝不同的方向移动并进入一个房间。为了避免这种情况的发生,您可以将自己的地牢表示为公平的2D网格,如下所示:
rooms_mask = [
[0,1,0,0,1],
[1,1,1,0,1],
[0,0,1,1,1],
[1,1,1,0,0],
[1,0,0,0,0]
]
您的操作只会从当前位置的x或y坐标中加上或减去1。这是简单的示例代码:
class Room(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
if self.y < 3:
return 'It is a dark and gloomy room: ({}, {})'.format(self.x, self.y)
else:
return 'It is a light and shining room: ({}, {})'.format(self.x, self.y)
rooms_mask = [
[0,1,0,0,1],
[1,1,1,0,1],
[0,0,1,1,1],
[1,1,1,0,0],
[1,0,0,0,0]
]
rooms = [[Room(j, i) for j, _ in enumerate(rm)] for i, rm in enumerate(rooms_mask)]
x = 2
y = 2
while True:
action = input()
if action == 'q':
break
elif action == 'n':
if y > 0 and rooms_mask[y-1][x] == 1:
y -= 1
print(rooms[y][x])
elif action == 's':
if y < len(rooms_mask) - 1 and rooms_mask[y+1][x] == 1:
y += 1
print(rooms[y][x])
elif action == 'e':
if x < len(rooms[0]) - 1 and rooms_mask[y][x+1] == 1:
x += 1
print(rooms[y][x])
elif action == 'w':
if x > 0 and rooms_mask[y][x-1] == 1:
x -= 1
print(rooms[y][x])
但是,如果您真的想将地牢表示为图形,则可以使用以下代码:
from collections import defaultdict
raw_rooms = [
[1,2,'n'],
[2,3,'w'],
[1,4,'s']
]
rooms = defaultdict(list)
for source, target, direction in raw_rooms:
rooms[source].append([target, direction])
current_room = 1
while True:
action = input()
if action == 'q':
break
else:
for target, direction in rooms[current_room]:
if direction == action:
print('I am in room {}'.format(target))
current_room = target
此代码使用defaultdicts存储房间图。您还可以使用networkx来使用真实图形并对其进行处理。