这是我的第一个'程序'或脚本或whatev。因此,如果我完全错误,请随意取笑我
我想制作一个文字,玩家与玩家国际象棋程序
我的第一直觉是让董事会成为像[[a1,a2 ... a8] ... [h1,h2 ... h8]]这样的8x8列表,但不确定如何将值附加到列表,例如占用或未占用的标志
然后我有了想法,将每个方块作为一个单独的值来保持其状态,如a1 = wr(白车)和a3 = o(开启),成功移动后只需更新方块的值。
我的第一直觉是接受用户输入,如
move = raw_input("enter your move")
并且用户将输入:
例如,e4
然后我想做类似的事情:
if move == "o"
确保广场开放 我认为这显然是我在做什么,但我明白为什么它不起作用 有没有办法将raw_input转换为变量,以便:
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'并且这些是独立且不同的实体,但是有一些方法可以获取字符串输入并检查看看是否有一个具有相同“名称”的变量?
非常感谢所有伟大的答案......
答案 0 :(得分:3)
我认为你真正想要的是一本包含董事会完整状态的字典 -
board = { "a1" : "o", "a2" : "k", # ...
}
然后你做
if board[move] == "o":
# take appropriate action
任何时候你发现自己在想“我想通过它的名字查找变量”,字典很可能就是你应该使用的字典。
答案 1 :(得分:2)
是的,这是可能的,但通常是一个相当可怕的想法,并且不屑一顾 - 它缓慢而且hacky,几乎从不需要,并且在某些情况下更容易出错/更难以验证和安全问题的根源(可能不在这里,但仍然)。
而是使用dictionaries - 你不需要改变bord表示,你可以(在检查输入是否是正确的格式之后),提取数字和字母,然后从输入中导出引用用户意味着的字段的索引:
int
的整数并减去1(因为列表索引从0开始){'a': 0, 'b': 1, ..., 'h':7}
的字典将字母映射到索引(有很多聪明的方法可以用更少的代码执行此操作,但这个方法简单有效)。答案 2 :(得分:2)
作为一般规则,如果您想将用户输入转换为变量名称,那么您做错了。当然,你可以使用eval()
,但没有什么好处 - 它没有太多想到找到恶意用户滥用这个并使非常糟糕的事情发生的方式。当然,在执行这个直接的变量名称魔术之前,你可以写一堆规则来验证输入,但要使错误的方法起作用是很多工作。总有例外,但作为一个初学者,你应该假设这是一个坏主意 - 一旦你了解了你正在做的事情,你就会学到例外情况,或者至少可以学到这样的事情。< / p>
当您考虑使用数据结构来保存电路板时,您正走在正确的道路上。有很多方法可以做到这一点 - 嵌套列表是一种有效的方法。要完成这种方法,你可能想要编写一个从'e4'转换到电路板上的位置的函数,可能需要它实际查找。下一步可能是制作一个Board class&amp;有这个是它的方法(然后有一个move()
方法,它将逻辑传递给代表每个片段类型的对象。)
还有其他有效的方法可以解决这个问题,每个方法各有利弊。