Python:获取上一个列表条目(相对于分配给当前列表位置的变量)
Python: get previous list entry(relative to a variable assigned to a current list position)
我正在 Python 中构建一个非常简单的基于文本的游戏,其中包含玩家可以在其中移动的 5 个房间。
玩家从中央房间 gameMap[2] 开始。
下面是提供玩家位置的代码。
gameMap = ['room0','room1','room2','room3','room4']
playerLocation = gameMap[2]
现在假设玩家想向左移动。
这意味着我必须将 playerLocation 分配给 gameMap[1]
。
playerLocation = gameMap[1]
只有 5 个房间,这可以相当容易地完成。但出于缩放目的,我希望能够将 playerLocation 分配给 'the current list entry -1',假设它在范围内。
这条指令会进行如下赋值:
如果 playerLocation 是 gameMap[4],playerLocation = gameMap[3]
如果 playerLocation 是 gameMap[1],playerLocation = gameMap[0]
我考虑过使用 next(gameMap) 但这似乎存在两个问题:
1) 它不允许我引用玩家的当前位置,因为它必须从 gameMap[0]
开始
2) 由于Python 的体系结构,它似乎不能反向工作,并且。 (抱歉,如果我在这里使用了错误的术语:)。
我到处都找过了,但似乎找不到任何方法来做到这一点。可能吗?
在这种情况下你可以做的是有一个变量,用作玩家所在的点;例如:
current = 0
然后进行任何必须的计算并调用 playerLocation = gameMap[current]
如果您想返回一个级别,您可以这样做:
current -= 1
playerLocation = gameMap[current]
我不确定我是否遗漏了你问题的一部分,因为这看起来相对简单;如果我理解有误,请指正。
您是否尝试过简单地对球员的位置进行某种索引?
那么如果玩家在第一个房间,例如索引为 0,你可以这样做:
index = index + 1 if index + 1 < len(gameMap) else index
前进时
index = index - 1 if index > 0 else index
倒退时。
如果您希望它具有可扩展性,那么您可以通过一些外部加载的文本文件来填充一些状态机实现可能会更可取。这些线程可能包含一些指向此方向的指针:
- Python state-machine design
- https://codereview.stackexchange.com/q/193753
- https://codereview.stackexchange.com/q/155661
如果您想保持简单,请将您的地图制作成字典。您还可以在那里包含状态转换。或者,您可以添加一个子词典,其中可能包含特定于状态的可用操作和相应的状态转换。
未经测试的示例:
map = {
'room0': {'next': 'room1', 'prev': 'room4', 'description': '...'},
'room1': {'next': 'room2', 'prev': 'room0', 'description': '...'},
'room2': {'next': 'room3', 'prev': 'room1', 'description': 'The entrance'},
'room3': {'next': 'room4', 'prev': 'room2', 'description': '...'},
'room4': {'next': 'room0', 'prev': 'room3', 'description': '...'},
}
current_state = 'room2'
# transitions be like
next_state = map[current_state]['next']
prev_state = map[current_state]['prev']
我正在 Python 中构建一个非常简单的基于文本的游戏,其中包含玩家可以在其中移动的 5 个房间。
玩家从中央房间 gameMap[2] 开始。
下面是提供玩家位置的代码。
gameMap = ['room0','room1','room2','room3','room4']
playerLocation = gameMap[2]
现在假设玩家想向左移动。
这意味着我必须将 playerLocation 分配给 gameMap[1]
。
playerLocation = gameMap[1]
只有 5 个房间,这可以相当容易地完成。但出于缩放目的,我希望能够将 playerLocation 分配给 'the current list entry -1',假设它在范围内。
这条指令会进行如下赋值:
如果 playerLocation 是 gameMap[4],playerLocation = gameMap[3]
如果 playerLocation 是 gameMap[1],playerLocation = gameMap[0]
我考虑过使用 next(gameMap) 但这似乎存在两个问题:
1) 它不允许我引用玩家的当前位置,因为它必须从 gameMap[0]
开始
2) 由于Python 的体系结构,它似乎不能反向工作,并且
我到处都找过了,但似乎找不到任何方法来做到这一点。可能吗?
在这种情况下你可以做的是有一个变量,用作玩家所在的点;例如:
current = 0
然后进行任何必须的计算并调用 playerLocation = gameMap[current]
如果您想返回一个级别,您可以这样做:
current -= 1
playerLocation = gameMap[current]
我不确定我是否遗漏了你问题的一部分,因为这看起来相对简单;如果我理解有误,请指正。
您是否尝试过简单地对球员的位置进行某种索引? 那么如果玩家在第一个房间,例如索引为 0,你可以这样做:
index = index + 1 if index + 1 < len(gameMap) else index
前进时
index = index - 1 if index > 0 else index
倒退时。
如果您希望它具有可扩展性,那么您可以通过一些外部加载的文本文件来填充一些状态机实现可能会更可取。这些线程可能包含一些指向此方向的指针:
- Python state-machine design
- https://codereview.stackexchange.com/q/193753
- https://codereview.stackexchange.com/q/155661
如果您想保持简单,请将您的地图制作成字典。您还可以在那里包含状态转换。或者,您可以添加一个子词典,其中可能包含特定于状态的可用操作和相应的状态转换。
未经测试的示例:
map = {
'room0': {'next': 'room1', 'prev': 'room4', 'description': '...'},
'room1': {'next': 'room2', 'prev': 'room0', 'description': '...'},
'room2': {'next': 'room3', 'prev': 'room1', 'description': 'The entrance'},
'room3': {'next': 'room4', 'prev': 'room2', 'description': '...'},
'room4': {'next': 'room0', 'prev': 'room3', 'description': '...'},
}
current_state = 'room2'
# transitions be like
next_state = map[current_state]['next']
prev_state = map[current_state]['prev']