我正在编写一个非常长的Canasta游戏程序,其中有一个变量,如果它等于某个值,则结束玩家的转弯。然而,转弯重演。
我在这样的论坛上阅读过很多不同的文章和帖子,但这些都没有。我甚至有一个调试系统在if语句之前打印变量的值,并且变量是正确的值,但if语句看不到相同的值。
我无法提供整个代码,因为它非常长,但我可以给出使用此变量的部分。我使用的是Python 2.7.2,无法将文件与要导入的主文件分开。
该计划的第一行是:
endTurn=1
当满足赢得游戏的条件时,会调用以下函数,但由于该错误,我无法测试这是否有效。
def winGame(player):
global endTurn
gameWinner=player
gameWinner["score"]+=100
endTurn=0
进行移动时会调用以下函数。变量decide
是raw_input()
变量。
def move(player,decide):
global endTurn
theMove=decide.lower()
#if player says to end turn
if theMove=="end":
#until player discards something
discarded=0
while not discarded:
displayHand(player)
#ask player for discard
discard=int(raw_input(" Enter the list number of the card you wish to discard:"))-1
#if discard ID is in player's hand length
if not discard<0 and not discard>len(player["hand"])-1:
#add card to discard pile and remove from hand
discardPile.append(player["hand"][discard])
del(player["hand"][discard])
discarded=1
debug("Before changing, endTurn is %s"%str(endTurn))
endTurn = 0
debug("After changing, endTurn is %s"%str(endTurn))
if theMove=="new book":
newBook(player)
if theMove=="add to book":
addBook(player)
这是转弯应该结束的地方。 turn(thePlayer)
重复该功能。 debug语句显示正确的值0,但if
仍然读取1.此函数的顶部有global endTurn
。
debug("If ending turn, endTurn of %s should be 0."%str(endTurn))
if endTurn==1:
turn(thePlayer)
非常感谢任何帮助!
编辑:代码可在http://labs.codecademy.com/CV9z#:workspace获得。我要求查看代码的任何人都不会修改它,以便其他人可以看到真正的代码。
答案 0 :(得分:0)
我修复了这个错误。我删除了endTurn
变量,而是使得结束转弯的功能只是转向下一个玩家。它还简化了我的代码。
我很想知道,使用这种方法在自身内部一遍又一遍地运行一个函数(不会离开)相当混乱或者可能会减慢我的程序?
编辑:我现在意识到这个答案并不能完全帮助那些陷入全局变量的人......
答案 1 :(得分:-3)
我发布的上一个答案是错误的,因为它是基于对我读过它们的命名空间文档的错误解释(感谢TheifMaster指出我的错误),所以这是一个严重的编辑答案:
问题是在我之前给出的错误答案之后发布整个代码的链接时,我能够读取的while循环。
while gameWinner==0:
endTurn=1
turn(player1)
if not gameWinner==0:
endTurn=1
turn(player2)
在gameWinner!= 0之前,游戏永远不会在这个循环中获得玩家2。 我将整个代码添加到我的沙盒中并将其更改为:
while gameWinner==0:
endTurn=1
turn(player1)
if gameWinner==0: #if player1 did not win yet
endTurn=1
turn(player2)
然而,游戏仍然是错误的...没有人能赢! winGame()函数不会全局更改gameWinner,直到您将其添加到我在此处显示的全局语句中。
def winGame(player):
global endTurn, gameWinner
gameWinner=player
gameWinner["score"]+=100
debug("gameWinner == " + str(gameWinner))
endTurn=0