RPGっぽく戦闘してみる

テキストRPGのように自動戦闘を行います。ヘタレ英語なのは仕様です。

Dragon's attack!
Mini slime gets 23 damage!
Mini slime's attack!
Dragon gets 2 damage!

Dragon's attack!
Mini slime gets 23 damage!

Mini slime's HP is zero!
Dragon won!

# モンスターを表すクラス
class Monster
  attr_reader :name, :attack, :guard, :speed
  
  def initialize(name,hp,attack,guard,speed)
    @name = name
    @hp = hp
    @attack = attack
    @guard = guard
    @speed = speed
  end

  # ダメージ判定
  def damage_from(attacker)
    # 与えるダメージを算出
    damage = attacker.attack - @guard

    if damage > 0 then
      @hp -=  damage
      puts  "#{@name} gets #{damage} damage!"
    else
      puts "#{@name} gets no damage!"
    end
  end

  # 攻撃
  def attack_to(target)
    puts "#{self.name}'s attack!"
    avoid_percent = target.speed - self.speed
    if rand(100) >= avoid_percent  then
      target.damage_from(self)
    else
      puts "But #{target.name} avoids!"
    end
  end

  # 敗北判定
  def is_lose
    return @hp <= 0
  end
end

class Boss < Monster
  # ボスは必中
  def attack_to(target)
    puts "#{self.name}'s attack!"
    target.damage_from(self)
  end
end


# 戦闘処理
def battle(m1,m2)
  # ターン経過
  def do_turn(fast_attacker,slow_attacker)
    fast_attacker.attack_to(slow_attacker)
    slow_attacker.attack_to(fast_attacker) unless slow_attacker.is_lose
    puts ''
  end
  
  # 勝者判定
  def judge(m1,m2)
    if m1.is_lose then
      winner = m2
      loser = m1
    else
      winner = m1
      loser = m2
    end
    puts "#{loser.name}'s HP is zero!"
    puts "#{winner.name} won!"  
  end
  
  # 戦闘処理開始
  # 先攻後攻判定(speed不変前提)
  if m1.speed < m2.speed then
    # m2 がm1よりも早い
    fast_attacker = m2
    slow_attacker = m1
  else
    fast_attacker = m1
    slow_attacker = m2      
  end

  # 勝敗が決まるまで戦闘
  until (m1.is_lose or m2.is_lose) do
    do_turn(fast_attacker,slow_attacker)
  end
  judge(m1,m2)
end

def main
  mob = Monster.new('Mini slime',40,10,2,2)
  boss = Boss.new('Dragon',200,25,8,5)
  battle(mob, boss)
end

main