3

我在这样的方法中有一个循环:

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

然而,在每个循环开始时,应该更新的变量正在被重置。我的缩进似乎是正确的,所以我不确定问题是什么。它可以是可变范围吗?

谢谢你的帮助。

编辑:这是所有代码的pastebin:http: //pastebin.com/GjKA8yag

编辑:将所有代码添加到帖子中。以下是底部控制器代码应该发生的事情的概览:

初始化游戏,g. g有2个玩家,每个玩家都有一个位置,他们需要到达棋盘的末端才能获胜,棋盘长10个方格,他们可以一次移动1个或2个方格。

jump我们使用该方法来决定要移动多少个方格。该jump方法在其中创建了两个游戏,一个是游戏初始化为 player1 比他所在位置早 1 个方格,一个是游戏初始化为 player1 比他所在位置早 2 个方格。然后使用该方法随机完成这些游戏run,并返回一个值以查看谁赢得了该游戏(2对于 player2,1对于 player1)。

这是完成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,它现在可以工作了。

4

1 回答 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
于 2013-03-11T14:36:55.070 回答