制作Noughts and Crosses / Tic Tac Toe游戏时定义之前引用的变量

时间:2015-09-23 17:33:48

标签: python python-3.x python-3.4

所以,我一直在制作一个Xs和Os游戏,作为Python 3.4中的一个副项目,我遇到了一个问题。虽然它有效但它不能保存电路板,因为我必须在def game():

中定义插槽

如果我在def game():之外定义了广告位,即使我将它们全球化,也会出现错误slot 1(等)referenced before definition或其他内容。 这是我的代码到目前为止,因为我想要一个循环,我必须把游戏放在def game():

from time import sleep


gameboard = """
[1]
   [2]
      [3]
[4]
   [5]
      [6]
[7]
   [8]
      [9]
"""
print ("Welcome to Noughts and Crosses")
print ("The gameboard looks like this")
print (gameboard)


turn = (0)

def globalvar():
    global slot1
    global slot2
    global slot3
    global slot4
    global slot5
    global slot6
    global slot7
    global slot8
    global slot9
    global slotkeeper
    global slotkeeper1

globalvar()


global slotkeeper1
slotkeeper = (1)

def game():
    print ("Turn" ,turn + 1)
    xturn = input("X, please type a number where you want to place your marker")
    if xturn == ("1"):
        slot1 = """
[X]
    """
    elif xturn == ("2"):
        slot2 = """
    [X]
    """
    elif xturn == ("3"):
        slot3 = """
        [X]
    """
    elif xturn == ("4"):
        slot4 = """
[X]
"""
    elif xturn == ("5"):
        slot5 = """
    [X]
    """
    elif xturn == ("6"):
        slot6 = """
        [X]
    """
    elif xturn == ("7"):
        slot7 = """
[X]
    """
    elif xturn == ("8"):
        slot8 = """
    [X]
    """
    elif xturn == ("9"):
        slot9 = """
        [X]
    """
    oturn = input("O, please type a number where you want to place your marker")
    if oturn == ("1"):
        slot1 = """
[O]
    """
    elif oturn == ("2"):
        slot2 = """
    [O]
    """
    elif oturn == ("3"):
        slot3 = """
        [O]
    """
    elif oturn == ("4"):
        slot4 = """
[O]
    """
    elif oturn == ("5"):
        slot5 = """
    [O]
    """
    elif oturn == ("6"):
        slot6 = """
        [O]
    """
    elif oturn == ("7"):
        slot7 = """
[O]
    """
    elif oturn == ("8"):
        slot8 = """
    [O]
    """
    elif oturn == ("9"):
        slot9 = """
        [O]
    """

    while slotkeeper == (1):
        slot1 = """
[1]
"""
        slot2 = """
    [2]
"""
        slot3 = """
         [3]
"""
        slot4 = """
[4]
"""
        slot5 = """
    [5]
"""
        slot6 = """
         [6]
"""
        slot7 = """
[7]
"""
        slot8 = """
    [8]
"""
        slot9 = """
         [9]
"""
        slotkeeper = (0)

    sleep (0.6)    
    print (slot1, slot2, slot3)
    print (slot4, slot5, slot6)
    print (slot7, slot8, slot9)



def game2():
    sleep (0.6)
    slotkeeper = (0)
    game()

def gamefinal():
    game()
    game2()


gamefinal() 

如果你运行它,你会看到我的问题是什么,因为我需要在while的主要定义game()内进行while cond1 == (1)循环 所以基本上,当一个条件成立时槽仍然保持这种状态,否则它将不会在转弯之间保存板,并且我无法在主cond1之外定义def game():,或者甚至是槽没有在定义之前引用的错误,即使我将它们全局化。

如果我将插槽的主要定义放在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循环放在它上面,它就会停止,保持不变,在print (gameboard)之后,它什么也没做,显然程序仍然在运行,因为它是,因为while循环必须为true,或者后面有else语句,这不起作用,只是打破它!

编辑:我尝试在括号内的slotkeeper = ("1")周围使用引号,并将while slotkeeper == (1):更改为while slotkeeper == ("1"),但仍然没有变化。 d: 编辑编辑:它确实有所作为,但它没有收到错误信息,它只是卡住了,即使我已将全局化变量slotkeeper并将其设置为("1"),并且在{ {1}}之后我将其设为def game2():

2 个答案:

答案 0 :(得分:2)

你严重误解了Python global语句的工作原理。您不要使用它来声明全局变量。没有必要声明任何内容,在模块顶层进行的任何赋值都会创建一个全局变量。

相反,您可以在希望能够修改函数外部定义的变量的函数中使用它。因此,将global函数中当前拥有的globalvar语句移动到game函数中(他们没有做任何有用的事情)。这将使您在game中的代码修改全局变量(并避免您获得的异常)。

请注意,使用全局变量通常是设计不佳的症状。当你拥有它们时,尤其如此,正如你现在在程序中所做的那样。作为更好设计的开始,我强烈建议使用列表或其他数据结构来保存您的电路板数据,而不是一堆单独的变量。

答案 1 :(得分:0)

我们使用global关键字来访问全局变量,而不是声明它。 Python是一种动态语言,无论如何,变量的声明都没有多大意义。

其次,为什么你还需要这么多的全局变量。我相信你可以找到其他优雅的方式。

第三,请不要使用这么多if / elif语句,而是使用dict,这将更加pythonic -

slot_options = {
     "1": """
     [X]
     """,
     "2": """
         [X]
     """
     ...
}

slots = {}
slots[xturn] = slot_options[xturn]

这些方面的东西。

第四,所有这些“图纸”代表“X”位置是什么。

我建议,检查一些当前实现的代码,然后制作自己的代码。它可能会给你一些指示。你可以看看这个 - Sample tic tac toe gist