【ゲームコード一覧】Rubyで色々なゲームを作ろう -初心者向け-

記事内に商品プロモーションを含む場合があります

Rubyを学習中の初心者に向けて、簡単なゲームのコードを数多く紹介しています。

是非このページのゲームを実際に作ってみて、楽しくRubyを習得してください。

初心者のためのRubyテキスト&問題集(全50ページを無料公開中!) Rubyの世界へようこそ!初心者から一歩ずつ、実践的なスキル...

【★★☆☆☆】ハイアンドローゲーム

ハイアンドローゲームを作成しましょう。

このゲームではプレイヤーとコンピュータがそれぞれ1から13までのカードを1枚ずつ持ちます。

プレイヤーはコンピュータのカードが自分のカードより「大きい」か「小さい」かを予想し、結果が表示されます。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

=== ハイアンドローゲームへようこそ! ===
【プレイヤー】7 VS ??【コンピュータ】
あなたのカードはコンピュータのカードより大きい?小さい?
1: 大きい、2: 小さい ⇒ 1
【プレイヤー】7 VS 5【コンピュータ】
正解!あなたの勝ち!

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

【Ruby】確認問題2-☆1:ハイアンドロー ゲームを作ろう【Ruby】ハイアンドローゲームのコードを書く練習問題。ランダムに配られるカードを使うシンプルなゲームの実装方法を学べます。基本的な条件分岐や乱数の使い方を理解するための実用的な例として最適です。Ruby初心者にもわかりやすく、短時間でチャレンジできるコード演習。プログラミング学習の第一歩としてお楽しみください。...

ハイアンドローゲームのコードは↓↓をクリック

ハイアンドローのコード
# ハイアンドローゲーム

# ゲーム開始メッセージ
puts "=== ハイアンドローゲームへようこそ! ==="

# プレイヤーとコンピュータにランダムなカード(1〜13の数字)を配る
player_card = rand(1..13)
computer_card = rand(1..13)

# プレイヤーに配られたカードを表示し、コンピュータのカードはまだ表示しない
puts "【プレイヤー】#{player_card} VS ??【コンピュータ】"

# プレイヤーにコンピュータのカードが大きいか小さいかを予想させる
puts "あなたのカードはコンピュータのカードより大きい?小さい?"
puts "1: 大きい、2: 小さい"
choice = gets.to_i

# コンピュータのカードを表示
puts "【プレイヤー】#{player_card} VS #{computer_card}【コンピュータ】"

# 勝負の結果を判定
if player_card == computer_card
  puts "引き分け!"
elsif (player_card < computer_card && choice == 1) || (player_card > computer_card && choice == 2)
  puts "正解!あなたの勝ち!"
else
  puts "残念!あなたの負け!"
end

ハイアンドローのコードは以上です。楽しんでください^^
コードの解説はこちらを参照。

【★★☆☆☆】数当てゲーム

1から100までのランダムな数を生成し、プレイヤーがその数を当てる「数当てゲーム」を作成しましょう。

プレイヤーが数を推測し、正解するまで大きいか小さいかをヒントとして表示します。

プレイヤーが正しい数を当てたらゲームを終了させます。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

数当てゲームへようこそ!
1から100までの数を当ててください。
あなたの推測: 50
もっと大きい数です。
あなたの推測: 75
もっと小さい数です。
あなたの推測: 60
もっと大きい数です。
あなたの推測: 65
もっと小さい数です。
あなたの推測: 63
もっと大きい数です。
あなたの推測: 64
おめでとうございます!正解です。

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

【Ruby】確認問題2-☆2:数当てゲームを作ろう【Ruby】数当てゲームのコードを書く練習問題。1から100までのランダムな数を生成し、プレイヤーがその数を当てるまで繰り返す簡単なゲームを作成する課題です。ゲーム中、プレイヤーにヒントを出しながら正しい数を当てるロジックを実装します。コードの流れと実行結果を詳しく解説し、楽しくプログラミングを学べる内容です。...

数当てゲームのコードは↓↓をクリック

数当てゲームのコード
# 数当てゲーム

# 1から100までのランダムな数を生成
target_number = rand(1..100)

# ゲーム開始のメッセージを表示
puts "数当てゲームへようこそ!"
puts "1から100までの数を当ててください。"

