初心者でも作れる!RubyでRPGゲーム制作の7つのステップ

RubyでRPGゲームを作成する7つのステップを解説するイラストRuby
この記事は約14分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

「RubyでRPGゲームを作ってみたい!

でも、どうしたらいいのか全く分からない…」そんな初心者のあなたへ向けて、この記事ではRubyでRPGゲームを作成するための7つの詳細なステップを解説します。

この記事を読めば、Rubyを使ったRPGゲーム制作が初めてでも手を動かしながら学べるようになります。

●Rubyの基本

まずはRubyの基本について学びましょう。

Rubyはプログラミング言語の一つで、その文法は英語に近く、直感的に理解しやすいところが特徴です。

例えば、「Hello, World!」と表示するプログラムは、次のように書くことができます。

puts "Hello, World!"

ここで使用しているputsは、Rubyに組み込まれたメソッドで、指定した文字列を出力する機能があります。

このように、Rubyは簡潔で直感的なコードを書くことが可能です。

●ゲームロジックの設計

ゲームを作る上で最も重要なのが、ゲームロジックの設計です。

RPGゲームでは、キャラクターの行動や戦闘システム、マップの移動など、さまざまな要素を考える必要があります。

まずはゲームの全体像を思い描き、それを実現するためのロジックを考えましょう。

これから作るゲームの世界観やストーリー、ゲームの進行などを紙に書き出すところから始めます。

●キャラクターの作成

ゲームの主要な要素であるキャラクターの作成に移ります。

ここでは、キャラクターの性能を定義し、キャラクターがどのように行動するのかを設定します。

この部分を設計することでゲームの基礎部分が形成され、ゲームとして成り立つようになります。

まずはキャラクターの定義から始めます。

○サンプルコード1:キャラクターの定義

Rubyでキャラクターを定義する一例を紹介します。

class Character
  attr_accessor :name, :hp, :power

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

このコードではCharacterというクラスを作成し、その中にname(名前)、hp(ヒットポイント、つまり生命力)、power(攻撃力)という属性を定義しています。

initializeメソッドは、Characterのインスタンス(具体的なキャラクター)を生成する際に実行され、それぞれの属性に引数で指定した値を代入します。

つまり、このコードを利用して、具体的なキャラクターを次のように作成することができます。

hero = Character.new("勇者", 100, 30)

このコードを実行すると、名前が”勇者”でHPが100、攻撃力が30のキャラクターが生成されます。

このキャラクターの情報は、それぞれhero.namehero.hphero.powerという形で取得することができます。

次に、キャラクターの行動を設定しましょう。

○サンプルコード2:キャラクターの行動

キャラクターが行動するためのメソッドをCharacterクラスに追加します。

ここでは攻撃行動を表すattackメソッドを追加してみましょう。

class Character
  # (略)...

  def attack(target)
    target.hp -= self.power
    puts "#{self.name}が#{target.name}に#{self.power}のダメージを与えた!"
    puts "#{target.name}の残りHPは#{target.hp}だ。"
  end
end

attackメソッドでは、引数で受け取った目標(target)のHPを自身の攻撃力(self.power)分だけ減らします。そして、その結果を表示します。

このメソッドを使って、先ほど作った”勇者”が敵キャラクターを攻撃するシーンを再現してみましょう。

敵キャラクターとして”スライム”を新たに作成します。

slime = Character.new("スライム", 50, 15)
hero.attack(slime)

このコードを実行すると、「勇者がスライムに30のダメージを与えた! スライムの残りHPは20だ。」と表示されます。これでキャラクターが行動する基本的な部分ができました。

●戦闘システムの構築

キャラクターの作成とその行動設定ができたところで、次に戦闘システムの構築に移りましょう。

戦闘とは、キャラクターが敵と交戦するシーンのことで、RPGゲームにおいては中心的な要素の一つです。

この戦闘システムを適切に設計することでゲームはより面白く、プレイヤーが没頭できるものとなります。

戦闘システムの構築は大きく二つのステップに分けられます。戦闘システムの設定と戦闘システムの実行です。

まずは戦闘システムの設定から始めていきましょう。

○サンプルコード3:戦闘システムの設定

戦闘システムを設定するためには、戦闘の流れを制御するBattleクラスを新たに作成します。

このクラスでは戦闘を始めるキャラクター(player)と戦闘相手(enemy)を初期化し、戦闘が終了するまでの流れを定義します。

