Rubyの初心者向け問題3-☆1:じゃんけんゲームを作ろう
この問題を解くために必要な知識:
【レベル1~2の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)、配列(Array)、ハッシュ(Hash)、コレクション操作(配列、ハッシュの操作)、Enumerableモジュール
【レベル3の知識】
メソッドの定義と呼び出し、メソッドの戻り値、クラスの定義と使用、コンストラクタ、クラスの継承、モジュールの定義と使用、ミックスイン
<<前の問題 | 問題集Top |
次の問題>> |
Ruby練習問題3-☆1:じゃんけんゲームを作ろう
シンプルな「じゃんけんゲーム」を作成しましょう。
プレイヤーとコンピュータがじゃんけんを行い、その結果を表示します。
ゲームはプレイヤーが終了を選択するまで続きます。
この問題の要件
以下の要件に従ってコードを完成させてください。
- プレイヤーが「グー」、「チョキ」、「パー」のいずれかを入力できるようにすること。
- コンピュータはランダムで「グー」、「チョキ」、「パー」を選ぶこと。
- プレイヤーの入力とコンピュータの選択を比較し、結果を表示すること。
- ゲームはプレイヤーが終了を選択するまで繰り返されること。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
じゃんけんの手を入力してください(グー、チョキ、パー): グー コンピュータの手は: チョキ 結果は: あなたの勝ち ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください):
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.get_player_choiceメソッドの定義
1-1. プレイヤーにじゃんけんの手を入力させるためのメッセージを表示
1-2. gets.chomp
でプレイヤーの入力を取得
2.get_computer_choiceメソッドの定義
2-1. じゃんけんの手(”グー”、”チョキ”、”パー”)を配列に定義
2-2. sample
メソッドを使ってランダムにコンピュータの手を選択して返す
3.determine_winnerメソッドの定義
3-1. プレイヤーとコンピュータの手が同じ場合は「引き分け」として返す
3-2. プレイヤーの勝ちの条件を判定し、「あなたの勝ち」と返す
3-3. それ以外の条件では「コンピュータの勝ち」として返す
4.メインのじゃんけんゲームループ
4-1. プレイヤーの手をget_player_choice
メソッドで取得
4-1-1. プレイヤーの入力が「終了」の場合、ループを終了
4-2. プレイヤーの手が「グー」「チョキ」「パー」のいずれかでなければエラーメッセージを表示し、再入力を促す
4-3. コンピュータの手をget_computer_choice
メソッドで取得し、結果を表示
4-4. determine_winner
メソッドを使って勝敗を判定し、結果を表示
4-5. ゲームを続けるか終了するかをユーザーに確認し、「終了」の入力でループを抜ける
5.ゲーム終了メッセージの表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# プレイヤーの入力を受け取るメソッド def get_player_choice puts "じゃんけんの手を入力してください(グー、チョキ、パー):" =begin 【穴埋め問題1】 ここにプレイヤーからの入力を受け取るコードを書いてください。 例:gets.chompで入力を受け取ります。 =end end # コンピュータの手をランダムに選ぶメソッド def get_computer_choice choices = ["グー", "チョキ", "パー"] # 配列を定義 =begin 【穴埋め問題2】 ここにchoicesからランダムに手を選んで返すコードを書いてください。 例:sampleメソッドを使ってランダムに選択します。 =end end # 勝敗を判定するメソッド def determine_winner(player, computer) =begin 【穴埋め問題3】 ここにプレイヤーとコンピュータの手を比較して、結果を返すコードを書いてください。 if文と論理演算子を使います。 =end end # メインのじゃんけんゲームのループ loop do player_choice = get_player_choice break if player_choice == "終了" unless ["グー", "チョキ", "パー"].include?(player_choice) puts "無効な入力です。もう一度入力してください。" next end computer_choice = get_computer_choice puts "コンピュータの手は: #{computer_choice}" result = determine_winner(player_choice, computer_choice) puts "結果は: #{result}" puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)" continue_game = gets.chomp break if continue_game == "終了" end puts "ゲームを終了します。"
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例と解説
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
# メソッドを定義してじゃんけんゲームを実装します # プレイヤーの入力を受け取るメソッド def get_player_choice puts "じゃんけんの手を入力してください(グー、チョキ、パー):" gets.chomp end # コンピュータの手をランダムに選ぶメソッド def get_computer_choice choices = ["グー", "チョキ", "パー"] # 配列を定義 choices.sample # 配列からランダムに1つの要素を選んで返す end # 勝敗を判定するメソッド def determine_winner(player, computer) if player == computer "引き分け" elsif (player == "グー" && computer == "チョキ") || (player == "チョキ" && computer == "パー") || (player == "パー" && computer == "グー") "あなたの勝ち" else "コンピュータの勝ち" end end # メインのじゃんけんゲームのループ loop do player_choice = get_player_choice break if player_choice == "終了" unless ["グー", "チョキ", "パー"].include?(player_choice) puts "無効な入力です。もう一度入力してください。" next end computer_choice = get_computer_choice puts "コンピュータの手は: #{computer_choice}" result = determine_winner(player_choice, computer_choice) puts "結果は: #{result}" puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)" continue_game = gets.chomp break if continue_game == "終了" end puts "ゲームを終了します。"
********************
コードの解説
このプログラムは、プレイヤーとコンピュータが「じゃんけん」を行い、勝敗を決めるゲームです。
それでは、コードの各部分を解説していきましょう。
プレイヤーの入力を受け取るメソッド
def get_player_choice puts "じゃんけんの手を入力してください(グー、チョキ、パー):" gets.chomp end
def get_player_choice
はメソッドの定義です。ここでは、プレイヤーから「グー」、「チョキ」、「パー」のいずれかを入力してもらうためのコードが記述されています。puts
は、画面にメッセージを表示する命令です。gets.chomp
は、ユーザーからの入力を取得し、その末尾の改行を除去するメソッドです。
コンピュータの手をランダムに選ぶメソッド
def get_computer_choice choices = ["グー", "チョキ", "パー"] choices.sample end
choices
という配列を定義し、コンピュータの選べる手(グー、チョキ、パー)を用意します。choices.sample
は、配列choices
からランダムに1つの手を選びます。これにより、コンピュータの手が決まります。
勝敗を判定するメソッド
def determine_winner(player, computer) if player == computer "引き分け" elsif (player == "グー" && computer == "チョキ") || (player == "チョキ" && computer == "パー") || (player == "パー" && computer == "グー") "あなたの勝ち" else "コンピュータの勝ち" end end
determine_winner
メソッドでは、プレイヤーとコンピュータの手を比較し、勝敗を決定します。if player == computer
で引き分けかどうかを判定し、同じ手なら「引き分け」とします。- それ以外は、じゃんけんのルールに基づいて勝ち負けを判定し、勝者に応じたメッセージを返します。
メインのゲームループ
loop do player_choice = get_player_choice break if player_choice == "終了" unless ["グー", "チョキ", "パー"].include?(player_choice) puts "無効な入力です。もう一度入力してください。" next end computer_choice = get_computer_choice puts "コンピュータの手は: #{computer_choice}" result = determine_winner(player_choice, computer_choice) puts "結果は: #{result}" puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)" continue_game = gets.chomp break if continue_game == "終了" end puts "ゲームを終了します。"
loop do
は無限ループを開始する命令で、プレイヤーが「終了」と入力するまでゲームを繰り返します。player_choice = get_player_choice
でプレイヤーの選んだ手を取得し、「終了」と入力されたらbreak
でループを終了します。unless ["グー", "チョキ", "パー"].include?(player_choice)
で、プレイヤーが無効な入力をした場合にエラーメッセージを表示し、再入力を促します。- コンピュータの手を選び、結果を表示した後、ゲームを続けるかどうかを尋ね、終了するかどうかを判定します。
このプログラムは、基本的な制御構文(if
文、loop
文など)とメソッドの使い方を学べる、シンプルで分かりやすいじゃんけんゲームです。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。