一起工作的计划

时间:2011-12-30 23:06:21

标签: ruby

我正在用Ruby编写一个简单的命令行棋盘游戏。我需要拥有主游戏代码,然后是两个不同的人或团队将要编写的两个玩家的独立代码。因此主游戏需要允许不同玩家在不改变任何代码的情况下进行游戏。

我一直在考虑如何做到这一点,但这是我做过的最大的编程项目,坦率地说,我还没有好主意。

两个播放器程序都应该定义主游戏调用的方法吗?我应该有一个Player类并且让player-Programms子类吗?我尝试了一些东西,但它似乎永远不会是我正在寻找的东西或者甚至是体面的设计。

用Ruby(或任何其他语言,这个问题是一般的编程问题)这样做的好方法是什么?

我希望我能够正确地说出这个问题。

1 个答案:

答案 0 :(得分:3)

我会说子类方法听起来不错(在其他语言中,接口可能是更好的选择,但我不认为Ruby中存在接口)。每个玩家类必须实现的方法应该将包含整个游戏状态的对象(例如,如果你正在制作国际象棋时的棋子位置)作为参数。此对象必须是只读的或必须是游戏状态的副本,以便玩家类可能不会直接改变游戏状态。相反,玩家类必须实现的方法应该返回一些值,指示玩家希望做什么动作。我想Ruby支持一些机制,可以根据类和文件的名称从另一个文件动态实例化一个类。您可以像这样开始游戏,使用参数来指示文件和类名:

ruby game.rb player1.rb Player1Class player2.rb Player2Class

游戏可能看起来像这个伪代码:

gameState = createObjectDescribingInitialGameState()
player1FileName = args[0]
player1ClassName = args[1]
player2FileName = args[2]
player2ClassName = args[3]
player1 = dynamicallyInstantiateClassFromFile(player1ClassName, player1FileName)
player2 = dynamicallyInstantiateClassFromFile(player2ClassName, player2FileName)
currentPlayer = player1
while not gameState.isGameOver():
    move = currentPlayer.makeMove(gameState.createReadOnlyCopy())
    gameState.peformMove(move)
    currentPlayer = player2 if currentPlayer == player1 else player1

通过这种方法,您可以编写一次核心游戏代码并在不修改任何一对玩家类的情况下启动它。