首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序协同工作

程序协同工作
EN

Stack Overflow用户
提问于 2011-12-31 07:06:21
回答 1查看 72关注 0票数 1

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

我一直在想办法做到这一点,但这是我承担过的最大的编程项目,坦率地说,我还没有一个好主意。

两个玩家程序都应该定义一个主游戏调用的方法吗?我是否应该有一个Player类,并让player-Programms子类化它?我尝试了一些东西,但它似乎从来都不是我想要的,也不是什么可以被认为是像样的设计。

在Ruby (或任何其他语言,因为这是一个一般的编程问题)中,有什么好方法可以做到这一点呢?

我希望我能够正确地表达这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-31 07:41:25

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

代码语言:javascript
复制
ruby game.rb player1.rb Player1Class player2.rb Player2Class

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

代码语言:javascript
复制
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

使用这种方法,您只需编写一次核心游戏代码,即可使用任何一对player类启动它,而无需修改。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8684918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档