Python 在进行零和交叉/井字游戏时,定义前引用的变量
因此,我一直在制作一个Xs和Os游戏,作为Python3.4中的一个辅助项目,我遇到了一个问题。虽然它可以工作,但不会保存棋盘,因为我必须在Python 在进行零和交叉/井字游戏时,定义前引用的变量,python,python-3.x,python-3.4,Python,Python 3.x,Python 3.4,因此,我一直在制作一个Xs和Os游戏,作为Python3.4中的一个辅助项目,我遇到了一个问题。虽然它可以工作,但不会保存棋盘,因为我必须在def game(): 如果我在def game():之外定义了插槽,即使我将其全球化,也会出现错误,slot 1(等)在定义之前引用了或其他内容。 这是到目前为止我的代码,因为我想要一个循环,所以我必须将游戏放入def game(): 如果您运行它,您将看到我的问题是什么,因为我需要在game()的主定义中进行while循环,即while cond1==(
def game():
如果我在def game():
之外定义了插槽,即使我将其全球化,也会出现错误,slot 1
(等)在定义之前引用了或其他内容。
这是到目前为止我的代码,因为我想要一个循环,所以我必须将游戏放入def game():
如果您运行它,您将看到我的问题是什么,因为我需要在game()
的主定义中进行while
循环,即while cond1==(1)
因此,基本上,当某个条件为真时,插槽保持这种方式,否则它将无法在回合之间保存棋盘,并且我无法在主def game():
之外定义cond1
,或者,即使在定义之前没有引用错误的插槽,即使我将其全球化
如果我将插槽的主定义放在def game()之外:
slot1 = """
[1]
"""
slot2 = """
[2]
"""
slot3 = """
[3]
"""
slot4 = """
[4]
"""
slot5 = """
[5]
"""
slot6 = """
[6]
"""
slot7 = """
[7]
"""
slot8 = """
[8]
"""
slot9 = """
[9]
"""
当它打印插槽时,为了显示游戏板的当前状态,它会转到定义之前引用的错误变量,就像我说的,即使我全球化了它们,即使没有在def globalvar():
中全球化它们,正常情况下,我仍然会遇到这个问题!如果我在def game():
开始时定义插槽,它不会保存棋盘(因为它显然会将插槽重新定义为这些插槽),如果我在开始时将while循环放在上面,它就会停止,并保持原样,在打印(gameboard)
之后,它什么也不做,显然程序仍在运行,因为它是,因为while循环需要为true,或者在它后面有一个else
语句,这不起作用,只会破坏它
编辑:我尝试在括号内的slotkeeper=(“1”)
周围使用引号,并将而slotkeeper==(1):
更改为而slotkeeper==(“1”)
,仍然没有更改。D:
编辑编辑:编辑确实会有所不同,但它没有得到错误消息,而是卡住了,即使我已经全球化了变量,slotkeeper
,并将其设置为(“1”)
,然后在def game2():
中我将其设置为(“0”)
我们使用global
关键字访问全局变量,而不是声明它。Python是一种动态语言,无论如何,变量声明没有多大意义
其次,你为什么需要这么多全局变量呢。我相信你能想出其他优雅的方式
第三,请不要使用那么多if/elif语句,而是使用dict,这会更像python-
slot_options = {
"1": """
[X]
""",
"2": """
[X]
"""
...
}
slots = {}
slots[xturn] = slot_options[xturn]
这句话有点意思
第四,这些代表“X”位置的“图纸”是怎么回事
我建议您先查看一些当前实现的代码,然后自己设计。它可能会给你一些提示。您可以查看这个-您严重误解了Python语句的工作原理。您不能使用它来声明全局变量。无需声明任何内容,在模块顶层进行的任何赋值都会创建一个全局变量
相反,您可以在希望能够修改函数外部定义的变量的函数中使用它。因此,将globalvar
函数中当前包含的global
语句(它们没有做任何有用的事情)移动到game
函数中。这将允许游戏中的代码修改全局变量(并避免出现异常)
请注意,使用全局变量通常是设计不佳的症状。当你有很多的时候,尤其如此,就像你现在在你的程序中所做的那样。作为更好设计的开始,我强烈建议使用列表或其他数据结构来保存董事会数据,而不是使用一堆单独的变量。globalvar
函数的作用与您可能认为的不同。它没用,你最好把它删除。@CristianCiupitu尝试在没有globalvar()
的情况下使用它,但它仍然没有什么区别,我最后确实说过!(无意冒犯),我尝试在没有任何影响的情况下将其全球化,因此我尝试使用globalvar
对其进行定义,并且懒得删除它选择这是一种可怕的尝试和组织方式。我会在Python中查找其他一些tic-tac-toe实现,并模仿它们@阿达米思我做了。。。他们都是垂直印刷电路板,所以我想我会解决这个问题,制作我自己的。。我被卡住了:(CounEngy强烈考虑将你的“插槽”打包为一个2D列表,名为“代码>板<代码>。请教我快速投掷并没有测试!):非常感谢!然而,在运行它之后,我收到了大量错误,说它是在成为全局之前定义的。。。。等待不。。仍然陷入困境:(嗯(评论你的编辑)它们需要分开,以便在按X和O键选择插槽时能够正确地相互作用。谢谢!但是,为什么它可以访问turn
变量,而不能访问游戏
函数外部的其他变量?您始终可以访问全局变量。只有在您还想分配t时才可以o从需要全局
语句的函数中读取变量。您可以在中阅读有关变量及其作用域的更多信息。
slot_options = {
"1": """
[X]
""",
"2": """
[X]
"""
...
}
slots = {}
slots[xturn] = slot_options[xturn]