【完全ガイド】Rubyで作る!ボーリングゲームコード7選

ボーリングゲームを描いたイラストとRubyのロゴマークRuby
この記事は約16分で読めます。

 

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

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

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

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

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

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

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

はじめに

皆さん、プログラミング言語Rubyを使って、ボーリングゲームを作成してみませんか?

この記事では、Rubyでボーリングゲームを作るための完全ガイドを初心者でもわかる形でご紹介します。

詳細なサンプルコード、使い方、注意点、そしてカスタマイズ方法まで解説します。

●Rubyとは

Rubyは、プログラマーの生産性と楽しさを重視したプログラミング言語です。

オブジェクト指向言語として設計され、柔軟な文法を持っています。

○Rubyの特性

Rubyは、読みやすく、書きやすいコードを実現するための特性が多く含まれています。

例えば、明確な文法、ガベージコレクション、動的型付けなどが挙げられます。

これらの特性により、RubyはWebアプリケーションの開発やスクリプト作成に広く使用されています。

○Rubyのインストール方法

Rubyのインストールは非常に簡単です。

WindowsではRubyInstallerを、MacではHomebrewを利用してインストールすることが一般的です。

Linuxユーザーはパッケージマネージャを利用します。

●ボーリングゲームの基本概念

ボーリングゲームは、プレーヤーがボールを投げてピンを倒し、スコアを競うゲームです。

1ゲームは10フレームで構成され、各フレームで2回の投球が可能です。

特別なルールとしてストライクとスペアが存在します。

●Rubyでボーリングゲームを作るための基本要素

Rubyでボーリングゲームを作るには、いくつかの基本要素を理解する必要があります。

○変数とメソッド

Rubyでは、変数を使ってデータを保存し、メソッドを使って一連の処理を実行します。

変数には、局所変数、インスタンス変数、クラス変数などがあります。

○配列とハッシュ

配列は、複数のデータを順序付けて保存するためのデータ構造です。

ハッシュは、キーと値のペアを保存するデータ構造です。

ボーリングゲームでは、フレームやスコアを管理するためにこれらを使用します。

○制御構文

制御構文は、プログラムの流れを制御するための文法です。

Rubyではif、while、forなどの制御構文が提供されています。

これらの基本要素を利用して、ボーリングゲームのコードを作成していきましょう。

●ボーリングゲームのロジックを理解する

ボーリングゲームのロジックを理解するためには、ゲームの基本ルールから始めましょう。

ボーリングはフレームと呼ばれる10の区分けで構成され、各フレームでプレーヤーは最大2回の投球を行います。

○フレームとスコア計算

1フレーム目から9フレーム目までは、1回目の投球で全てのピンを倒すとストライク、2回目の投球で全てのピンを倒すとスペア、それ以外はオープンフレームとなります。

スコア計算は、フレームで倒したピンの数に加え、ストライクとスペアでは次の1〜2投のピンを加算します。

10フレーム目は特例として、ストライクまたはスペアを出した場合、追加投球が可能です。

○ストライクとスペアの取り扱い

ストライクは全てのピンを1回の投球で倒したときに獲得できます。

ストライクの場合、次の2投のピンをスコアに加算します。スペアは2回の投球で全てのピンを倒したときに獲得します。

スペアの場合、次の1投のピンをスコアに加算します。

●Rubyでのボーリングゲームの実装

それでは、Rubyを使ってボーリングゲームを作成していきましょう。

初めにフレームを作成することから始めます。

○サンプルコード1:フレーム作成

下記のコードはフレームを作成するコードを紹介しています。

この例では配列を使用して10フレームを生成し、各フレームは2投の結果を格納するための配列として初期化しています。

frames = Array.new(10) { Array.new(2) }

このコードを実行すると、framesは10フレームのボーリングゲームを表現する二次元配列になります。

これにより、フレームごとの投球結果を格納する準備が整います。

○サンプルコード2:スコア計算

