Python-使用字典创建建筑地图

Python-使用字典创建建筑地图,python,dictionary,Python,Dictionary,我想创建一个建筑地图,其中每个房间都有一个字典,其中包含从列表中随机挑选的房间(想想旧式文本冒险)中填充的北、南、东、西 例如: random_rooms = [class_room,hall,entrance] room_A.directions = {"North":random.choice(random_rooms),"East":random.choice(random_rooms),"South":random.choice(random_rooms),"West":random.c

我想创建一个建筑地图,其中每个房间都有一个字典,其中包含从列表中随机挑选的房间(想想旧式文本冒险)中填充的北、南、东、西

例如:

random_rooms = [class_room,hall,entrance]
room_A.directions = {"North":random.choice(random_rooms),"East":random.choice(random_rooms),"South":random.choice(random_rooms),"West":random.choice(random_rooms)}
但是,我想填充它,以便它与建筑匹配。因此,如果先设置房间A,并将房间B设置为北面,则房间B将房间A设置为南面

因此:


我不知道最好的办法是什么。我不担心东西的排列顺序,只要一个房间不在另一个房间的南北方向。

听起来你实际上在寻找的是一个坐标映射系统,而不是一个方向图。为此,您需要创建一个网格阵列。然后,阵列将由布局组成(例如,4x4网格区域可以是4x4矩阵,也可以是简单的16单元阵列)

假设一个#x#矩阵:


如果房间[0][3]=random.choice(random_rooms),您唯一关心的是确保所有房间都已连接(添加一个传递筛选器以返回,如果[0][0]例如==一个有效房间,则[0][1]必须连接,或者[1][0]必须,这将填补连接所有房间的空白。

您可能希望使用矩阵对
roomA
roomB
、…等的坐标进行编码。通过这种方式,可以按原样定义它们的相对位置,因此您无需担心碰撞。例如:

import numpy as np

rooms = np.arange(4)  # 0, 1, 2, 3 stands for 4 rooms/roometypes/whatever
room_arrangement = np.random.shuffle(tmp).reshape(2,2)  # reshape into a 2x2 grid
分配到
room\u排列中的房间
,使用数字表示房间对象或字符串。如果您需要房间稀疏排列,即它们可以分散到任何地方,请将一些0插入
Rooms
数组,并将下一行更改为
重塑(m,n)
其中
m*n==np.sum(Rooms.shape)


顺便说一句,看看人们是如何将游戏建模为矩阵的是一个好主意。基本原理与上面相同:1)定义你要处理的接地板,2)将标签插入接地板,3)必要时,将标签链接到你感兴趣的对象(简单的情况:字典、数据框条目;稍微复杂的情况:定义类). 通常,数据编码在矩阵中,字典/类实例处理元数据/特殊规则部分。

现在似乎是开始使用类的好时机。通过一门课程,你将能够处理与每个房间相连的内容,以及通过哪个方向。这里有一个简单的例子

class Room(object):
    def __init__(self, name=None):
        self.name = str(name)
        self.matching_direction = { "N": "S", "S": "N", "W": "E", "E": "W"}
        self.open_walls = ["N", "S", "E", "W"]
        self.connected_rooms = {}

    def connect_room(self, room_obj=None, room_obj_exit=None):
        """
        Connect two rooms if able.
        Params:
            room_obj: Room(Object)
            room_obj_exit: Direction(String)
        Return: Bool
        """
        try:
            opposite_direction = self.matching_direction[room_obj_exit]

            if opposite_direction not in self.open_walls:
                print "{} door is occupied by {}".format(opposite_direction, self.connected_rooms[opposite_direction].name)
                return False

            if room_obj_exit not in room_obj.open_walls:
                print "{} is occupied by {}".format(room_obj_exit, room_obj.connected_rooms[room_obj_exit].name)
                return False

            self.connected_rooms[opposite_direction] = room_obj
            room_obj.connected_rooms[room_obj_exit] = self
            self.open_walls.remove(opposite_direction)
            room_obj.open_walls.remove(room_obj_exit)
            return True

        except Exception as e:
            print e
        return False

    def explore_door(self, direction=None):
        """
        Try to move to another Room
        Return : Room(Object)
        """
        try:
            if direction in self.connected_rooms:
                print "The {} Door is open to {}".format(direction, self.connected_rooms[direction].name)
                return self.connected_rooms[direction]
            else:
                print "The {} Door is locked".format(direction)
        except Exception as e:
            print e
        return False
以下是一些用法:

room_one = Room(name="Room One")
room_two = Room(name="Room Two")
room_three = Room(name="Room Three")

room_one.connect_room(room_obj=room_two, room_obj_exit="N")
room_two.connect_room(room_obj=room_three, room_obj_exit="E")
room_three.connect_room(room_obj=room_one, room_obj_exit="S")

room_one.explore_door(direction="N")
room_one.explore_door(direction="S")
room_one.explore_door(direction="E")
room_one.explore_door(direction="W")
输出:

S is occupied by Room Two
The N Door is locked
The S Door is open to Room Two
The E Door is locked
The W Door is locked

为什么不将房间创建为双链接列表呢?例如,当您将
room\u b
设置为
room\u a
以南时,
room\u a
会自动将自己设置为
room\u b
以北?我想这是我正在尝试的,但我不确定有效的最佳方法。这很好,而且似乎是正确的设置方式。我的问题是使房间随机连接,这是有意义的。假设我随机设置房间的出口,它们都显示为“N”-这将导致房间3位于房间1和房间2的北部和南部。通常,你会分配一个巨大的空间,满是占用的瓷砖。然后,你会划出几个房间。然后根据需要移动它们,并向其添加接头。这里有一个更详细的例子
S is occupied by Room Two
The N Door is locked
The S Door is open to Room Two
The E Door is locked
The W Door is locked