# プレイヤーが正しい数を当てるまで繰り返す
while true
  # プレイヤーの推測を入力として受け取る
  print "あなたの推測: "
  guess = gets.to_i
  
  # プレイヤーの推測と目標の数を比較
  if guess < target_number
    puts "もっと大きい数です。"
  elsif guess > target_number
    puts "もっと小さい数です。"
  else
    puts "おめでとうございます!正解です。"
    break
  end
end

数当てゲームのコードは以上です。楽しんでください^^
コードの解説はこちらを参照。

【★★☆☆☆】簡単なじゃんけんゲーム

シンプルな「じゃんけんゲーム」を作成しましょう。

プレイヤーとコンピュータがじゃんけんを行い、その結果を表示します。

ゲームはプレイヤーが終了を選択するまで続きます。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

じゃんけんゲームを始めます!
じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2)
> 2
あなたの手: パー
コンピューターの手: チョキ
あなたの負けです!

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

【Ruby】確認問題2-☆3:簡単なじゃんけんゲームを作ろう【Ruby】じゃんけんゲームのコードを書く練習問題。プレイヤーとコンピュータが「グー」「チョキ」「パー」の手を選び、勝敗を判定するシンプルなゲームを実装します。勝敗の判定ロジックやメソッドの使い方、ループ処理を学べる内容となっており、初心者にとってRubyの基本的な構文を楽しく学ぶための実践的な練習問題です。...

簡単なじゃんけんゲームのコードは↓↓をクリック

簡単なじゃんけんゲームのコード
# じゃんけんゲームの開始メッセージ
puts "じゃんけんゲームを始めます!"
puts "じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2)"

# プレイヤーの手を入力
player_choice = gets.to_i

# コンピュータの手をランダムに決定
computer_choice = rand(3)

# プレイヤーの手の名前を取得
player_hand = case player_choice
              when 0 then "グー"
              when 1 then "チョキ"
              when 2 then "パー"
              else "不明な手"
              end

# コンピュータの手の名前を取得
computer_hand = case computer_choice
                when 0 then "グー"
                when 1 then "チョキ"
                when 2 then "パー"
                end

# プレイヤーとコンピュータの手を表示
puts "あなたの手: #{player_hand}"
puts "コンピューターの手: #{computer_hand}"

# 勝敗の判定
if player_choice == computer_choice
  puts "引き分けです!"
elsif (player_choice == 0 && computer_choice == 1) ||
      (player_choice == 1 && computer_choice == 2) ||
      (player_choice == 2 && computer_choice == 0)
  puts "あなたの勝ちです!"
else
  puts "あなたの負けです!"
end

簡単なじゃんけんゲームのコードは以上です。楽しんでください^^
コードの解説はこちらを参照。

【★★★☆☆】石取りゲーム

シンプルな「石取りゲーム」を作成しましょう。

このゲームでは全部で10個ある石の中からプレイヤーとコンピュータが交互に石を取っていき、最後の1つを取った方が負けとなります。

ゲームはプレイヤーが終了を選択するまで続きます。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

残りの石の数: 10
取る石の数を入力してください(1から3まで):
2
残りの石の数: 8
コンピュータが取った石の数: 3
残りの石の数: 5
取る石の数を入力してください(1から3まで):
1
残りの石の数: 4
コンピュータが取った石の数: 2
残りの石の数: 2
取る石の数を入力してください(1から3まで):
1
残りの石の数: 1
コンピュータが取った石の数: 1
コンピュータの負けです。
ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

【Ruby】確認問題3-☆1:石取りゲームを作ろう【Ruby】石取りゲームのコードを書く練習問題。プレイヤーとコンピュータが交互に1から3までの石を取り合い、残りの石がなくなった方が負けるシンプルなゲームを実装します。石が減るごとに勝敗が決定するループ形式のゲームで、入力のバリデーションや条件分岐、ループ処理を通じてRubyの基本的な構文を学ぶことができます。...

石取りゲームのコードは↓↓をクリック

石取りゲームのコード
# プレイヤーの入力を受け取るメソッド
def get_player_choice
  begin
    puts "取る石の数を入力してください(1から3まで):"
    choice = Integer(gets.chomp)  # 入力を整数に変換
    raise if choice < 1 || choice > 3  # 1から3以外の数は無効
  rescue
    puts "無効な入力です。もう一度入力してください。"
    retry
  end
  choice
