所以,我一直在制作一个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():
!
答案 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