我目前正在使用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
答案 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这是不可能的。