end

# コンピュータの手をランダムに選ぶメソッド
def get_computer_choice
  rand(1..3)  # 1から3の範囲でランダムに選ぶ
end

# ゲームのメインループ
def play_game
  total_stones = 10  # 石の総数を10に設定
  while total_stones > 0
    puts "残りの石の数: #{total_stones}"
    
    # プレイヤーのターン
    player_choice = get_player_choice
    total_stones -= player_choice
    if total_stones <= 0
      puts "あなたの負けです。"
      break
    end
    
    # コンピュータのターン
    computer_choice = get_computer_choice
    puts "コンピュータが取った石の数: #{computer_choice}"
    total_stones -= computer_choice
    if total_stones <= 0
      puts "コンピュータの負けです。"
      break
    end
  end
end

# ゲームの開始
loop do
  play_game
  puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)"
  continue_game = gets.chomp
  break if continue_game == "終了"
end

puts "ゲームを終了します。"

石取りゲームのコードは以上です。楽しんでください^^
コードの解説はこちらを参照。

【★★★☆☆】丁半賭博ゲーム

簡単な丁半賭博ゲームのプログラムを作成しましょう。

このゲームではユーザーが最初に100円を持っており、その中から掛け金を決め、出目が「丁」か「半」かを予想します。

その後でコンピュータがサイコロを2つ振り、ユーザーの予想が当たっていたかを判定します。

予想が当たっていた場合、掛け金が2倍になってユーザーに戻り、間違っていた場合は掛け金はなくなります。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

丁半賭博ゲームを始めます!
プレイヤーの所持金:1000円
いくらかけますか? ⇒ 300
丁か半か?(丁:0,半:1) ⇒ 0
サイコロの目:4, 2 ⇒ 丁
あなたの勝ち!賞金は300円
続けますか?(はい:0,いいえ:1) ⇒ 1
最終所持金は1300円でした。丁半賭博ゲームを終わります。

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

【Ruby】確認問題3-☆2:丁半賭博ゲームを作ろう【Ruby】丁半賭博ゲームのコードを書く練習問題。ユーザーの所持金を管理しながら、サイコロを振って「丁」か「半」を予想するシンプルな賭博ゲームを実装します。初心者向けに、繰り返し処理や条件分岐の基本的な使い方を学びながら、ゲームの流れを楽しく理解できる課題です。...

丁半賭博ゲームのコードは↓↓をクリック

丁半賭博ゲームのコード
# プレイヤーが賭ける金額を入力し、所持金の範囲内か確認するメソッド
def get_bet(money)
  while true
    print "いくらかけますか? ⇒ "
    bet = gets.to_i
    if bet > 0 && bet <= money
      return bet
    else
      puts "無効な入力です!所持金以内の正しい金額を入力してください。"
    end
  end
end

# プレイヤーが「丁」または「半」を選択するメソッド
def get_choice
  while true
    print "丁か半か?(丁:0,半:1) ⇒ "
    choice = gets.to_i
    if choice == 0 || choice == 1
      return choice
    else
      puts "無効な入力です!0か1を入力してください。"
    end
  end
end

# サイコロを2つ振り、それぞれの出目を返すメソッド
def roll_dice
  dice1 = rand(1..6)
  dice2 = rand(1..6)
  return dice1, dice2
end

# ゲームを続けるか終了するかをプレイヤーに尋ねるメソッド
def ask_continue
  while true
    print "続けますか?(はい:0,いいえ:1) ⇒ "
    continue_game = gets.to_i
    if continue_game == 0 || continue_game == 1
      return continue_game
    else
      puts "無効な入力です!0か1を入力してください。"
    end
  end
end

# 丁半賭博ゲームのメインメソッド。ゲームの進行を制御し、勝敗や賞金計算を行う
def cho_han_game
  puts "丁半賭博ゲームを始めます!"
  money = 1000
  
  while money > 0
    puts "プレイヤーの所持金:#{money}円"
    bet = get_bet(money)
    choice = get_choice
    dice1, dice2 = roll_dice
    dice_sum = dice1 + dice2

    if dice_sum.even?
      result = "丁"
    else
      result = "半"
    end
    puts "サイコロの目:#{dice1}, #{dice2} ⇒ #{result}"
    
    if (dice_sum.even? && choice == 0) || (!dice_sum.even? && choice == 1)
      puts "あなたの勝ち!賞金は#{bet}円"
      money += bet
    else
      puts "あなたの負け!#{bet}円没収!"
      money -= bet
    end
    
    break if money <= 0 || ask_continue == 1
  end
  
  puts "最終所持金は#{money}円でした。丁半賭博ゲームを終わります。"
