ruby - 程序一起工作

标签 ruby

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

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

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

在 Ruby(或任何其他语言,因为问题是一般编程问题)中执行此操作的好方法是什么?

我希望我能够正确地表述问题。

最佳答案

我认为子类方法听起来不错(在其他语言中,接口(interface)可能是更好的选择,但我认为 Ruby 中不存在接口(interface))。每个玩家类必须实现的方法应该将包含整个游戏状态的对象作为参数(例如下棋时的棋子位置)。这个对象必须是只读的或者必须是游戏状态的副本,这样玩家类就不能直接改变游戏状态。相反,玩家类必须实现的方法应该返回一些值,指示玩家希望做什么 Action 。我想 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

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

关于ruby - 程序一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8684918/

相关文章:

ruby - 在 net-ldap for Ruby 中搜索 "Enabled"用户

java - 是否有用于生成 MOBI 电子书文档的 Java 或 Ruby 库?

html - 如何使用 gem htmltoword 在 Rails 中放置页眉和页脚?

Ruby:4 字节数组到 int32

ruby-on-rails - 如何将新哈希插入到 ruby​​ 中的现有哈希中

Ruby 注入(inject)函数

ruby-on-rails - ActiveRecord:除非另有说明,否则在保存之前使所有文本字段都调用 strip

ruby-on-rails - 对 Rails 中的对象集合进行排序?

ruby-on-rails - 如何运行sqlplus centOS?

ruby - 如何使用 PUBMEDid 从 pubmed 中获取摘要