ボーリングゲームのスコア計算の仕組みをコードに落とし込んでみましょう。

このコードではframesの各要素を操作してスコア計算を行います。

スコアはフレームごとに計算され、その結果はscore変数に加算されます。

score = 0
frames.each_with_index do |frame, index|
  frame_score = frame.sum
  if frame_score == 10 && frame.size == 1  # ストライク
    next_frame = frames[index + 1]
    frame_score += next_frame.sum
    frame_score += frames[index + 2].first if next_frame.size == 1
  elsif frame_score == 10  # スペア
    frame_score += frames[index + 1].first
  end
  score += frame_score
end

上記コードでは、各フレームのスコアが10であればストライクかスペアかを判断します。

その後、ストライクなら次の2投、スペアなら次の1投のスコアを加算します。

フレームのスコアを計算後、最終的なスコアに加えます。

これにより、ボーリングゲームのスコア計算が実現されます。

○サンプルコード3:ストライクとスペアの取り扱い

ボーリングゲームでは、ストライクとスペアには特別なルールがあります。

ストライクとスペアが発生した場合の処理をコードに反映させてみましょう。

def strike_or_spare_bonus(frame, next_frame, after_next_frame)
  if strike?(frame)  # ストライク
    bonus = next_frame.sum
    bonus += after_next_frame.first if next_frame.sum == 10
  elsif spare?(frame)  # スペア
    bonus = next_frame.first
  else
    bonus = 0
  end
  bonus
end

def strike?(frame)
  frame.first == 10
end

def spare?(frame)
  frame.sum == 10 && !strike?(frame)
end

このコードでは、ストライクとスペアを判断するためのヘルパーメソッドstrike?spare?を定義しています。

また、ストライクとスペア発生時のボーナススコアを計算するためのメソッドstrike_or_spare_bonusも定義しています。

これにより、ストライクとスペア時のスコア計算が可能になります。

○サンプルコード4:ゲームの進行

ボーリングゲームの進行を制御するには、フレームと投球のループ制御が重要となります。

下記のコードでは、各プレイヤーがフレームごとに2回投げることを示しています。

10.times do
  frame = []
  2.times do
    pins = throw_ball
    frame << pins
    break if pins == 10  # ストライクだった場合は次の投球はスキップ
  end
  frames << frame
end

このコードでは、まず10回のフレーム投球を行う外側のループを作ります。

次に、各フレームでの2回投球を行う内側のループを作ります。

投球処理はthrow_ballメソッドで行い、その結果をフレームに追加します。

また、ストライク(全ピン倒し)が出た場合はそのフレームの次の投球をスキップします。

これにより、ボーリングゲームの基本的な進行を表現できます。

○サンプルコード5:ゲームの終了と勝者判定

ボーリングゲームは10フレーム終了時にゲームが終了し、その時点で最もスコアが高いプレイヤーが勝者となります。

下記のコードでは、ゲームの終了と勝者判定を行うロジックを紹介します。

def game_over?(frames)
  frames.size == 10
end

def winner(players)
  players.max_by { |player| player[:score] }
end

このコードではgame_over?メソッドでゲームが終了したかどうかを判断します。

フレームの数が10になればゲーム終了です。

また、winnerメソッドでは最もスコアが高いプレイヤーを勝者として選びます。

これらのメソッドを利用することで、ゲームの終了と勝者判定を行うことが可能になります。

○サンプルコード6:例外処理

Rubyでは、特定の状況下で発生するエラーを例外として扱うことができます。

ボーリングゲームにおいては、例えばピンの数が0未満や11以上になるなど、通常発生しない状況を例外として扱うことが可能です。

下記のコードは例外処理を実現するものです。

def throw_ball
  pins = rand(11)
  if pins < 0 || pins > 10
    raise "ピンの数が不正です。"
  end
  pins
end

このコードではthrow_ballメソッドを用いて、ランダムに0から10までのピンの数を生成します。

もしピンの数が0未満または11以上になった場合、”ピンの数が不正です。”というメッセージを持つ例外を発生させます。

