RubyWarrior 在游戏中学习Ruby

无意中在V2EX看到了RubyWarrior这个网站,去玩了一下,实在是太有创意了。如果你想学习Ruby,又觉得只是看书有些枯燥,不妨试试这个网站。

一些闲扯

RubyWarrior,是把Ruby跟一个勇士闯关的游戏结合了起来,用你写的代码来控制勇士在每一轮中的动作,通过行走,砍怪来过关。想到这个创意,不由得让我想起了早些年IBM的一个开源项目:Robocode 其实相比Robocode,这个感觉要更简单一些。另外,我记得还看过斯坦福大学的公开课:《编程方法学》里面的那个教授,也做了一个用Java代码来控制机器人Karel来移动和探测周围的那个小程序,RubyWarrior的创意跟它比较类似,不过更加好玩!

开始你的冒险之旅

说了这么多,到底好玩在什么地方呢?不如先来介绍一下:

进入网站,会首先让你创建一名勇士,可以由你来自己命名,改好名字后,勇士的冒险即将开始了……

点击“GO WARRIOR”后,会进入游戏的主界面,游戏的主界面分为几个部分:

最上面,是游戏的动画图形界面

勇士默认出场后,有20点生命值,收到攻击后会减少,绿色的是怪物,最后是楼梯,通往下一关。

当然,图中的已是第二关的画面,第一关是没有怪物的。

游戏的左下角部分,包括了勇士的一些技能和动作介绍,其实也就是API了,你能在程序代码中调用这些方法,来实现勇士的各种动作,包括移动,攻击,休息,探测前方,等等。

勇士的动作相关API:

warrior.walk! 用来控制勇士的移动,默认方向是往前

warrior.feel 使用勇士来感知前方的情况,比如是空格,还是有怪

warrior.attack! 让勇士对怪物进行攻击

warrior.health 获取勇士当前的生命值

warrior.rest! 让勇士休息一回合,恢复最大生命值的10%

####勇士的感知API:####

space.empty? 感知前方是否是空格

space.stairs? 感知前方是否是楼梯

space.enemy? 感知前方是否有怪物

space.captive? 感知前方是否有俘虏

space.wall? 感知前方是否是墙壁

游戏的简单规则

当然是砍怪和过关…… 在杀掉怪物和解救俘虏后,能得到一定的分数。另外,你得充分运用每一关的地形和不同的策略,修改程序,让勇士不死,并且能杀掉所有的怪物,然后过关。

开始编写程序

在游戏的画面中,编写程序的界面,也占了不少的地方,当然,勇士的一举一动,跟你写的代码有密切的关系。要是代码写得不好,那可是人命关天的,勇士很可能因为你代码的一个小bug而牺牲了,哈哈……

1
2
3
4
5
class Player
def play_turn(warrior)
# cool code goes here
end
end

默认的代码窗口,非常简单,定义了一个叫做Player的类,当然就是玩家自己了。里面有个play_turn的方法,传入参数是个warrior的实例,这个实例,就是游戏中的那个勇士了!

通过对warrior这个实例的方法调用,我们就可以让勇士来闯关了。

比如,我们写入下面的示范代码:

1
2
3
4
5
6
7
8
9
10
11
class Player
def play_turn(warrior)
# cool code goes here

if warrior.feel.enemy?
warrior.attack!
elsif warrior.feel.empty?
warrior.walk!
end
end
end

代码的大致意思:让勇士探索前面的一个方格,如果是空,就往前走,如果遇到怪物,就一顿狂扁……

这里需要注意的是:游戏是采用回合制的,意思就是在每一个回合中,play_turn方法都会被调用一次,跟其他的回合制游戏类似,在一个回合中,你只能让勇士做出一种动作,在我们的示例程序里面,要么往前走,要么砍怪。如果你在一个回合里面让勇士做出了一个以上的动作,程序会报错,并且这一关就失败了,得重来……

好了,程序代码也写好了,点击右上角的“RUN!”按钮,让勇士踏上征程吧!

游戏界面上,还有一个信息输出的界面,会显示当前进行到每一个回合的信息,包括怪物丢失的生命值,和勇士被怪物攻击后丢失的生命值,各种信息,都一并在这里输出了!

游戏大致介绍完了,怎么带领勇士通关,还是得运用你的智慧和技巧了……

不得不说,这实在是一个挺有创意的项目!另外,项目还是开源的,放在Github上:https://github.com/ryanb/ruby-warrior 有兴趣还可以去clone一个来研究研究!

支持原创技术分享,据说打赏我的人,都找到了女朋友!