查看: 4291|回复: 11

[胡扯] 玩游戏学脚本——rubywarrior

[复制链接]

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-7-29 19:08:17 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 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 环境):
[pre lang="ruby" line="1"]class Player
  def play_turn(warrior)
    @warrior = warrior
    bind? || rest_before_detonation? || detonate? || rescue_ticking? ||
    find_ticking? || attack? || rest? || rescue? || find_captive? ||
    find_enemy? || walk_ahead!
  end

  def bind?
    dirs = enemy_dirs
    dirs.size > 1 && (bind!(dirs[0]) || true)
  end

  def rest_before_detonation?
    health < 15 &&
    enemy_dirs.empty? &&
    directions.any? {|dir| look(dir).last(2).all?(&:enemy?) } &&
    (rest! || true)
  end

  def detonate?
    return if listen.any? {|space| space.ticking? && distance_of(space) < 3 }
    dir = directions.find {|d| look(d).first(2).all?(&:enemy?) }
    dir && (detonate!(dir) || true)
  end

  def rescue?
    dir = captive_dirs[0]
    dir && (rescue!(dir) || true)
  end

  def attack?
    dir = enemy_dirs[0]
    dir && (attack!(dir) || true)
  end

  def rescue_ticking?
    dir = ticking_dirs[0]
    dir && (rescue!(dir) || true)
  end

  def rest?
    health < 16 && !listen.empty? && (rest! || true)
  end

  def walk_ahead!
    walk! direction_of_stairs
  end

  def directions
    %i(left right forward backward)
  end

  around_dirs = lambda do |proc|
    -> { directions.select {|dir| proc.(feel(dir)) } }
  end

  all_dirs = lambda do |proc|
    -> { listen.select(&proc).map {|space| direction_of(space) } }
  end

  find = lambda do |sym|
    lambda do
      dir = send(sym)[0]
      ok_dirs = empty_dirs
      ok_dirs.delete(:backward) if sym == :tickings
      dir = ok_dirs[0] if dir && !ok_dirs.include?(dir)
      dir && (walk!(dir) || true)
    end
  end

  define_method(:enemies, &all_dirs.(:enemy?.to_proc))
  define_method(:captives, &all_dirs.(:captive?.to_proc))
  define_method(:tickings, &all_dirs.(:ticking?.to_proc))
  define_method(:enemy_dirs, &around_dirs.(:enemy?.to_proc))
  define_method(:captive_dirs, &around_dirs.(:captive?.to_proc))
  define_method(:ticking_dirs, &around_dirs.(:ticking?.to_proc))
  empty = ->(space) { space.empty? && !space.stairs? }
  define_method(:empty_dirs, &around_dirs.(empty))
  define_method(:find_enemy?, &find.(:enemies))
  define_method(:find_captive?, &find.(:captives))
  define_method(:find_ticking?, &find.(:tickings))

  def method_missing(sym, *args)
    @warrior.respond_to?(sym) ? @warrior.send(sym, *args) : super
  end
end
[/pre]

点评

一个最简单的方法,上 http://rubyinstaller.org/ (可能部分时间会很慢,但是没有墙。当然翻墙可以保证速度)  发表于 2014-7-29 19:46
是我太傻了吗,再来问下,ruby怎么安装  发表于 2014-7-29 19:45
首先你要安装 Ruby,然后开始菜单->运行->cmd,就可以调出命令行了  发表于 2014-7-29 19:40
还是不懂,命令行在哪呢  发表于 2014-7-29 19:35
英文不怎么需要看懂。你只要看懂:在命令行打 gem install rubyinstaller 安装,打 rubywarrior 运行,然后生成的 README 都是很简单很少的英文,问题不大的  发表于 2014-7-29 19:31

评分

参与人数 5星屑 +233 收起 理由
kuerlulu + 29 打不过怎破
冰水金刚 + 4 最后4个
satgo1546 + 50 玩过
余烬之中 + 100 我很赞同
px.凤翔九天 + 50 默默给taroxd大触点赞....

查看全部评分

梦石
0
星屑
68
在线时间
585 小时
注册时间
2013-5-25
回帖
1484
发表于 2014-7-29 19:10:06 | 显示全部楼层
我第一次玩这款游戏是在某次期末考试前无聊的时候,同学推荐给我这款游戏,然后我拿学校电脑玩的网页版(即余烬之中的链接)


你同学好厉害的样子

点评

他进了数学国家集训队,物理国家集训队,计算机没进去主要原因是和时间上和数学冲突……  发表于 2014-7-29 19:12
回复

使用道具 举报

梦石
0
星屑
104
在线时间
1242 小时
注册时间
2010-6-30
回帖
544
发表于 2014-7-29 19:32:42 | 显示全部楼层
大触终归是大触……不管是本人还是同学

我同学怎么就没人听说过Ruby的
null
回复

使用道具 举报

梦石
0
星屑
660
在线时间
1286 小时
注册时间
2011-6-14
回帖
3949
发表于 2014-7-29 19:36:03 | 显示全部楼层
这个游戏确实很赞,只是好像我只过了前5关而已……
回复

使用道具 举报

梦石
0
星屑
50
在线时间
63 小时
注册时间
2014-7-28
回帖
288
发表于 2014-7-29 19:36:27 | 显示全部楼层
只玩游戏不学行么

点评

不学没法玩=。=  发表于 2014-7-29 19:40
回复

使用道具 举报

百合控

梦石
0
星屑
6548
在线时间
1275 小时
注册时间
2013-8-21
回帖
3522

开拓者

发表于 2014-7-29 19:40:46 | 显示全部楼层
gem版没怎么玩下去 就把网页版过了( ̄∇ ̄)

点评

网页版多不好玩= =  发表于 2014-7-29 19:41
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

星君

梦石
0
星屑
83
在线时间
2980 小时
注册时间
2011-10-9
回帖
2234

贵宾短篇七萝莉正太组冠军

发表于 2014-7-29 19:49:52 | 显示全部楼层
好棒(*´д`)
还是第一次玩这种类型的游戏,奇妙的爽快感
再加上这种像素风格的,玩定了|д゚ )

点评

其实,RM也可以算“这种类型的像素风格的游戏”,不是吗 kira☆~  发表于 2014-7-29 20:11

回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

 楼主| 发表于 2014-7-29 19:51:43 | 显示全部楼层
皮卡星 发表于 2014-7-29 19:49
好棒(*´д`)
还是第一次玩这种类型的游戏,奇妙的爽快感
再加上这种像素风格的,玩定了|д゚ ) ...

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

推荐 gem 版

点评

嗯,RM其实很多图块都不能算像素风格了,XP的还可以算,VX和VA开始就不能算了0 0  发表于 2014-7-29 20:16
回复

使用道具 举报

梦石
0
星屑
122
在线时间
552 小时
注册时间
2012-8-18
回帖
1392
发表于 2014-7-29 19:55:21 | 显示全部楼层
网页版果断打不开,一下午净折腾SublimeText了,最后果断决定不玩了——我又不是Ruby党
同学什么的,唉,只见过玩C++的和易语言的,各种竞赛没几个人参加,整天不是LOL就是刷贴吧,唉,生不逢地啊

点评

+1  发表于 2014-7-30 10:38
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复

使用道具 举报

梦石
0
星屑
170
在线时间
809 小时
注册时间
2013-8-23
回帖
773

开拓者

发表于 2014-7-29 20:05:44 | 显示全部楼层
1.png
无法运行怎么办

点评

你电脑装Ruby了吗/  发表于 2014-7-29 22:13
遗失的签名。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部