Rubyで勉強がてら、オブジェクト指向を使った簡単なRPG風の戦闘画面をターミナル上で作ってみた
前置き
Qitta初投稿です。不慣れなところもしばしばあるとおもいますが、ご了承ください。
最近Railsばかり触っていたもので、たまには原点に立ち返って素のままのRubyをいじってみたいと思い作ってみました。
ソースコード
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クラスと同じ振る舞いを持ったそれぞれの独立したクラスになる
require "./character"
class Actor < Character
def victory(target)
puts "#{self.name}は#{target.name}を倒した!"
end
def lose
puts "#{self.name}は死んでしまった"
end
end
子クラスであるactorには勝利したときのメソッドと敗北したときのメソッドを独自に定義
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メソッドは親クラスからオーバーライドし、メソッドの中身を上書き
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を呼び出して、それぞれのクラスのインスタンス変数とインスタンスメソッドを使い、戦闘画面を実装(ここらへんのコードは結構冗長になってしまいました^^;)
まとめ
現段階では、コマンドの種類が「たたかう」、「にげる」しかなく、「どうぐ」や「まほう」とかもないのでそういった機能を追加するなど、まだまだやれることはあると思います。
まだまだ知識不十分ですが、これからも温かい目で見ていただければと思います^^;
ここが間違ってる、こうした方が良い、という意見がございましたらどしどしコメントしてください(語彙力なくてすいません)。