Python 在进行零和交叉/井字游戏时,定义前引用的变量

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==(

因此,我一直在制作一个Xs和Os游戏,作为Python3.4中的一个辅助项目,我遇到了一个问题。虽然它可以工作,但不会保存棋盘,因为我必须在
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]