如何在Python中将原始输入与变量值相等?
这是我第一次写“程序”或者脚本之类的东西。如果我走错了方向,大家可以随便嘲笑我。
我想做一个文本版的玩家对战棋类游戏。
我最开始的想法是把棋盘做成一个8x8的列表,比如[[a1,a2...a8]...[h1,h2...h8]],但是我不太确定怎么给列表里的每个项加上值,比如标记这个位置是被占用还是空着。
然后我想到可以把每个格子当成一个单独的值,记录它的状态,比如a1 = wr(代表白色车),而a3 = o(代表空着),在成功移动后只需要更新这些格子的值。
我最开始的想法是接收用户输入,比如:
move = raw_input("enter your move")
用户会输入:
比如e4
然后我想做一些事情,比如:
if move == "o"
来确保这个格子是空的。
我觉得我想做的事情很明显,但我明白为什么它不工作。
有没有什么方法可以把用户输入的内容当作变量,这样:
move == o returns TRUE if the variable e4 is o
?
编辑:
实际上代码现在只在我脑海里,但我可以给你一个大概:
a1=wr
a2=wp
a3=o
a4=o
a5=o
a6=o
a7=bp
a8=br
接下来还有其他的文件
move = raw_input("enter your move: ")
-----这个程序主要是为了我自己,所以我不检查输入,我只会输入一个动作,比如:e4
if move == o:
then e4 = wp
else print "illegal move, square is occupied"
我意识到变量'move'指向字符串'e4',而变量e4指向字符串'o',它们是不同的东西,但有没有办法把输入的字符串检查一下,看看是否有一个同名的变量?
太棒了,谢谢大家的精彩回答...
3 个回答
一般来说,如果你想把用户输入转换成变量名,那你可能走错了方向。虽然你可以使用 eval()
,但这样做没有什么好处——只要稍微想一下,就能想到恶意用户可能会利用这个漏洞,导致非常糟糕的后果。你当然可以写一堆规则来验证输入,确保在进行这种变量名转换之前是安全的,但这样做需要很多工作,反而让错误的方法变得可行。虽然有例外情况,但作为初学者,你应该认为这是个坏主意——等你学会了更多知识后,你会了解这些例外,或者至少知道在什么情况下这样做是相对安全的。
你在考虑使用数据结构来存储棋盘,这个思路是对的。有很多方法可以做到这一点,你的嵌套列表就是一种有效的方式。为了继续这个思路,你可能需要写一个函数,把像 'e4' 这样的输入转换成棋盘上的位置,可能还需要让它帮你查找实际的位置。接下来的步骤可以是创建一个棋盘类,并把这个转换功能作为它的方法(然后再添加一个 move()
方法,把逻辑交给代表每种棋子的对象)。
还有其他有效的解决方案,每种方案都有自己的优缺点。
是的,这个是可以做到的,但一般来说,这个主意不太好,大家都不太赞成。因为这样做会很慢,而且有点像是临时拼凑的解决方案,几乎不会用到。而且在某些情况下,这种方法更容易出错,验证起来也比较麻烦,可能还会带来安全问题(虽然在这里可能不太相关,但还是要注意)。
更好的做法是使用字典。你不需要改变棋盘的表示方式,只要在确认输入格式正确后,提取出数字和字母,然后根据这些输入推导出用户想要的字段索引:
- 对于数字,使用
int
将其转换为整数,然后减去1(因为列表的索引是从0开始的)。 - 用字典将字母映射到索引,比如
{'a': 0, 'b': 1, ..., 'h':7}
(虽然有更聪明的方法可以用更少的代码实现,但这个方法简单有效)。
我觉得你其实想要的是一个字典,这个字典里包含了棋盘的完整状态——
board = { "a1" : "o", "a2" : "k", # ...
}
然后你可以这样做
if board[move] == "o":
# take appropriate action
每当你想到“我想通过名字查找一个变量”时,字典很可能就是你应该使用的东西。