class Battle
  def initialize(player, enemy)
    @player = player
    @enemy = enemy
  end

  def start
    while @player.hp > 0 && @enemy.hp > 0
      @player.attack(@enemy)
      @enemy.attack(@player) if @enemy.hp > 0
    end

    if @player.hp > 0
      puts "#{@player.name}は勝利した!"
    else
      puts "#{@player.name}は敗北した…"
    end
  end
end

このコードでは、Battleクラスのインスタンスを生成する際に戦闘を始めるキャラクターと戦闘相手を初期化しています。

startメソッドでは、戦闘が終了する(どちらかのキャラクターのHPが0になる)まで、互いに攻撃し合う処理をループします。

戦闘が終了したら、プレイヤーのHPが0より大きいかどうかで勝敗を判定し、結果を表示します。

次に、この戦闘システムを実行してみましょう。

○サンプルコード4:戦闘システムの実行

先ほど作成したBattleクラスを使って戦闘システムを実行してみましょう。

まずは、キャラクターを二つ(勇者とスライム)作成し、戦闘を開始するコードを紹介します。

hero = Character.new("勇者", 50, 10)
slime = Character.new("スライム", 20, 5)

battle = Battle.new(hero, slime)
battle.start

上記のコードは、名前が”勇者”でHPが50、攻撃力が10のキャラクターと、名前が”スライム”でHPが20、攻撃力が5のキャラクターを生成しています。

そして、これらのキャラクターをBattleクラスのインスタンスに渡して、戦闘を開始します。

コードを実行すると、「勇者の攻撃!スライムに10のダメージ!」、「スライムの攻撃!勇者に5のダメージ!」のように、互いに攻撃し合う様子と、最終的に勝利したキャラクターの名前が表示されます。

●マップと移動システム

RPGゲームにとって、キャラクターが動き回るゲームの舞台となるマップと、キャラクターがそのマップ上を自由に移動できるシステムは欠かせません。

今回はRubyを用いて、シンプルなマップを作成し、そのマップ上をキャラクターが移動するシステムを作っていきます。

まず、マップを作成するためのサンプルコードから見てみましょう。

○サンプルコード5:マップの作成

ここでは、2次元配列を使用してマップを作成します。

下記のサンプルコードでは、マップ上の各位置にランダムに”草”、”木”、”水”を配置しています。

map = Array.new(10) do
  Array.new(10) do
    case rand(3)
    when 0
      "草"
    when 1
      "木"
    when 2
      "水"
    end
  end
end

map.each do |row|
  puts row.join
end

このコードでは、10×10の2次元配列を作成してマップを表現し、その中にランダムに自然環境を配置しています。最後にeachメソッドを用いてマップを表示します。

実行結果は、”草”、”木”、”水”がランダムに配置されたマップの形をしています。

次に、このマップ上をキャラクターが移動するシステムを実装します。

○サンプルコード6:移動システムの実装

キャラクターがマップ上を自由に動けるようにするには、キャラクターの位置情報を保持し、その情報を更新することでキャラクターの移動を表現します。

下記のコードでは、Characterクラスに位置情報を追加し、それを更新するメソッドを追加しています。

class Character
  attr_accessor :x, :y

  def initialize(name, hp, power, x = 0, y = 0)
    @name = name
    @hp = hp
    @power = power
    @x = x
    @y = y
  end

  def move(dx, dy)
    @x += dx
    @y += dy
  end
end

このコードでは、Characterクラスの初期化メソッドで位置情報を設定し、moveメソッドでその位置情報を更新します。

このようにして、キャラクターがマップ上を自由に動くことができます。

以上でマップと移動システムの作成は終了です。

●イベントとクエストの作成

ゲームが動き始め、キャラクターがマップ上を移動できるようになったところで、次に取り組むべきはイベントとクエストの設定です。

イベントはゲームのストーリーを進めたり、プレイヤーに新しい挑戦を提示する要素で、クエストはそれらイベントの一部を成すタスクや目標です。

それでは、まずはイベントの設定から見ていきましょう。

○サンプルコード7:イベントの設定

ここではイベントクラスを作成し、その中でイベントが発生する条件と、イベントが発生したときのアクションを定義します。

下記のコードでは、特定の位置にキャラクターが移動したときにイベントが発生する例を示しています。

class Event
  attr_reader :x, :y, :action

  def initialize(x, y, action)
    @x = x
    @y = y
    @action = action
  end

  def check_event(character)
    if character.x == @x && character.y == @y
      @action.call
    end
  end
end

# イベントの作成例
event = Event.new(5, 5, -> { puts "ここでイベントが発生しました!" })