この例外は、呼び出し元でrescueを用いて補足し、エラーメッセージを表示させるなどの処理を行うことが可能です。

例外処理は、プログラムが予期しない状態に陥った際にそれを補足し、適切に対処するための重要な機能です。

特にゲームの開発においては、プレイヤーの入力値が不正な値であった場合や、予期しない操作が行われた場合など、さまざまな例外状況が考えられます。

例外処理を適切に設計し、用いることでこれらの状況に柔軟に対応し、ゲームの安定した動作を保つことが可能になります。

○サンプルコード7:ボーリングゲームの全体コード

これまでに見てきた、ボーリングゲームの各部分のコードを組み合わせることで、ボーリングゲームの全体のコードを構築することが可能になります。

# 省略:プレイヤー設定、スコア計算、ゲームの進行、ゲーム終了と勝者判定、例外処理

10.times do
  frame = []
  2.times do
    pins = throw_ball
    frame << pins
    break if pins == 10
  end
  frames << frame
end

while !game_over?(frames)
  players.each do |player|
    frame = []
    2.times do
      pins = throw_ball
      frame << pins
      break if pins

 == 10
    end
    player[:frames] << frame
    player[:score] = calculate_score(player[:frames])
  end
end

winner = winner(players)
puts "#{winner[:name]}が勝者です。最終スコア:#{winner[:score]}"

このコードでは、ボーリングゲームを制御するための全体的なフローを示しています。

プレイヤーの投球、スコアの計算、ゲームの進行、勝者の判定という一連の流れを表現しています。

最終行では、ゲームの勝者とそのスコアを表示します。

以上のようなコードを組み合わせることで、Rubyを用いてボーリングゲームを実装することが可能となります。

各部分のコードはそれぞれ独立していますので、自分のニーズに合わせて適宜カスタマイズすることも可能です。

このコードを実行すると、各プレイヤーが10フレーム分の投球を行い、それぞれのスコアが計算され、最終的にスコアが最も高いプレイヤーが勝者として表示される結果が得られます。

●Rubyでボーリングゲームをカスタマイズする方法

Rubyで作成したボーリングゲームは、簡単なカスタマイズによって、更に魅力的で楽しいものになります。

初心者でも簡単にできるカスタマイズ例をいくつか紹介します。

○カスタム例1:プレーヤー名の追加

まずはプレーヤーに名前を付けて、スコアボードに表示させる方法です。

このコードでは、ハッシュにプレーヤー名を追加して、それを表示する簡潔な方法を示しています。

# プレイヤーの情報を持つハッシュ
players = [
  {name: 'プレーヤー1', frames: [], score: 0},
  {name: 'プレーヤー2', frames: [], score: 0}
]

# スコアボードにプレーヤー名を表示
players.each do |player|
  puts "#{player[:name]}のスコア:#{player[:score]}"
end

この例では、プレイヤーの情報を持つハッシュにnameキーを追加し、各プレーヤーの名前を格納しています。

そして、ゲームの進行中にスコアボードにプレーヤー名とともにスコアを表示しています。

○カスタム例2:複数プレーヤー対応

次に、複数のプレーヤーが同時にプレイできるようにゲームをカスタマイズする方法です。

def game_over?(players)
  players.all? {|player| player[:frames].length == 10}
end

# 各プレーヤーが10フレーム投げるまでゲームを進行
while !game_over?(players)
  players.each do |player|
    frame = []
    2.times do
      pins = throw_ball
      frame << pins
      break if pins == 10
    end
    player[:frames] << frame
    player[:score] = calculate_score(player[:frames])
  end
end

このコードでは、game_over?メソッドを用いて全プレーヤーが10フレーム投げ終えたかどうかを判定し、それに応じてゲームを進行させています。

○カスタム例3:スコアボードのビジュアルアップグレード

最後に、スコアボードの見た目を向上させるカスタマイズを紹介します。

