while循环变量未更新
我在一个方法里有一个循环,代码大概是这样的:
from random import randint
class Player:
def __init__(self, position=0):
self.position = position
def move(self, move):
self.position += move
class Game:
def __init__(self, size=10, p1=1, p2=1):
self.size = size
self.p1 = Player()
self.p2 = Player()
def finished(self):
if self.p1.position >= self.size:
return True
if self.p2.position >= self.size:
return True
def run(self):
while True:
roll = randint(1,2)
self.p2.move(roll)
if self.finished():
break
roll = randint(1,2)
self.p1.move(roll)
if self.finished():
break
if self.p2.position >= self.p1.position: # if player 2 won return 2, else 1
return 2
else:
return 1
def jump(self, iterations):
move1, move2, i = 0,0,0
while i < iterations:
print(move1, move2) # move1 is 0 again
a = Game(self.size, self.p1.position+1, self.p2.position)
x = a.run()
print(x) # x is either 1 or 2, for the sake of testing
# it's been set to always 1
if x == 1:
move1 += 1
print(move1) # if move1 is incremented, it is shown here successfully
b = Game(self.size, self.p1.position+2, self.p2.position)
y = b.run()
if y == 1:
move2 += 1
i += 1
if move2 >= move1:
return 2
else:
return 1
human, comp, i = 0, 0, 0
times = 10
while i < times:
g = Game()
while True:
roll = g.jump(4)
g.p1.move(roll)
if g.finished():
human += 1
break
roll = g.jump(4)
g.p2.move(roll)
if g.finished():
comp += 1
break
i += 1
但是在每次循环开始的时候,本来应该更新的变量却被重置了。我检查过缩进,感觉没问题,所以不太确定问题出在哪里。会不会是变量的作用域问题呢?
谢谢你的帮助。
补充:这是我所有代码的链接:http://pastebin.com/GjKA8yag
补充:我把所有代码都加到帖子里了。下面是从控制器代码的运行流程:
初始化一个游戏,g
。g
有两个玩家,每个玩家都有一个位置,他们需要到达棋盘的尽头才能获胜,棋盘总共有10格,他们每次可以移动1格或2格。
为了决定移动多少格,我们使用jump
方法。这个jump
方法内部创建了两个游戏,一个是玩家1向前移动1格的情况,另一个是玩家1向前移动2格的情况。然后这两个游戏会随机完成,使用run
方法,并返回一个值来判断谁赢了这个游戏(2
代表玩家2赢,1
代表玩家1赢)。
这个过程会进行iterations
次,然后根据哪个游戏更成功,也就是最初是向前移动1格还是2格,决定在实际游戏g
中采取哪个移动。
打印语句的示例:
0 0
1
1
0 0
2
0
0 0
1
1
0 0
1
1
第一行是print(move1, move2)
,这是在while循环开始的时候。接着是print(x)
,这是从run()
方法返回的值,然后是print(move1)
,在它被增加之后。
我在Windows 8上运行的是Python 3.3 x64。
结果:切换到Python 2.7.3后,现在可以正常工作了。
1 个回答
1
def jump(self, iterations):
move1, move2, i = 0,0,0
while i < iterations:
print(move1, move2) # move1 is 0 again
a = Game(self.size, self.p1.position+1, self.p2.position)
x = a.run()
print("who won game a? : " + str(x)) # x is either 1 or 2, for the sake of testing
# it's been set to always 1
if x == 1:
move1 += 1
print("move 1 is: " + str(move1)) # if move1 is incremented, it is shown here successfully
b = Game(self.size, self.p1.position+2, self.p2.position)
y = b.run()
print("who won game b? : " + str(y))
if y == 1:
move2 += 1
print("move 2 is: " + str(move2))
i += 1
if move2 >= move1:
return 2
else:
return 1
human, comp, i = 0, 0, 0
times = 10
while i < times:
g = Game()
print("new game")
while True:
print("position of 1 is:" + str(g.p1.position))
print("position of 2 is:" + str(g.p2.position))
roll = g.jump(4)
print("first jump finished")
g.p1.move(roll)
if g.finished():
human += 1
break
roll = g.jump(4)
print("second jump finished")
g.p2.move(roll)
if g.finished():
comp += 1
break
i += 1
这是我修改的部分。我只是给你的代码加了打印语句。
这是输出结果。
请告诉我输出的哪一部分让你觉得不明白。
new game
position of 1 is:0
position of 2 is:0
(0, 0)
who won game a? : 2
move 1 is: 0
who won game b? : 2
move 2 is: 0
(0, 0)
who won game a? : 2
move 1 is: 0
who won game b? : 1
move 2 is: 1
(0, 1)
who won game a? : 1
move 1 is: 1
who won game b? : 1
move 2 is: 2
(1, 2)
who won game a? : 1
move 1 is: 2
who won game b? : 2
move 2 is: 2
first jump finished
(0, 0)
who won game a? : 1
move 1 is: 1
who won game b? : 2
move 2 is: 0
(1, 0)
who won game a? : 1
move 1 is: 2
who won game b? : 1
move 2 is: 1
(2, 1)
who won game a? : 2
move 1 is: 2
who won game b? : 2
move 2 is: 1
(2, 1)
who won game a? : 2
move 1 is: 2
who won game b? : 2
move 2 is: 1
second jump finished
position of 1 is:2
position of 2 is:1
(0, 0)
who won game a? : 1
move 1 is: 1
who won game b? : 2
move 2 is: 0
(1, 0)
who won game a? : 2
move 1 is: 1
who won game b? : 1
move 2 is: 1
(1, 1)
who won game a? : 1
move 1 is: 2
who won game b? : 2
move 2 is: 1
(2, 1)
who won game a? : 2
move 1 is: 2
who won game b? : 2
move 2 is: 1
first jump finished
(0, 0)
who won game a? : 1
move 1 is: 1
who won game b? : 2
move 2 is: 0
(1, 0)
who won game a? : 2
move 1 is: 1
who won game b? : 1
move 2 is: 1
(1, 1)
who won game a? : 1
move 1 is: 2
who won game b? : 2
move 2 is: 1
(2, 1)
who won game a? : 2
move 1 is: 2
who won game b? : 2
move 2 is: 1
second jump finished
position of 1 is:3
position of 2 is:2