懐かしのコードゲーム、Ruby Warrior はいいぞ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/706d5479-361b-0dd0-aa31-56bc0479ce05.png)

[サイトはここ](https://www.bloc.io/ruby-warrior#/)

# Ruby Warrior

- 勇者を `ruby` コードで操って、レベルをクリアしていくゲーム
- [オリジナル](https://github.com/ryanb/ruby-warrior)は `Rogue` みたいな見た目のテキストゲームで `ryanb` さん作。10年くらい前に公開
- オリジナルを [Bloc](https://www.bloc.io/) が [Web ゲームにした](https://www.bloc.io/ruby-warrior#/)ようだ。 **Good Job!** 

# ルール

- コードの中の `def play_turn(warrior) ... end` の部分が1ターンで、ここにコードを書く
- ターンを繰り返して、敵を倒しながら、脱出すればよい
- 1ターンで1回しか `warrior.action!` できない（ターン内でループの処理もできない）[^1]
- レベルが進むごとにスキル `warrior.action!` が増えていく
- 初心者モードと中級者モードがある（今回は初心者モードでやってみた）

[^1]: `Only one action can be performed per turn.` のエラーがでる

## Level 1

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

```ruby
class Player
  def play_turn(warrior)
    # cool code goes here
    warrior.walk!
  end
end
```
#### このレベルの見所： 楽しく歩く :walking: 


## Level 2

> *It is too dark to see anything, but you smell sludge nearby.*

```ruby
class Player
  def play_turn(warrior)
    if warrior.feel.empty?
      warrior.walk!
    else
      warrior.attack!
    end
  end
end
```
#### このレベルの見所： 初めての敵 :dragon_face: 
- `warrior.attack!` を獲得


## Level 3

> *The air feels thicker than before. There must be a horde of sludge.*

```ruby
class Player
  def play_turn(warrior)
    if warrior.feel.empty?
      if warrior.health < 15
        warrior.rest!
      else
        warrior.walk!
      end
    else
      warrior.attack!
    end
  end
end
```

#### このレベルの見所： 休む時は休む :sleeping_accommodation: 
- `warrior.rest!` を獲得

## Level 4

> *You can hear bow strings being stretched.*


```ruby
class Player
  def play_turn(warrior)
    @health = warrior.health unless @health
    if warrior.feel.empty?
      if @health <= warrior.health && warrior.health < 12
        warrior.rest!
      else
        warrior.walk!
      end
    else
      warrior.attack!
    end
    @health = warrior.health
  end
end
```

#### このレベルの見所： 体調管理 :bed: 
- `warrior.health` を獲得


# Level 5

> *You hear cries for help. Captives must need rescuing.*

```ruby
class Player
  def play_turn(warrior)
    @health = warrior.health unless @health
    if warrior.feel.captive?
      warrior.rescue!
    elsif warrior.feel.empty?
      if @health <= warrior.health && warrior.health < 13
        warrior.rest!
      else
        warrior.walk!
      end
    else
      warrior.attack!
    end
    @health = warrior.health
  end
end
```

#### このレベルの見所： 敵か味方か？ :lock:
- `warrior.rescue!` を獲得


# Level 6 

> *The wall behind you feels a bit further away in this room. And you hear more cries for help.*

```ruby
class Player
  
  def initialize()
    @captive = true
  end
  
  def play_turn(warrior)
    @health = warrior.health unless @health
    if @captive
      if warrior.feel(:backward).captive?
        warrior.rescue!(:backward)
        @captive = false
      else
        warrior.walk!(:backward)
      end
    else
      if warrior.feel.empty?
        if @health > warrior.health && warrior.health < 10
          warrior.walk!(:backward)
        elsif @health <= warrior.health && warrior.health < 20
          warrior.rest!
        else
          warrior.walk!
        end
      else
        warrior.attack!
      end
      @health = warrior.health
    end
  end
  
end
```

#### このレベルの見所： ヒット ＆ アウェイ  :back: 


`captive` がいるかどうかをフラグでもっておいてそれで処理を変えようとしていろいろうまくいかなかったが、最終的に `initialize()` に書いてうまくいった


# Level 7

> *You feel a wall right in front of you and an opening behind you.*

```ruby
class Player
  def play_turn(warrior)  
    @health = warrior.health unless @health
    if warrior.feel.wall?
      warrior.pivot!
    else
      if warrior.feel.empty?
        if @health > warrior.health && warrior.health < 10
          warrior.walk!(:backward)
        elsif @health <= warrior.health && warrior.health < 20
          warrior.rest!
        else
          warrior.walk!
        end
      else
        warrior.attack!
      end
    end
    @health = warrior.health
  end  
end
```

#### このレベルの見所： 振り向けば、いつかみた風景
- `warrior.pivot!` を獲得

# Level 8

> *You hear the mumbling of wizards. Beware of their deadly wands! Good thing you found a bow.*

```ruby
class Player
  
  def initialize()
    @captive = true
  end
  
  def play_turn(warrior)
    @health = warrior.health unless @health
    if @captive
      if warrior.feel.captive?
        warrior.rescue!
        @captive = false
      else
        warrior.walk!
      end
    else
      if warrior.look.any?{|s| s.enemy?}
        warrior.shoot!
      else
        warrior.walk!
      end
    end
  end  
  
end
```

#### このレベルの見所： 遠いもんがちー　:bow_and_arrow: 


- `warrior.look` と `warrior.shoot!` を獲得
- ウィザードっぽいのが遠隔から一撃で `11` くらいライフ削ってくるので、二発くらうと死ぬ...　でも意外とレンジは短い
- `any?` のおかげでスッキリかけたのではないか



# Level 9

> *Time to hone your skills and apply all of the abilities that you have learned.*



```ruby
class Player

  def initialize()
    @left_captive = true
  end

  def play_turn(warrior)
    if @left_captive
      if warrior.look(:backward).any?{|s| s.enemy?}
        warrior.shoot!(:backward)
      elsif warrior.feel(:backward).captive?
        warrior.rescue!(:backward)
        @left_captive = false
      else
        warrior.walk!(:backward)
      end
    else
      if warrior.look.any?{|s| s.enemy?}
        warrior.shoot!
      elsif warrior.feel.captive?
        warrior.rescue!
      elsif warrior.feel.wall?
        warrior.pivot!
      else
        warrior.walk!
      end
    end
  end
  
end


```

#### このレベルの見所： ムーンウォーク :walking_tone2: :bow_and_arrow: 

- めっちゃ弓だけに頼った勝ち方！後ろ向きで矢を放ち、一回も `warrior.rest!` しない無鉄砲野郎。学んだことを使っていない。こんなんでいいのか？

# Ruby Warrior になろう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/0411f940-e622-76d8-650f-770c67e00834.png)

もっといいコードがあったら教えてください！