【问题标题】:Set player's main region depending on location - Python根据位置设置播放器的主要区域 - Python
【发布时间】:2015-02-01 16:38:38
【问题描述】:

我是 Python 的新手,我可以在一个基于文本的小型游戏(实际上是“风险”棋盘游戏的一个版本)中使用一些建议。我的定位系统有问题,因为我想将游戏划分为多个区域,在这些区域中会有许多位置。我必须这样做,因为某些地区一开始不可用。

不管怎样,到现在为止我都做了:

区域列表(名称是程序生成的):

regionList = [casia, lorus, mehin]

3 个地区列表,例如:

casia = ["casia", "town1", "town2", "town3"]

(为了方便代码的其他部分,我似乎不得不在列表开头留下区域名称)

还有一个列表,其中包含玩家在新位置输入时更新的初始位置:

playerPos = [(regionList[0])[0], (regionList[0])[1]]

有没有办法简单地输入位置的名称(它们都是不同的)并自动更新位置列表中的区域?我还没有找到一种从列表的元素中获取列表名称的方法,但这能解决吗?

另外,如果有更有效的组织方式,请告知我,如果问题需要进一步澄清,请告诉我。

非常感谢!

【问题讨论】:

  • 表示您想在regionList 中添加新的region 并自动更新townregion 列表。根据这些信息,我们必须更新玩家位置,因此玩家位置的输入为player nameregiontown。如果缺少区域信息,则更新区域信息?
  • 我不应该同时输入玩家去的“地区”和“城镇”,因为“地区”总是取决于城镇,例如。如果玩家在“town1”,他必须在“casia”地区。我不知道的是代码“技术”或参数从城镇输入中获取区域名称,然后将区域转移到'playerPos'
  • 欢迎来到 SO。我认为您遇到的必须将名称保留在列表中的问题可能是不熟悉 Python 中的面向对象。当您最终完成项目时,请考虑发布到 StackExchange Code Review for cmets。

标签: python list


【解决方案1】:

如果列表足够少、足够小,您可以使用蛮力解决方案:

def find_location(location_name):
    for region in regionList:
        if location_name in region:
            return [region[0], location_name]
    # if we get there the location name was found nowhere
    raise ValueError('Location {!r} unknown'.format(location_name))

如果出于您的目的,区域的数量或长度过度减慢了这种蛮力操作,您可以一次性通过来构建用作“索引”的字典:

loc2reg = {}
def populate_loc2reg():
    for region in regionList:
        for location_name in region:
            loc2reg[location_name] = [region[0], location_name]

这有点多余,因为它再次存储了位置名称,但它确实使事情变得非常快:

def find_location_fast(location_name):
    try: return loc2reg[location_name]
    except KeyError:
        raise ValueError('Location {!r} unknown'.format(location_name))

这里有几种可能的变体,我只是为初学者提出最简单的代码。

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多