end

# ゲーム開始
cho_han_game

丁半賭博ゲームのコードは以上です。楽しんでください^^
コードの解説はこちらを参照。

【★★★★☆】ナインゲーム

ナインゲームはプレイヤーとコンピュータが対戦するゲームです。

プレイヤーとコンピュータは最初に1から9までの9枚の牌を持ち、順番に一つずつ選びます。

大きい数字の牌を出した方にその数字と同じ数の得点が入ります。

両者の持っている牌がなくなるまで勝負を続け、最終的により多くの得点を持っていた方が勝利となります。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

ナインゲームを開始します!

【第1回戦】
プレイヤーの得点 :0点
コンピュータの得点:0点
プレイヤーの持ち牌 ⇒ [1, 2, 3, 4, 5, 6, 7, 8, 9]
コンピュータの持ち牌⇒ [1, 2, 3, 4, 5, 6, 7, 8, 9]
持ち牌の中から出す牌を選択してください > 9
プレイヤーの打牌:9 VS 5:コンピュータの打牌
プレイヤーは9点獲得

【第2回戦】
プレイヤーの得点 :9点
コンピュータの得点:0点
プレイヤーの持ち牌 ⇒ [1, 2, 3, 4, 5, 6, 7, 8, -]
コンピュータの持ち牌⇒ [1, 2, 3, 4, -, 6, 7, 8, 9]
持ち牌の中から出す牌を選択してください > 
...

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

【Ruby】確認問題4-☆1:ナインゲームを作ろう【Ruby】ナインゲームのコードを書く練習問題。プレイヤーとコンピュータが1から9までの牌を使い、合計9回の対戦で得点を競うシンプルなゲームを実装します。配列操作、ループ、条件分岐などRubyの基本的な構文を学びながら、ゲームの流れを設計・実装する力をつけるための練習問題です。...

ナインゲームのコードは↓↓をクリック

ナインゲームのコード
# プレイヤーとコンピュータの得点を初期化
player_score = 0
computer_score = 0

# プレイヤーとコンピュータの持ち牌を初期化
player_tiles = (1..9).to_a
computer_tiles = (1..9).to_a

# プレイヤーとコンピュータの使用済み牌を格納する配列
player_used_tiles = []
computer_used_tiles = []

# ゲーム開始のメッセージ
puts "ナインゲームを開始します!"

# 9回の勝負を行う
(1..9).each do |round|
  puts "\n【第#{round}回戦】"
  
  # 現在の得点を表示
  puts "プレイヤーの得点 :#{player_score}点"
  puts "コンピュータの得点:#{computer_score}点"

  # 現在の持ち牌を表示
  def display_tiles(tiles, used_tiles)
    tiles.map do |tile|
      if used_tiles.include?(tile)
        '-'
      else
        tile
      end
    end.join(', ')
  end
  
  puts "プレイヤーの持ち牌 ⇒ [#{display_tiles(player_tiles, player_used_tiles)}]"
  puts "コンピュータの持ち牌⇒ [#{display_tiles(computer_tiles, computer_used_tiles)}]"
  
  # プレイヤーが出す牌を選択
  print "持ち牌の中から出す牌を選択してください > "
  player_choice = gets.to_i

  # プレイヤーが有効な牌を出すまで繰り返す
  until (player_tiles - player_used_tiles).include?(player_choice)
    print "無効な選択です。もう一度選択してください > "
    player_choice = gets.to_i
  end
  
  # コンピュータがランダムに牌を選択
  computer_choice = (computer_tiles - computer_used_tiles).sample
  
  # 選択した牌を使用済み牌に追加
  player_used_tiles << player_choice
  computer_used_tiles << computer_choice
  
  # 選択した牌を表示
  puts "プレイヤーの打牌:#{player_choice} VS #{computer_choice}:コンピュータの打牌"
  
  # 勝者を決定し、得点を追加
  if player_choice > computer_choice
    player_score += player_choice
    puts "プレイヤーは#{player_choice}点獲得"
  elsif computer_choice > player_choice
    computer_score += computer_choice
    puts "コンピュータは#{computer_choice}点獲得"
  else
    puts "引き分けです"
  end
