我正在尝试开发一个使用Python的游戏的AI。因此,我有一个类"Game“和一个类"AI”。
我想在AI中使用Game的变量(例如Game的棋盘),但我不确定最好的方法是什么。现在,我发现将信息从游戏传递到AI的唯一方法是每次都将其作为参数。我觉得有一种更好的方法可以与AI共享变量,而不需要每次都进行争论。
我会做一些类似的事情(我知道这段代码不能工作,但仍然如此):
class Game():
def __init__(self):
self.board = 1 #It will be an array
self.ai = AI(self.board)
def functionThatUpdateTheBoard(self):
self.board = 2
def useTheAI(self):
print(self.board)
self.ai.getAction()
class AI():
def __init__(self,board):
self.board = board
print(self.board)
def getAction(self):
print(self.board)
game = Game()
game.functionThatUpdateTheBoard()
game.useTheAI()并获得:
1
2
2感谢您的帮助:)
发布于 2019-09-03 16:42:47
看看是否可以使用观察者模式。
例如,当"board“改变Game类中的值时,创建订阅者并调用。如果一个类需要"board“的更新值,他们可以订阅,这会在"board”的值发生变化时触发。
这样,无论所使用的数据类型是不变的,您都可以非常确定值是否会被更改。
class Game(object):
def __init__(self):
self.board = 1
self.observers = []
def functionThatUpdateTheBoard(self, new_value):
# you can change this to setter ,
# refer https://www.tutorialspoint.com/What-are-Getters-Setters-methods-for-Python-Class
self.board = new_value
for fn in self.observers:
fn(self.board) # send your board value here.
def subscribe(self, callback):
self.observers.append(callback)
class AI(object):
def game_board_value_changed(self, value):
print("Printing value in AI class")
print("Value of 'board' changed in Game class to {}".format(value))
game = Game()
ai = AI()
game.subscribe(ai.game_board_value_changed)
print("*"*50)
modified_value = 10
print("Board value changed in Main to {}".format(modified_value))
game.functionThatUpdateTheBoard(modified_value)
print("*"*50)
modified_value = 100
print("Board value changed in Main to {}".format(modified_value))
game.functionThatUpdateTheBoard(modified_value)
print("*"*50)
**************************************************
Board value changed in Main to 10
Printing value in AI class
Value of 'board' changed in Game class to 10
**************************************************
Board value changed in Main to 100
Printing value in AI class
Value of 'board' changed in Game class to 100
**************************************************https://stackoverflow.com/questions/57767653
复制相似问题