【Ruby】確認問題3-☆1:石取りゲームを作ろう

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

この記事の練習問題で使用する知識:
基礎文法(レッスン1)比較演算子と論理演算子if文による分岐処理while文による繰り返し処理繰り返しの制御メソッドの定義と使用メソッドの戻り値例外処理

Rubyのゲームコード一覧はこちら

<<前のページ Ruby記事一覧 次のページ>>

確認問題:石取りゲームを作ろう

石取りゲームを作成しましょう。

このゲームではプレイヤーとコンピュータが交互に石を取っていき、最後の石を取った側が負けになります。

プレイヤーは1~3個の石を取ることができ、コンピュータはランダムに1~3個の石を取ります。

例外処理を用いて、プレイヤーが無効な入力をした場合に再入力を促す仕組みを作成してください。

この問題の要件

以下の要件に従ってコードを作成してください。

  1. プレイヤーの入力を受け取るメソッド(get_player_choice)を作成すること。
    • プレイヤーに「取る石の数を入力してください(1から3まで):」と表示する。
    • 入力された値を整数に変換する。無効な入力の場合は例外を発生させ、再入力を促す。
    • プレイヤーが選んだ石の数を返す。
  2. コンピュータの手をランダムに選ぶメソッド(get_computer_choice)を作成すること。
    • 1~3のランダムな整数を生成して返す。
  3. ゲームのメインループ(play_game)を作成すること。
    • 石の総数(total_stones)を10個に設定する。
    • プレイヤーとコンピュータが交互に石を取る処理を実行する。
    • 石の総数が0以下になったとき、最後に石を取った側の負けを表示して終了する。
  4. ゲームの開始と終了を制御するコードを作成すること。
    • プレイヤーがゲームを続けるか終了するかを選択できる仕組みを実装する。
    • ゲーム終了時に「ゲームを終了します。」と表示する。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

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

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:メソッドget_player_choiceの定義
  □ beginによる例外処理の開始
  □ □ 「取る石の数を入力してください(1から3まで):」と出力
  □ □ ユーザーからの入力を整数に変換し、変数choiceに代入
  □ □ choiceが1未満または3を超える場合に例外を発生
  □ rescueによる例外処理の開始
  □ □ 「無効な入力です。もう一度入力してください。」と出力
  □ □ retryで再度入力を求める
  □ 例外処理の終了
  □ choiceを戻り値として返す
2:メソッドget_computer_choiceの定義

  □ 1から3のランダムな数値を生成し戻り値として返す
3:メソッドplay_gameの定義

  □ 変数total_stonesを10に設定
  □ while文によるループ開始(条件:total_stonesが0より大きい)
  □ □ 「残りの石の数: #{total_stones}」と出力
  □ □ メソッドget_player_choiceを呼び出し、戻り値を変数player_choiceに代入
  □ □ 変数total_stonesからplayer_choiceを減算
  □ □ if文による分岐処理開始(条件:total_stonesが0以下)
  □ □ □ 「あなたの負けです。」と出力
  □ □ □ breakでループを終了
  □ □ if文の終了
  □ □ メソッドget_computer_choiceを呼び出し、戻り値を変数computer_choiceに代入
  □ □ 「コンピュータが取った石の数: #{computer_choice}」と出力
  □ □ 変数total_stonesからcomputer_choiceを減算
  □ □ if文による分岐処理開始(条件:total_stonesが0以下)
  □ □ □ 「コンピュータの負けです。」と出力
  □ □ □ breakでループを終了
  □ □ if文の終了
  □ while文の終了
4:変数continue_gameを空文字列として初期化

5:while文によるループ開始(条件:continue_gameが「終了」と等しくない)
  □ メソッドplay_gameを呼び出す
  □ 「ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)」と出力
  □ ユーザーの入力を変数continue_gameに代入
  □ while文の終了
6:「ゲームを終了します。」と出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# プレイヤーの入力を受け取るメソッド
def get_player_choice
  begin
=begin
    【穴埋め問題1】
    プレイヤーに「取る石の数を入力してください(1から3まで):」と表示し、ユーザーの入力を整数に変換して変数choiceに代入するコードを書いてください。
    また、入力値が1未満または3を超える場合に例外を発生させるコードを追加してください。