end

# 最終得点を表示し、勝者を決定
puts "\n最終結果"
puts "プレイヤーの得点 :#{player_score}点"
puts "コンピュータの得点:#{computer_score}点"

if player_score > computer_score
  puts "プレイヤーの勝利です!"
elsif computer_score > player_score
  puts "コンピュータの勝利です!"
else
  puts "引き分けです!"
end

ナインゲームのコードは以上です。楽しんでください^^
コードの解説はこちらを参照。

【★★★★★】モンスター捕獲ゲーム

モンスターを捕獲するシンプルなゲームを作成しましょう。

ゲームには3種類のモンスターが登場します。それぞれのモンスターはサイコロを振り、プレイヤーも同じようにサイコロを振ります。

サイコロの出目を競い、プレイヤーがモンスターの出目を上回るとモンスターを捕まえることができます。ただし、プレイヤーがモンスターに負けた場合はゲームオーバーになります。

ゲームを進める中で、すべてのモンスターを捕まえることを目指しましょう。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

モンスター捕獲ゲームを始めます!
スライムが現れた!
スライムがサイコロを振った。出目は 3
サイコロを振りますか? (yes/no): yes
プレイヤーがサイコロを振った。出目は 4
スライムを捕まえた!
ゴブリンが現れた!
ゴブリンがサイコロを振った。出目は 6
サイコロを振りますか? (yes/no): yes
プレイヤーがサイコロを振った。出目は 2
ゴブリンを捕まえられなかった。ゲームオーバー!
捕まえたモンスター: スライム
ゲーム終了

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

【Ruby】確認問題5-☆1:モンスター捕獲ゲームを作ろう【Ruby】モンスター捕獲ゲームのコードを書く練習問題。Rubyの基礎を学びながら「モンスタークラス」と「ゲームクラス」を実装し、サイコロの出目でモンスターを捕獲するゲームを体験!クラス設計やランダム値の生成を使った実践的なプログラミングスキルを磨く内容です。...

モンスター捕獲ゲームのコードは↓↓をクリック

モンスター捕獲ゲームのコード
# モンスタークラス
class Monster
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def dice_roll
    rand(1..6) # 1から6までのランダムな数字を返す
  end
end

# ゲームクラス
class MonsterCaptureGame
  def initialize
    @monsters = [
      Monster.new("スライム"),
      Monster.new("ゴブリン"),
      Monster.new("ドラゴン")
    ]
    @captured_monsters = []
  end

  def start_game
    puts "モンスター捕獲ゲームを始めます!"

    @monsters.each do |monster|
      puts "#{monster.name}が現れた!"
      captured = false

      while !captured
        monster_roll = monster.dice_roll
        puts "#{monster.name}がサイコロを振った。出目は #{monster_roll}"

        print "サイコロを振りますか? (yes/no): "
        response = gets.chomp.downcase

        if response == "no"
          puts "次のモンスターへ進みます。"
          break
        end

        player_roll = rand(1..6)
        puts "プレイヤーがサイコロを振った。出目は #{player_roll}"

        if player_roll > monster_roll
          puts "#{monster.name}を捕まえた!"
          @captured_monsters << monster.name
          captured = true
        elsif player_roll == monster_roll
          puts "引き分けでもう一度!"
        else
          puts "#{monster.name}を捕まえられなかった。ゲームオーバー!"
          return end_game
        end
      end
    end

    end_game
  end

  def end_game
    puts "捕まえたモンスター: #{@captured_monsters.join(', ')}"
    puts "ゲーム終了"
  end
end

# ゲーム開始
game = MonsterCaptureGame.new
game.start_game

モンスター捕獲ゲームのコードは以上です。楽しんでください^^
コードの解説はこちらを参照。

【★★★★★】モンスターとのバトルゲーム

この問題では簡単なターン制バトルゲームを作成します。

このプログラムではプレイヤーとモンスターが交互に攻撃を行い、どちらかのHPが0になるまで戦闘が続きます。

プレイヤーは攻撃するか防御するかを選べます。モンスターはランダムな攻撃成功率を持っており、攻撃が成功した場合、プレイヤーのHPが減少します。

