使用字典中的随机文本文件链接房间-冒险游戏

时间:2019-05-14 12:32:03

标签: python class dictionary

我目前正在创建一个冒险游戏,您可以通过在输入(“ NORTH”,“ SOUTH” ...)中输入命令来在地牢的房间中移动。因此,我尝试使用字典将每个房间链接在一起,以便我可以使用“ North”,“ South”等键在这些房间中移动。但我似乎无法弄清楚。有什么想法吗?

1 个答案:

答案 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来使用真实图形并对其进行处理。