def display_scoreboard(players)
  puts "---------------------------------"
  puts "| 名前 | フレーム 1-10  | 合計 |"
  puts "---------------------------------"
  players.each do |player|
    print "| #{player[:

name]} | "
    player[:frames].each {|frame| print frame.sum.to_s.rjust(2) + " | "}
    puts player[:score].to_s.rjust(2) + " | "
  end
  puts "---------------------------------"
end

このコードでは、display_scoreboardメソッドを定義し、スコアボードのビジュアルを向上させています。

各プレーヤーの名前、各フレームのスコア、合計スコアを表示します。

これらのカスタマイズを適用すると、プレーヤー名の追加、複数プレーヤー対応、スコアボードの見た目の向上という3つの改善が実現されます。

これにより、Rubyで作成したボーリングゲームがより楽しく、視覚的にも分かりやすくなります。

●Rubyでボーリングゲームを作る際の注意点と対処法

Rubyでボーリングゲームを作る際には、いくつかの注意点があります。

これらを理解し、対処法を学ぶことで、より高品質なコードを書くことができます。

まず、ボーリングゲームではストライクとスペアの計算が特殊なルールになっています。

この点を理解し、適切にコードに反映することが重要です。

下記のコードは、ストライクとスペアのスコア計算を行う簡単な例です。

def calculate_score(frames)
  score = 0
  frames.each_with_index do |frame, i|
    # ストライク
    if frame[0] == 10
      score += 10
      if frames[i+1]
        score += frames[i+1][0]
        score += frames[i+1][1] if frames[i+1][1]
      end
    # スペア
    elsif frame.sum == 10
      score += 10
      score += frames[i+1][0] if frames[i+1]
    else
      score += frame.sum
    end
  end
  score
end

このコードでは、ストライクとスペアを判断し、それに応じたスコアの計算を行っています。

スペアの場合、次のフレームの1投目を加え、ストライクの場合は次のフレームの2投目までを加えます。

このように、ボーリングゲームの特殊なルールを理解し、コードに反映することが重要です。

また、ボーリングゲームをプログラムで表現する際には、各フレームでの投球結果を適切に保持することが必要です。

これには配列やハッシュなどのデータ構造をうまく活用することが求められます。

さらに、Rubyの特性を理解し、それを活かすことも大切です。Rubyは動的型付け言語であり、柔軟なコーディングが可能です。

しかし、その柔軟性が原因で起こるバグを防ぐためには、型の理解と適切な扱いが必要です。

最後に、コードのリーダビリティを保つことも重要です。

適切なインデントやコメント、変数名の付け方など、コードの可読性を高めるためのテクニックを活用しましょう。

これらの注意点と対処法を理解し、適用することで、Rubyでボーリングゲームを作成する際に、より品質の高いコードを書くことができます。

まとめ

この記事では、Rubyを用いてボーリングゲームを作成する方法とそのカスタマイズについて解説しました。

また、ボーリングゲームの特殊なスコア計算やRubyの特性を活かしたプログラミングの注意点と対処法についても詳しく説明しました。

これらの知識を身につけることで、初心者でもRubyでボーリングゲームのコードを書くことが可能です。

初めてプログラミングに取り組む人でも理解しやすいよう、サンプルコードを詳しく解説し、それぞれの部分がどのように動作するのかを理解できるようにしました。

さらに、実際にコードを書いて動かす際の注意点や対処法を提供することで、スムーズにプログラミングに取り組むことができます。

この記事がRubyでのボーリングゲーム作成の一助となり、より深くプログラミングを理解するきっかけとなることを願っています。

ボーリングゲームのコードを書くことは、プログラミングスキルを磨くだけでなく、ゲームの楽しさを体験することもできます。

Rubyはその柔軟性と表現力により、初心者から上級者まで幅広く利用されているプログラミング言語です。

ボーリングゲームの作成を通して、Rubyの魅力を存分に体感してください。

これからもプログラミング学習に励む皆様の一助となる情報を提供してまいります。