またモンスターの攻撃成功率は、成功または失敗によって変化します。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

ゲームを開始します。
次のモンスターの攻撃の成功率は 50% です。
攻撃しますか?防御しますか? (1: 攻撃, 2: 防御): 1
プレイヤーの攻撃: 25 ダメージ
モンスターのHP: 75
モンスターの攻撃: 40 ダメージ
プレイヤーのHP: 60
次のモンスターの攻撃の成功率は 50% です。
...
プレイヤーの勝利!

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

【Ruby】確認問題5-☆2:モンスターとのバトルゲームを作ろう【Ruby】モンスターとのバトルゲームのコードを書く練習問題。プレイヤーとモンスターの戦闘をシミュレートするRubyコードを使って、クラス継承、ターン制バトルのロジックを学べます。共通のCharacterクラスを基盤に、攻撃力や成功率を設定しながらゲームを進行。初心者から中級者まで楽しみながらスキルアップできる内容です!...

モンスターとのバトルゲームのコードは↓↓をクリック

モンスターとのバトルゲームのコード
# 共通のCharacterクラスを定義
class Character
  attr_accessor :name, :attack_power, :hp

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

  # メタプログラミングを使って動的に攻撃力を設定
  def set_power(attack)
    self.attack_power = attack
  end
end

# Playerクラス
class Player < Character
  def initialize(name = "プレイヤー")
    super(name)
  end
end

# Monsterクラス
class Monster < Character
  attr_accessor :attack_success_rate

  def initialize(name = "モンスター", success_rate = 0.5)
    super(name)
    @attack_success_rate = success_rate
  end

  # 攻撃成功率を更新
  def update_success_rate(success)
    @attack_success_rate = success ? 0.5 : [@attack_success_rate + 0.2, 1.0].min
  end
end

# ゲームを開始
puts "ゲームを開始します。"
player = Player.new
monster = Monster.new

# プレイヤーとモンスターの攻撃力を設定
player.set_power(25)
monster.set_power(40)

# ターン制の戦闘
while player.hp > 0 && monster.hp > 0
  # モンスターの次の攻撃の成功率を表示
  puts "次のモンスターの攻撃の成功率は #{(monster.attack_success_rate * 100).round}% です。"
  
  # プレイヤーのターン
  puts "攻撃しますか?防御しますか? (1: 攻撃, 2: 防御): "
  action = gets.chomp.to_i
  if action == 1
    damage_to_monster = player.attack_power
    monster.hp -= damage_to_monster
    puts "#{player.name}の攻撃: #{damage_to_monster} ダメージ"
    puts "#{monster.name}のHP: #{monster.hp}"
  elsif action == 2
    puts "#{player.name}は防御を選択しました。"
  else
    puts "無効な選択です。再度選択してください。"
    next
  end

  break if monster.hp <= 0

  # モンスターのターン
  if rand < monster.attack_success_rate
    damage_to_player = monster.attack_power
    if action == 2
      puts "#{player.name}は防御に成功し、ダメージを受けませんでした。"
    else
      player.hp -= damage_to_player
      puts "#{monster.name}の攻撃: #{damage_to_player} ダメージ"
      puts "#{player.name}のHP: #{player.hp}"
    end
    monster.update_success_rate(true)
  else
    puts "#{monster.name}の攻撃は失敗しました。"
    monster.update_success_rate(false)
  end

  # プレイヤーが防御を選択した場合、モンスターの攻撃成功率をリセット
  monster.attack_success_rate = 0.5 if action == 2
end

# 勝敗判定
if player.hp > 0
  puts "#{player.name}の勝利!"
else
  puts "#{monster.name}の勝利!"
end

モンスターとのバトルゲームのコードは以上です。楽しんでください^^
コードの解説はこちらを参照。

【★★★★★】マルバツゲーム

3×3のマルバツゲーム(Tic Tac Toe)を作成してください。

このプログラムではゲームボードを表示し、プレイヤーが交互に〇または×を入力します。

勝者が決定するかすべてのマスが埋まるとゲームが終了します。

本サイトで紹介するコードを実行すると、↓↓のような出力となります。

