while循环变量未更新

3 投票
1 回答
1412 浏览
提问于 2025-04-17 18:41

我在一个方法里有一个循环,代码大概是这样的:

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

补充:我把所有代码都加到帖子里了。下面是从控制器代码的运行流程:

初始化一个游戏,gg有两个玩家,每个玩家都有一个位置,他们需要到达棋盘的尽头才能获胜,棋盘总共有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

撰写回答