在Python中的函数中返回变量后,调用/记住变量

时间:2014-09-25 16:13:45

标签: python

我目前正在使用Python的Battleships项目,我们的任务是创建我们自己的游戏策略,其中有一个L形状的棋盘(移除右上象限)。在选择动作时,我的策略就像一个棋盘效果,当它击中一艘船时会检查相邻的方块。我遇到的问题是,当函数返回时,它不再保留最后一次命中的行和列号的值。

我想知道是否有办法记录行和列变量,以便在下次移动时再次运行该函数。

以下是包含我想在下次运行代码时调用的变量的代码部分:

def chooseMove():

    global playerBoard, opponentBoard

    row = int()
    col = int()

    if (opponentBoard[row][col] == const.HIT):
    row = row - 1
        if (opponentBoard[row][col] == const.MISSED) or (opponentBoard[row][col] == const.HIT) or (opponentBoard[row] < 0):
        row = row + 1
            if (opponentBoard[row][col] == const.MISSED) or (opponentBoard[row][col] == const.HIT) or ((opponentBoard[row] > 5) and (opponentBoard[col] < 6)):
            col = col - 1
                if (opponentBoard[row][col] == const.MISSED) or (opponentBoard[row][col] == const.HIT) or (opponentBoard[col] < 0):
                col = col + 1
                    if (opponentBoard[row][col] == const.MISSED) or (opponentBoard[row][col] == const.HIT) or ((opponentBoard[row] > 5) and (opponentBoard[col] < 6)):
                        while (opponentBoard[row][col] == const.HIT) or (opponentBoard[row][col] == const.MISSED) or ((row + col) % 2 == 1):
                            row = randint(0,len(opponentBoard)-1)
                            col = randint(0,len(opponentBoard[row])-1)
                        else:
                            return row, col
                    else:
                        return row, col 
                else:
                    return row, col
            else:
                return row, col
        else:
            return row, col
    else: 
        while (opponentBoard[row][col] == const.HIT) or (opponentBoard[row][col] == const.MISSED) or ((row + col) % 2 == 1):
            row = randint(0,len(opponentBoard)-1)
            col = randint(0,len(opponentBoard[row])-1)
        else:
            return row, col

1 个答案:

答案 0 :(得分:0)

您可以向chooseMove()函数添加一个参数,其中包含您已经测试过的位置。或者,您可以将代码转换为类的方法,并使用记住位置的类实例,然后释放全局变量。或者您可以使用闭包来存储方法的状态:

#!/usr/bin/env python
def make_function(x):
    my_var = [x]
    def my_function(a):
            print a + my_var[0]
            my_var[0] += 1
    return my_function

fct = make_function(15)
for i in xrange(10):
    fct(10)

输出:

25
26
27
28
29
30
31
32
33
34

如本例所示,返回的函数保持内部状态。见closures in Python。这样,您就可以避免编写自定义类或使用移动数据传递数据集。这会将您的实施隐藏到外部世界,并且外部的任何人都不必关心附加参数。

您可以使用任何其他可变对象,如字典或自定义类,而不是列表。在Python3中,您可以将任何内容与nonlocal关键字一起使用,但不幸的是,使用Python 2.x这是不可能的。