1|2|3
ー+ー+ー
4|5|6
ー+ー+ー
7|8|9
〇のターンです。
選択するマスの番号を入力してください(例: 1 ~ 9):
1
〇|2|3
ー+ー+ー
4|5|6
ー+ー+ー
7|8|9
×のターンです。
選択するマスの番号を入力してください(例: 1 ~ 9):
5
〇|2|3
ー+ー+ー
4|×|6
ー+ー+ー
7|8|9
...

いきなりコードを見るのではなく練習問題形式で作成したい人は↓↓をクリック

【Ruby】確認問題5-☆3:マルバツゲーム(Tic-Tac-Toe)を作ろう【Ruby】マルバツゲームのコードを書く練習問題。勝利条件や引き分けの判定を含むゲームの流れを学びながら、条件分岐やループ処理、ミックスインの基礎を身に付けることができます。Rubyを使った簡単なゲームプログラムを通じて、オブジェクト指向の設計やメソッドの使い方を楽しく学べる練習問題です。...

マルバツゲームのコードは↓↓をクリック

マルバツゲームのコード
# ボード表示用のモジュール
module BoardDisplay
  # ボードを画面に表示するメソッド
  def display_board
    @board.each_with_index do |row, i|
      # ボードを「|」で区切り表示(全角「+」を使用)
      puts row.join('|')
      puts "ー+ー+ー" if i < 2 # 行の間に全角の区切り線を挿入
    end
  end
end

# マルバツゲームのメインクラス
class TicTacToe
  include BoardDisplay # モジュールを取り込む(ミックスイン)

  # 初期化メソッド(ゲームの初期状態を設定)
  def initialize
    # 3x3のボードを全角の数字で初期化
    @board = [
      ["1", "2", "3"],
      ["4", "5", "6"],
      ["7", "8", "9"]
    ]
    # 最初のプレイヤーを「〇」に設定
    @current_player = "〇"
  end

  # プレイヤーを交代するメソッド
  def switch_player
    @current_player = @current_player == "〇" ? "×" : "〇"
  end

  # プレイヤーのターンを処理するメソッド
  def player_move
    valid_move = false
    while !valid_move
      puts "#{@current_player}のターンです。" # 現在のプレイヤーを表示
      puts "選択するマスの番号を入力してください(例: 1 ~ 9):"
      move = gets.chomp # 入力を取得
      row, col = find_position(move) # 入力に対応する行と列を取得

      if row && col && valid_move?(row, col)
        @board[row][col] = @current_player # 選択したマスに記号を記入
        valid_move = true # 有効な入力があればループを終了
      else
        puts "その位置には置けません。別の番号を選んでください。"
      end
    end
  end

  # マス番号をボード上の行と列に変換するメソッド
  def find_position(move)
    @board.each_with_index do |row, i|
      col = row.index(move) # 行内で指定された番号を探す
      return [i, col] if col # 見つかった場合はその位置を返す
    end
    nil # 見つからない場合は nil を返す
  end

  # 入力が有効かどうかを判定するメソッド
  def valid_move?(row, col)
    # 指定された位置が現在のボードで数字のままかを確認
    @board[row][col] =~ /[1-9]/
  end

  # 勝利条件をチェックするメソッド
  def winner?
    lines.any? { |line| line.all? { |cell| cell == @current_player } }
  end

  # 引き分け(すべてのマスが埋まった場合)をチェックするメソッド
  def draw?
    @board.flatten.none? { |cell| cell =~ /[1-9]/ } # 数字が残っているか確認
  end

  # 勝利条件を構成するラインを取得するメソッド
  def lines
    @board +                       # 行(横方向)
    @board.transpose +             # 列(縦方向)
    [[@board[ 0][ 0], @board[ 1][ 1], @board[ 2][ 2]], # 左斜め
     [@board[ 0][ 2], @board[ 1][ 1], @board[ 2][ 0]]] # 右斜め
  end

  # ゲームのメインループ
  def play
    game_over = false
    while !game_over
      display_board
      player_move
      if winner?
        display_board
        puts "#{@current_player}の勝ちです!"
        game_over = true
      elsif draw?
        display_board
        puts "引き分けです!"
        game_over = true
      else
        switch_player
      end
    end
  end
end

# ゲームを開始
TicTacToe.new.play

マルバツゲームのコードは以上です。楽しんでください^^
コードの解説はこちらを参照。

Ruby記事トップへ戻る
トップページへ戻る