このコードでは、Eventクラスを作成し、その中でイベントが発生する位置と、イベントが発生したときのアクションを定義しています。

具体的には、ラムダ式を使用してイベントが発生したときのアクションを表現しています。

次に、イベントが一部を形成するクエストの設定について見ていきましょう。

○サンプルコード8:クエストの設定

クエストもイベントと同様に、発生する条件とクエスト達成後のアクションを設定します。

ここでは、特定のアイテムを集めるクエストを例にしています。

class Quest
  attr_reader :required_item, :quantity, :action

  def initialize(required_item, quantity, action)
    @required_item = required_item
    @quantity = quantity
    @action = action
  end

  def check_quest(character)
    if character.items[@required_item] >= @quantity
      character.items[@required_item] -= @quantity
      @action.call
    end
  end
end

# クエストの作成例
quest = Quest.new("勇者の証", 3, -> { puts "クエスト完了!" })

このコードでは、Questクラスを作成し、その中でクエストを達成するために必要なアイテムとその数量、そしてクエストが達成されたときのアクションを定義しています。

具体的には、ラムダ式を使用してクエストが達成されたときのアクションを表現しています。

●ゲームのテストとデバッグ

ゲーム開発の過程では、テストとデバッグは欠かせません。

テストは、コードが意図した通りに機能するか確認する手段です。

デバッグは、テストで発見した問題を解決する作業のことを指します。

○サンプルコード9:テストの実行

Rubyには、自動テストを行うためのライブラリがいくつも用意されていますが、ここでは最も基本的なライブラリであるMinitestを使用します。

下記のコードは、先ほど作成したイベントとクエストが正しく動作するかをテストする例です。

require 'minitest/autorun'
require_relative 'character'
require_relative 'event'
require_relative 'quest'

class GameTest < Minitest::Test
  def setup
    @character = Character.new("勇者", 100, 20, 10)
    @event = Event.new(5, 5, -> { @character.hp += 50 })
    @quest = Quest.new("勇者の証", 3, -> { @character.hp += 100 })
  end

  def test_event
    @character.move(5, 5)
    @event.check_event(@character)
    assert_equal 150, @character.hp
  end

  def test_quest
    @character.items["勇者の証"] = 3
    @quest.check_quest(@character)
    assert_equal 200, @character.hp
  end
end

上記のコードでは、Minitestライブラリを使ってゲームの一部をテストしています。

具体的には、Characterクラス、Eventクラス、Questクラスのインスタンスを生成し、イベントやクエストが期待通りに動作するかを確認しています。

○サンプルコード10:デバッグの方法

テストで問題が発見されたときや、意図しない動作が見つかったときには、デバッグを行います。

Rubyにはデバッグライブラリとして、byebugやpryなどがありますが、ここではpryを使用します。

require 'pry'

class Character
  def initialize(name, hp, atk, def)
    @name = name
    @hp = hp
    @atk = atk
    @def = def
    @items = {}
  end

  def move(x, y)
    # 移動先の座標に何か問題があるか確認する
    binding.pry
  end
end

上記のコードでは、pryライブラリを使用してデバッグを行います。

具体的には、binding.pryの行でプログラムの実行を一時停止し、その時点での変数の値や、その後の処理を手動で進めることが可能になります。

これにより、問題の原因を具体的に特定することができます。

まとめ

この記事では、Rubyを使ってRPGゲームを制作するための手順を詳しく解説しました。

初心者でも取り組めるよう、具体的なサンプルコードとその解説を交えて、キャラクターの作成からゲームのテストとデバッグまでの各ステップを解説してきました。

Rubyの基本的な構文から、オブジェクト指向の考え方、さらにはイベントやクエストの設定、そしてゲームのテストとデバッグまで、Rubyでゲームを制作する際に必要な知識と技術を網羅しています。

これらを一つずつマスターしていけば、あなた自身のオリジナルのRPGゲームを作ることができるでしょう。

何事も最初は難しく感じるかもしれませんが、一歩ずつ進めていくことが大切です。

この記事が、Rubyでゲーム制作を始める一助となることを心より願っています。

あなたのゲーム制作が楽しく、そして実りあるものとなりますように。

最後に、Rubyやゲーム制作に関する質問や不明点があれば、遠慮なくコメント欄やSNSで問い合わせてください。皆さんからのフィードバックを待っています。

これからもRubyやゲーム制作に関する情報を提供していくつもりですので、ぜひウェブサイトをブックマークしておいてください。

それでは、皆さんのゲーム制作の旅が、素晴らしいものとなることを祈っています。