3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyでオブジェクト指向を使った簡単なRPG風の戦闘画面をターミナル上で作ってみた

Posted at

Rubyで勉強がてら、オブジェクト指向を使った簡単なRPG風の戦闘画面をターミナル上で作ってみた

前置き

Qitta初投稿です。不慣れなところもしばしばあるとおもいますが、ご了承ください。
最近Railsばかり触っていたもので、たまには原点に立ち返って素のままのRubyをいじってみたいと思い作ってみました。

ソースコード

character.rb
class Character

  attr_accessor :name, :hp, :power

  def initialize(name, hp, power)
    @name = name
    @hp = hp
    @power = power
  end

  def attack(target)
    puts "#{@name}#{target.name}#{@power}のダメージを与えた!"
    target.hp -= @power
  end

  def killed(target)
    return target.hp <= 0
  end

end

actorとenemyの親クラス(継承元)
基本ここにactorとenemyがもっている共通の属性と振る舞いを記述することで
継承先はCharacterクラスと同じ振る舞いを持ったそれぞれの独立したクラスになる

actor.rb
require "./character"

class Actor < Character

  def victory(target)
    puts "#{self.name}#{target.name}を倒した!"
  end

  def lose
    puts "#{self.name}は死んでしまった"
  end

end

子クラスであるactorには勝利したときのメソッドと敗北したときのメソッドを独自に定義

enemy.rb
require "./character"

class Enemy < Character

  def attack(target)
    if self.name == "スライム"
      self.power = rand(30)
    elsif self.name == "ゴーレム"
      self.power = rand(20..50)
    end
    super
  end

  def show
    puts "#{self.name}が現れた!"
  end
  
end

同じく子クラスであるenemyにも、showメソッドを定義し、attackメソッドは親クラスからオーバーライドし、メソッドの中身を上書き

game.rb
require "./actor"
require "./enemy"

class Game

  @@level = 0

  def self.start
    case @@level
    when 0
      name = "スライム"
    when 1
      name = "ゴーレム"
    else
    end
    actor = Actor.new("主人公", 100, 30)
    enemy = Enemy.new(name, 100, 5)
    enemy.show
    while true
      puts "--------------"
      puts "コマンドを選択してください。"
      puts "--------------"
      puts "[1]: たたかう"
      puts "[2]: にげる"
      puts "--------------"
      input = gets.to_i
      case input
      when 1
        actor.attack(enemy)
        if actor.killed(enemy)
          actor.victory(enemy)
          @@level += 1
          if @@level == 2
            puts "ゲームクリア!おめでとう!"
            exit
          end
          self.continue
        end
        enemy.attack(actor)
        if enemy.killed(actor)
          actor.lose
          self.continue
        end

      when 2
        puts "にげました。"
        exit
      else
        puts "そんなコマンドないよ"
      end
    end
  end

  def self.end
    puts "終了しました!"
    exit
  end

  def self.continue
    puts "もう一度プレイしますか?"
    puts "[1]: Yes"
    puts "[2]: No"
    input = gets.to_i
    if input == 1
      self.start
    elsif input == 2
      exit
    end
  end

end

while true
  puts "ゲームを開始しますか?"
  puts "[0]: start"
  puts "[1]: end"
  input = gets.to_i
  case input
  when 0
    Game.start
  when 1
    Game.end
  else
    puts "値が不正です!"
  end
end

最後にGameクラスでactorとenemyを呼び出して、それぞれのクラスのインスタンス変数とインスタンスメソッドを使い、戦闘画面を実装(ここらへんのコードは結構冗長になってしまいました^^;)

まとめ

現段階では、コマンドの種類が「たたかう」、「にげる」しかなく、「どうぐ」や「まほう」とかもないのでそういった機能を追加するなど、まだまだやれることはあると思います。

まだまだ知識不十分ですが、これからも温かい目で見ていただければと思います^^;

ここが間違ってる、こうした方が良い、という意見がございましたらどしどしコメントしてください(語彙力なくてすいません)。

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?