=end
  rescue
=begin
    【穴埋め問題2】
    無効な入力があった場合、「無効な入力です。もう一度入力してください。」と表示し、retryで再入力を促すコードを書いてください。
=end
  end
  choice
end

# コンピュータの手をランダムに選ぶメソッド
def get_computer_choice
=begin
  【穴埋め問題3】
  1から3のランダムな整数を生成し、その値を返すコードを書いてください。
end
end

# ゲームのメインループ
def play_game
  total_stones = 10  # 石の総数を10に設定
  while total_stones > 0
    puts "残りの石の数: #{total_stones}"
    
    # プレイヤーのターン
=begin
    【穴埋め問題4】
    メソッドget_player_choiceを呼び出し、その戻り値を変数player_choiceに代入し、
    total_stonesからplayer_choiceを減算するコードを書いてください。
    また、total_stonesが0以下の場合に「あなたの負けです。」と表示してループを終了するコードを追加してください。
=end
    
    # コンピュータのターン
=begin
    【穴埋め問題5】
    メソッドget_computer_choiceを呼び出し、その戻り値を変数computer_choiceに代入し、
    total_stonesからcomputer_choiceを減算するコードを書いてください。
    また、total_stonesが0以下の場合に「コンピュータの負けです。」と表示してループを終了するコードを追加してください。
=end
  end
end

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

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

この問題の穴埋めコードは以上です。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

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

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

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

正解コードの解説

このコードはプレイヤーとコンピュータが交互に石を取る「石取りゲーム」を作成しています。

以下にコードの各ブロックを解説します。

プレイヤーの入力を受け取るメソッド

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 ~ end: メソッドを定義する構文です。このメソッドはプレイヤーが取る石の数を入力する処理を実行します。
  • puts: メッセージを表示します。ここでは「取る石の数を入力してください」という指示を出しています。
  • gets.chomp: ユーザーからの入力を取得し、改行を除去します。
  • Integer(): 入力を整数に変換します。整数に変換できない入力は例外を発生させます。
  • raise: 条件に応じて例外を発生させます。ここでは1未満または3を超える値が入力された場合に例外を発生させます。
  • rescue: 例外処理を実行します。無効な入力があった場合にメッセージを表示し、retryで再入力を求めます。

コンピュータの手をランダムに選ぶメソッド

def get_computer_choice
  rand(1..3)  # 1から3の範囲でランダムに選ぶ
end
  • rand(1..3): Rubyでランダムな整数を生成する関数です。ここでは1~3の範囲で乱数を生成します。
  • このメソッドは特にシンプルで、プレイヤーの入力と対照的に自動的な処理を行っています。

ゲームのメインループ

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
  • total_stones = 10: 石の総数を管理する変数を初期化しています。
  • while total_stones > 0: 石が0個以下になるまでループを繰り返します。
  • #{変数名}: 文字列内で変数を展開して値を表示する機能です。
  • if total_stones <= 0: 石がなくなった場合の条件分岐です。
  • break: 条件が満たされた場合にループを終了します。

ゲームの開始と終了制御

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

puts "ゲームを終了します。"
  • continue_game = “”: プレイヤーがゲームを続けるか終了するかを選択するための変数です。
  • while continue_game != “終了”: プレイヤーが「終了」と入力するまでゲームを繰り返します。
  • puts: ゲームを続けるか終了するかを尋ねるメッセージを表示します。

まとめ

このコードでは、例外処理、ランダム数生成、ループ、条件分岐といったRubyの基本的な文法が使われています。

初心者が学ぶべき重要なポイントが多く含まれており、ゲームを通じて楽しくプログラミングのスキルを身に付けることができます。

次のステップとしてこのコードを拡張し、プレイヤーが名前を入力できるようにしたり、スコアを記録したりする機能を追加してみましょう。

Rubyを使ってより面白いプログラムを作成するきっかけにしてください!

Rubyのゲームコード一覧はこちら

<<前のページ Ruby記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Rubyテキスト&問題集へ戻る
    トップページへ戻る