Ruby Warrior —— 用游戏学习Ruby (附全部关卡代码)


游戏地址:

https://www.bloc.io/ruby-warrior


今天发现了这个好玩的游戏,一下午通关。

BGM很洗脑,嗯。


Level 1

# 方法调用
class Player
  def play_turn(warrior)
    warrior.walk!
  end
end

Level 2

# if-else表达式
class Player
  def play_turn(warrior)
    if warrior.feel.enemy?
      warrior.attack!
    else
      warrior.walk!
    end
  end
end

Level 3

# if-elsif-else表达式
# 注意play_turn是每回合执行一次,所以先战斗,再回满血,再前进
class Player
  def play_turn(warrior)
    if warrior.feel.enemy?
      warrior.attack!
    elsif warrior.health < 20
      warrior.rest!
    else
      warrior.walk!
    end
  end
end

Level 4

# 注意到每回合是先执行play_turn再执行enemy_turn,
# 所以先用一个字符串@lastHP来存储warrior进行一次行动后的血量,
# 若下一回合发现血量减少,则在enemy_turn warrior必定受到了伤害
class Player
  def play_turn(warrior)
    if warrior.feel.enemy?
      warrior.attack!
    elsif warrior.health < @lastHP.to_i
      warrior.walk!
    elsif warrior.health < 20
      warrior.rest!
    else
      warrior.walk!
    end
    @lastHP = warrior.health
  end
end


Level 5

# 先杀怪,再救人,在上一关的基础上加一句话即可
class Player
  def play_turn(warrior)
    if warrior.feel.enemy?
      warrior.attack!
    elsif warrior.health < @lastHP.to_i
      warrior.walk!
    elsif warrior.health < 20
      warrior.rest!
    elsif warrior.feel.captive?
      warrior.rescue!
    else
      warrior.walk!
    end
    @lastHP = warrior.health
  end
end

Level 6

# 先救人,杀一个怪后回到最左休息,然后一路向右
class Player
  def play_turn(warrior)
    if @ok
      if warrior.feel.enemy?
        warrior.attack!
        @attack=true # kill a monster
      else
        if @attack and !@fullHP and !(warrior.feel:backward).wall?
          warrior.walk!:backward # back to left to rest
        elsif (warrior.feel:backward).wall? and warrior.health < 20
          warrior.rest!
          @fullHP = true
        else
          warrior.walk!
        end
      end
    else
      if (warrior.feel:backward).captive?
        warrior.rescue!:backward
        @ok = true
      else
        warrior.walk!:backward
      end 
    end
  end
end

Level 7

#在上一关的基础上转个身即可
class Player
  def play_turn(warrior)
    if warrior.feel.wall?
      warrior.pivot!
    else
      if warrior.feel.enemy?
        warrior.attack!
        @attack=true # kill a monster
      else
        if @attack and !@fullHP and !(warrior.feel:backward).wall?
          warrior.walk!:backward # back to left to rest
        elsif (warrior.feel:backward).wall? and warrior.health < 20
          warrior.rest!
          @fullHP = true
        else
          warrior.walk!
        end
      end
    end
  end
end

Level 8

# 可以使用数组了
# 先救人,在射箭
class Player
  def play_turn(warrior)
	if @ok
	  if warrior.look[0].enemy? or warrior.look[1].enemy? or warrior.look[2].enemy?
		warrior.shoot!
      else
        warrior.walk!
	  end
	else
	  if warrior.feel.captive?
        warrior.rescue!
		@ok = true
      else
        warrior.walk!
	  end
    end
  end
end

Level 9

# 转身射怪,转身射两怪,救人,转身,救人
# 使用case-when实现
class Player
  def play_turn(warrior)
    case @cnt.to_i
    when 0
	  warrior.pivot!
	  @cnt = 1
    when 1
	  if warrior.look[0].enemy? or warrior.look[1].enemy? or warrior.look[2].enemy?
		warrior.shoot!
	  else
	    @cnt = 2
	  end
	when 2
	  warrior.pivot!
	  @cnt = 3
	when 3
	  if warrior.look[0].enemy? or warrior.look[1].enemy? or warrior.look[2].enemy?
		warrior.shoot!
	  elsif warrior.feel.captive?
	    warrior.rescue!
		@cnt = 4
	  else
	    warrior.walk!
	  end
	when 4
	  warrior.pivot!
	  @cnt = 5
	when 5
	  if warrior.feel.captive?
	    warrior.rescue!
	  else
	    warrior.walk!
	  end
	end
  end
end

貌似还有后续关卡。。。

https://github.com/ryanb/ruby-warrior

使用方法见

http://qichunren.iteye.com/blog/383938

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的MC9S12ZVL32 PWM生成器的代码示例。这个示例使用了一个输出模拟信号来控制PWM输出的占空比。 ```c #include <hidef.h> #include "derivative.h" // 定义PWM占空比的范围 #define PWM_MAX 1000 #define PWM_MIN 0 // 定义PWM周期 #define PWM_PERIOD 20000 // 20ms // 定义模拟信号输出的最大值和最小值 #define ANALOG_MAX 1023 #define ANALOG_MIN 0 // 定义用于计算PWM占空比的变量 unsigned int pwm_duty = PWM_MIN; // 定义用于计算模拟信号输出值的变量 unsigned int analog_value = ANALOG_MIN; // 定义用于定时的变量 unsigned int timer_counter = 0; void main(void) { // 初始化系统时钟 PLLCTL = 0x40; SYNR = 0x02; REFDV = 0x00; while(!(CRGFLG & 0x08)); CLKSEL = 0x80; PLLCTL &= ~0x40; // 配置PWM输出引脚 DDRB |= 0x01; // 配置模拟信号输出引脚 DDRP |= 0x80; // 初始化定时器 TSCR1 = 0x80; TSCR2 = 0x04; // 设置PWM周期 PWMPER0 = ((unsigned int)(PWM_PERIOD/4)) & 0xFF; PWMPER1 = ((unsigned int)(PWM_PERIOD/4)) >> 8; // 设置PWM占空比 PWMDTY0 = ((unsigned int)(pwm_duty/4)) & 0xFF; PWMDTY1 = ((unsigned int)(pwm_duty/4)) >> 8; // 启用PWM模块 PWMCLK = 0x01; PWME = 0x01; // 主循环 for(;;) { // 每隔1ms更新一次PWM占空比和模拟信号输出值 if (timer_counter >= 1000) { timer_counter = 0; // 更新PWM占空比 pwm_duty += 10; if (pwm_duty > PWM_MAX) { pwm_duty = PWM_MIN; } PWMDTY0 = ((unsigned int)(pwm_duty/4)) & 0xFF; PWMDTY1 = ((unsigned int)(pwm_duty/4)) >> 8; // 更新模拟信号输出值 analog_value += 10; if (analog_value > ANALOG_MAX) { analog_value = ANALOG_MIN; } ATD0CTL5 = 0x80; while(!(ATD0STAT0 & 0x80)); PORTP = (unsigned char)(analog_value/4); } // 等待定时器溢出 while(!(TFLG1 & 0x01)); TFLG1 = 0x01; // 更新定时器计数器 timer_counter++; } } ``` 这个代码示例使用了ATD模块来生成模拟信号输出,以便在PWM输出上产生模拟控制信号。如果你不需要模拟信号输出,可以将相关代码删除。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值