Ruby Warrir 回答メモ

![2018-01-16_17h56_09.png](https://qiita-image-store.s3.amazonaws.com/0/63060/7fa13a5a-e676-3502-7fba-6a57740a0bd8.png)


##memo
###アクション
>- warrior.walk! 進む　warrior.walk!(:backward) 下がる
>- warrior.feel! 前のマスを調べる
>- warrior.attack! 前のマスに攻撃(1回で5のダメージ)
>- warrior.rest! 1ターン休む(1回で2の回復)

###変数
>- warrior.health 今の体力値を返す

###マスの種類
>- space.empty? 何もない
>- space.stairs? 階段
>- space.enemy? 敵
>- space.captive? 捕虜
>- space.wall? 壁
>- space.ticking? 爆弾

###敵キャラ

|NAME|名前|体力|攻撃力|射程|
|:--|:--|:--|:--|:--|
|?|ごぶりん|15|5|1|
|thicksludge|スライム|24|5|1|
|archer|アーチャー|7|3|3|
|wizard|魔法使い|3|11|2|

---

##初級-1
とりあえず、ただ歩くだけだぞ！
![2018-01-24_18h39_14.png](https://qiita-image-store.s3.amazonaws.com/0/63060/0baf0fc8-4e02-898f-79a1-4cbb0c6683dc.png)


```ruby
class Player
  def play_turn(warrior)
    # cool code goes here
    warrior.walk!
  end
end
```


##初級-2
敵キャラが出現！
1マス先を調べて、敵がいるか調べながら進もう！
![uploading-0]()![2018-01-24_18h39_42.png](https://qiita-image-store.s3.amazonaws.com/0/63060/bc8fe62a-7601-ffb1-d6ec-dbd4da6f11a4.png)


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


##初級-3
敵キャラが複数出現！
1マス先を調べて、敵がいない時だけ回復しながら進もう！
![uploading-0]()![2018-01-24_18h40_03.png](https://qiita-image-store.s3.amazonaws.com/0/63060/4b502302-3c07-fc27-c715-64f523babcc9.png)


```ruby
class Player
  def play_turn(warrior)
    #体力が減っていないか確認する
    if warrior.health < 20
      #前のマスに敵がいなければ休憩
      if warrior.feel.empty?
        warrior.rest!
      else
        warrior.attack!
      end
    else
      #体力満タンで前のマスに敵がいなければ進む
      if warrior.feel.empty?
        warrior.walk!
      else
        warrior.attack!
      end
    end
  end
end
```


##初級-4
2マス先に攻撃してくるアーチャーが新規に出現。
悠長に回復してるとやられるので、殺られる前に殺る
![uploading-0]()![2018-01-24_18h40_38.png](https://qiita-image-store.s3.amazonaws.com/0/63060/d7990b23-cbf1-02b6-9ec8-3ec20b38b945.png)


```ruby
class Player
  def play_turn(warrior)
    # 現在の体力を記憶する変数を作る
    # 最初は空なので、1ターン目でMAXの体力を入力
    if @health.nil?
      @health = 20
    end

    if @health > warrior.health
      #前ターンより体力が減っているということは攻撃を受けていると判断
      #ダメージを受けていると判定したときは回復せずに攻撃し続ける
      if warrior.feel.empty?
        warrior.walk!
      else
        warrior.attack!
      end
    else
      if warrior.health < 15
        warrior.rest!
      else
        if warrior.feel.empty?
          warrior.walk!
        else
          warrior.attack!
        end
      end
    end
    #ターンエンド後に現在の体力を記録する
    @health = warrior.health
  end
end
```

##初級-5
新規に、captive（捕虜）が出現
従来のコードだと、攻撃してしまうので、見分けて救助する必要がある
![uploading-0]()![2018-01-24_18h41_03.png](https://qiita-image-store.s3.amazonaws.com/0/63060/441501d7-e2b3-0028-8c28-506bb9cb67ca.png)


```ruby
class Player
  def play_turn(warrior)
    # 現在の体力を記憶する変数を作る
    # 最初は空なので、1ターン目でMAXの体力を入力
    if @health.nil?
      @health = 20
    end

    if @health > warrior.health
      #前ターンより体力が減っているということは攻撃を受けていると判断
      #ダメージを受けていると判定したときは回復せずに攻撃し続ける
      if warrior.feel.empty?
        warrior.walk!
      else
        warrior.attack!
      end
    else
      if warrior.health < 15
        warrior.rest!
      else
        if warrior.feel.empty?
          warrior.walk!
        else
          #全面のマスに捕虜がいないかを確認
          #捕虜は救出、捕虜でなければ攻撃
          if warrior.feel.captive?
            warrior.rescue!
          else
            warrior.attack!
          end
        end
      end
    end
    #ターンエンド後に現在の体力を記録する
    @health = warrior.health
  end
end
```

##初級-6
新規に、後方のオブジェクトが出現
新規に後方にアクションをするためのオプション（引数）が使えるようになりました。
状況に応じて使い分けましょう。

コードの書き方も人によって色々になってきます。
![uploading-0]()![2018-01-24_18h41_33.png](https://qiita-image-store.s3.amazonaws.com/0/63060/a52c761d-20b5-cdf1-1b7b-203a09a9fae6.png)


```ruby
class Player
  #レスキューフラグをつくりました。捕虜を救出すると、フラグが立つようにします。
  def initialize
    @health = 20
    @rescue = 0
  end
  
  def play_turn(warrior)
    if @rescue == 0
      #捕虜を未救出の場合はこちらから
      #:backwardを使うことで、後ろにアクションすることができます
      if warrior.feel(:backward).empty?
        warrior.walk!(:backward)
      else
        warrior.rescue!(:backward)
        @rescue += 1
      end
      
    else
      #捕虜の救出後はこちら
      if warrior.feel.empty?
        
        if @health > warrior.health
          #ダメージ判定。ダメージを受けていて、余裕がないときは下がって避難
          if warrior.health < 9
            warrior.walk!(:backward)
          else
            warrior.walk!
          end

        else
          #ダメージを受けていない場合、余裕をもって回復
          if warrior.health < 16
            warrior.rest!
          else
            warrior.walk!
          end
          
        end
        
      else
        #目の前に敵がいる場合は、ギリギリまで攻めます
        if warrior.health < 9
          warrior.walk!(:backward)
        else
          warrior.attack!
        end
        
      end

    end
    @health = warrior.health
  end
end
```

##初級-7
敵が全て、後ろにいます。
構成自体はシンプルなので、上手く後ろ向きにアクションを行う引数を利用しましょう。
今までのコードを再利用すれば、そんなに難しく無いはずです。
![uploading-0]()![2018-01-24_18h38_22.png](https://qiita-image-store.s3.amazonaws.com/0/63060/d01e6ff4-62e5-fa55-24a1-1b4bb05a4fa7.png)


```ruby
class Player
  def initialize
    @health = 20
    @rescue = 0
  end

  def play_turn(warrior)
      if warrior.feel(:backward).empty?
        if @health > warrior.health
          #ダメージ判定。ダメージを受けていて、余裕がないときは前に進んで避難
          if warrior.health < 9
            warrior.walk!
          else
            warrior.walk!(:backward)
          end
        else
          #ダメージを受けていない場合、余裕をもって回復
          if warrior.health < 16
            warrior.rest!
          else
            warrior.walk!(:backward)
          end
        end
      else
        #目の前に敵がいる場合は、ギリギリまで攻めます
        if warrior.health < 9
          warrior.walk!
        else
          warrior.attack!(:backward)
        end
      end
    @health = warrior.health
  end
end
```