LoginSignup
2
2

More than 3 years have passed since last update.

Ruby Warrir 回答メモ

Last updated at Posted at 2018-01-15

2018-01-16_17h56_09.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

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

初級-2

敵キャラが出現!
1マス先を調べて、敵がいるか調べながら進もう!
uploading-02018-01-24_18h39_42.png

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

初級-3

敵キャラが複数出現!
1マス先を調べて、敵がいない時だけ回復しながら進もう!
uploading-02018-01-24_18h40_03.png

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-02018-01-24_18h40_38.png

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-02018-01-24_18h41_03.png

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-02018-01-24_18h41_33.png

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-02018-01-24_18h38_22.png

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
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2