Project1

标题: 玩游戏学脚本——rubywarrior [打印本页]

作者: taroxd    时间: 2014-7-29 19:08
标题: 玩游戏学脚本——rubywarrior
本帖最后由 taroxd 于 2014-7-29 19:43 编辑

这款游戏@余烬之中 推荐过(在此),但他所推荐的并不是完整版。

完整版在这里:https://github.com/ryanb/ruby-warrior
欢迎 Ruby 爱好者玩耍。

无论你刚学Ruby,还是已经学了一段时间,这款游戏都适合你!

我第一次玩这款游戏是在某次期末考试前无聊的时候,同学推荐给我这款游戏,然后我拿学校电脑玩的网页版(即余烬之中的链接)
当时我连 symbol 都不知道是什么,但是依旧勉强过了 Beginner 难度。代码写得极其丑陋不解释……

第二次是之后想要重温,就下载了 gem 版(即完整版)。这一次把游戏通关了,代码也写得漂亮了许多。
但是,有两关是依靠存在的敌人数目判断关卡数的,感觉有点作弊嫌疑呢……

然后是今天,突然脑洞大开想要把这款游戏移植RM(当然不一定会真的这么干),然后……忍不住又玩了一次……
这次的代码又比上次精简了许多许多……并且,战士的行动方式也不依赖于关卡了。

顺便附赠我 A 等级过 Intermediate Epic Mode 的代码(Ruby 2.0 环境):
RUBY 代码复制
  1. class Player
  2.   def play_turn(warrior)
  3.     @warrior = warrior
  4.     bind? || rest_before_detonation? || detonate? || rescue_ticking? ||
  5.     find_ticking? || attack? || rest? || rescue? || find_captive? ||
  6.     find_enemy? || walk_ahead!
  7.   end
  8.  
  9.   def bind?
  10.     dirs = enemy_dirs
  11.     dirs.size > 1 && (bind!(dirs[0]) || true)
  12.   end
  13.  
  14.   def rest_before_detonation?
  15.     health < 15 &&
  16.     enemy_dirs.empty? &&
  17.     directions.any? {|dir| look(dir).last(2).all?(&:enemy?) } &&
  18.     (rest! || true)
  19.   end
  20.  
  21.   def detonate?
  22.     return if listen.any? {|space| space.ticking? && distance_of(space) < 3 }
  23.     dir = directions.find {|d| look(d).first(2).all?(&:enemy?) }
  24.     dir && (detonate!(dir) || true)
  25.   end
  26.  
  27.   def rescue?
  28.     dir = captive_dirs[0]
  29.     dir && (rescue!(dir) || true)
  30.   end
  31.  
  32.   def attack?
  33.     dir = enemy_dirs[0]
  34.     dir && (attack!(dir) || true)
  35.   end
  36.  
  37.   def rescue_ticking?
  38.     dir = ticking_dirs[0]
  39.     dir && (rescue!(dir) || true)
  40.   end
  41.  
  42.   def rest?
  43.     health < 16 && !listen.empty? && (rest! || true)
  44.   end
  45.  
  46.   def walk_ahead!
  47.     walk! direction_of_stairs
  48.   end
  49.  
  50.   def directions
  51.     %i(left right forward backward)
  52.   end
  53.  
  54.   around_dirs = lambda do |proc|
  55.     -> { directions.select {|dir| proc.(feel(dir)) } }
  56.   end
  57.  
  58.   all_dirs = lambda do |proc|
  59.     -> { listen.select(&proc).map {|space| direction_of(space) } }
  60.   end
  61.  
  62.   find = lambda do |sym|
  63.     lambda do
  64.       dir = send(sym)[0]
  65.       ok_dirs = empty_dirs
  66.       ok_dirs.delete(:backward) if sym == :tickings
  67.       dir = ok_dirs[0] if dir && !ok_dirs.include?(dir)
  68.       dir && (walk!(dir) || true)
  69.     end
  70.   end
  71.  
  72.   define_method(:enemies, &all_dirs.(:enemy?.to_proc))
  73.   define_method(:captives, &all_dirs.(:captive?.to_proc))
  74.   define_method(:tickings, &all_dirs.(:ticking?.to_proc))
  75.   define_method(:enemy_dirs, &around_dirs.(:enemy?.to_proc))
  76.   define_method(:captive_dirs, &around_dirs.(:captive?.to_proc))
  77.   define_method(:ticking_dirs, &around_dirs.(:ticking?.to_proc))
  78.   empty = ->(space) { space.empty? && !space.stairs? }
  79.   define_method(:empty_dirs, &around_dirs.(empty))
  80.   define_method(:find_enemy?, &find.(:enemies))
  81.   define_method(:find_captive?, &find.(:captives))
  82.   define_method(:find_ticking?, &find.(:tickings))
  83.  
  84.   def method_missing(sym, *args)
  85.     @warrior.respond_to?(sym) ? @warrior.send(sym, *args) : super
  86.   end
  87. end

