2014-09-25 37 views
0

我目前的工作,我们已经给出了创建我们自己的具有在形状的板游戏战略任务Python中的战舰项目被退回一个L(去除右上象限)。我的策略是,在选择棋步时,就像棋盘格效果,当它碰到船时,它会检查相邻的方格。我遇到的问题是,当函数返回时,它不再保留最后一次命中行和列号的值。回顾/记忆变量后,他们已经在一个函数中使用Python

我想知道如果有一种方法来记录当函数再次运行下次移动的行和列变量。

下面是代码包含我想要的代码运行下一次召回变量部分:

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

你不想存储在列表中的最后几个动作,然后将它传递给chooseMove()函数作为参数的原因吗? – ballsatballsdotballs 2014-09-25 16:20:11

+0

我会在每个回报前存储行和列的值吗? python会记住列表已经存储在列表中后,它已被返回,然后再次通过? – ThomasB2685 2014-09-25 17:26:21

回答

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,但不幸的是,这是不可能的。

+0

你真的是指“类方法”(使用@classmethod定义)吗?听起来更像你的意思方法。 – Anton 2014-09-25 16:30:22

+0

嗯,对不起坏措辞(不是母语)。 – hochl 2014-09-25 16:31:30

+0

无需道歉,感谢编辑。现在更清楚了。 – Anton 2014-09-25 16:33:05

相关问题