作者: 克莉丝    时间: 2014-7-29 19:10
我第一次玩这款游戏是在某次期末考试前无聊的时候,同学推荐给我这款游戏,然后我拿学校电脑玩的网页版(即余烬之中的链接)


你同学好厉害的样子
作者: maliut    时间: 2014-7-29 19:32
大触终归是大触……不管是本人还是同学

我同学怎么就没人听说过Ruby的
作者: satgo1546    时间: 2014-7-29 19:36
这个游戏确实很赞,只是好像我只过了前5关而已……
作者: kagamine_len    时间: 2014-7-29 19:36
只玩游戏不学行么
作者: 余烬之中    时间: 2014-7-29 19:40
gem版没怎么玩下去 就把网页版过了( ̄∇ ̄)
作者: 皮卡星    时间: 2014-7-29 19:49
好棒(*´д`)
还是第一次玩这种类型的游戏,奇妙的爽快感
再加上这种像素风格的,玩定了|д゚ )
作者: taroxd    时间: 2014-7-29 19:51
皮卡星 发表于 2014-7-29 19:49
好棒(*´д`)
还是第一次玩这种类型的游戏,奇妙的爽快感
再加上这种像素风格的,玩定了|д゚ ) ...

如果是 gem 版的话,就是命令行风格了= =
网页版才是像素风格

推荐 gem 版
作者: 无脑之人    时间: 2014-7-29 19:55
网页版果断打不开,一下午净折腾SublimeText了,最后果断决定不玩了——我又不是Ruby党
同学什么的,唉,只见过玩C++的和易语言的,各种竞赛没几个人参加,整天不是LOL就是刷贴吧,唉,生不逢地啊
作者: 冰水金刚    时间: 2014-7-29 20:05

无法运行怎么办
作者: taroxd    时间: 2014-7-29 20:08
本帖最后由 taroxd 于 2014-7-29 20:14 编辑
冰水金刚 发表于 2014-7-29 20:05
无法运行怎么办


http://rubyinstaller.org/downloads/ 下载一个安装包
直接下载地址:1.9版 2.0版

安装,中间有要打勾的全都勾上

打开命令行,输入 gem install rubywarrior

等待安装完成(如果安装失败,可能是因为 gem 服务器在国外的原因。过一段时间再试或者翻墙即可)

在命令行进入合适的路径(默认好像是我的文档),输入 rubywarrior

阅读该路径下的 README 文件(可以用记事本打开),游戏开始~
作者: 冰水金刚    时间: 2014-7-29 20:21
本帖最后由 冰水金刚 于 2014-7-29 20:36 编辑

[attach]255101[/attach]
还是不行{:2_270:} {:2_286:} {:2_254:}
[attach]255103[/attach]
然后这又是闹哪样,我是真心不懂
Level 1

You see before yourself a long hallway with stairs at the end. There is nothing in the way.

Tip: Call warrior.walk! to walk forward in the Player 'play_turn' method.

--------
|@      >|
--------

  > = Stairs
  @ = qwe (20 HP)


Warrior Abilities:

  warrior.walk!
    Move in the given direction (forward by default).


When you're done editing player.rb, run the rubywarrior command again.
这个又是做什么




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1