【Ruby】レッスン2-☆3:じゃんけんゲームで条件分岐と乱数を復習しよう

一つ前のページでは数当てゲームを作成しました。
今回は 簡単なじゃんけんゲーム を作っていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
・Lesson2-1:比較演算子と論理演算子を理解しよう
・Lesson2-2:if文による分岐処理を理解しよう
・Lesson2-3:case文による分岐処理を理解しよう
・Lesson2-4:for文による繰り返し処理を理解しよう
・Lesson2-5:while文による繰り返し処理を理解しよう
・Lesson2-6:until文による繰り返し処理を理解しよう
・Lesson2-7:繰り返しを制御しよう
・確認問題2-☆1:ハイアンドロー ゲームを作ろう
・確認問題2-☆2:数当てゲームを作ろう
・確認問題2-☆3:簡単なじゃんけんゲームを作ろう ◁今回はココ
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:オブジェクト指向編
確認問題|条件分岐と乱数でじゃんけんゲームを作ろう

シンプルな「じゃんけんゲーム」を作成しましょう。
プレイヤーとコンピュータがじゃんけんを行い、その結果を表示します。
ゲームはプレイヤーが終了を選択するまで続きます。
以下の要件に従ってコードを完成させてください。
- プレイヤーが「グー」、「チョキ」、「パー」のいずれかを数字で入力できるようにすること。
- コンピュータはランダムで「グー」、「チョキ」、「パー」を選ぶこと。
- プレイヤーの入力とコンピュータの選択を比較し、結果を表示すること。
- ゲームはプレイヤーが終了を選択するまで繰り返されること。
ただし、以下のような実行結果となること。
じゃんけんゲームを始めます! じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2) > 2 あなたの手: パー コンピューターの手: チョキ あなたの負けです!
【ヒント】自力で解くのが難しい人へ
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)1:開始メッセージの出力
2:入力方法の指示メッセージを出力
3:ユーザーの入力を整数に変換し、変数player_choice
に代入
4:ランダムな整数を生成し、変数computer_choice
に代入
5:case文による分岐でプレイヤーの手を判定
□player_choice
が0の場合、「グー」を返す
□player_choice
が1の場合、「チョキ」を返す
□player_choice
が2の場合、「パー」を返す
□ それ以外の場合、「不明な手」を返す
6:case文による分岐でコンピュータの手を判定
□computer_choice
が0の場合、「グー」を返す
□computer_choice
が1の場合、「チョキ」を返す
□computer_choice
が2の場合、「パー」を返す
7:プレイヤーの手を出力
8:コンピュータの手を出力
9:if文でプレイヤーとコンピュータの手が同じかを判定
□ 同じ場合、「引き分けです!」を出力
10:プレイヤーの勝利条件を判定
□ 勝利条件を満たした場合、「あなたの勝ちです!」を出力
11:それ以外の場合
□ 「あなたの負けです!」を出力
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# じゃんけんゲームの開始メッセージ puts "じゃんけんゲームを始めます!" puts "じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2)" # プレイヤーの手を入力 =begin 【穴埋め問題1】 ここでユーザーの入力を整数に変換して、変数player_choiceに代入するコードを書いてください。 =end # コンピュータの手をランダムに決定 =begin 【穴埋め問題2】 ここでランダムな整数を生成し、変数computer_choiceに代入するコードを書いてください。 =end # プレイヤーの手の名前を取得 player_hand = case player_choice =begin 【穴埋め問題3】 プレイヤーの手に応じて "グー", "チョキ", "パー" のいずれかを返すようにcase文を完成させてください。 =end end # コンピュータの手の名前を取得 computer_hand = case computer_choice =begin 【穴埋め問題4】 コンピュータの手に応じて "グー", "チョキ", "パー" のいずれかを返すようにcase文を完成させてください。 =end end # プレイヤーとコンピュータの手を表示 puts "あなたの手: #{player_hand}" puts "コンピューターの手: #{computer_hand}" # 勝敗の判定 =begin 【穴埋め問題5】 ここでプレイヤーとコンピュータの手を比較し、勝敗を表示するif文を完成させてください。 =end
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
この問題の解答例と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
# じゃんけんゲームの開始メッセージ 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
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
じゃんけんゲームの開始メッセージ
puts "じゃんけんゲームを始めます!" puts "じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2)"
puts
はRubyの標準出力に文字列を表示するための命令です。これを使ってゲームの開始を知らせるメッセージや、じゃんけんの手の入力方法についてユーザーに指示を表示します。
プレイヤーの手を入力
player_choice = gets.to_i
gets
はユーザーからの入力を受け取るメソッドで、コンソールに入力された文字列を読み取ります。to_i
を使うことで入力された文字列を整数に変換し、変数player_choice
に代入しています。
この変数は後で勝敗を判定する際に使用されます。コンピュータの手をランダムに決定
computer_choice = rand(3)
rand
はランダムな数値を生成するメソッドです。ここではrand(3)
で0から2までの整数を生成し、computer_choice
という変数に代入します。0が「グー」、1が「チョキ」、2が「パー」に対応し、コンピュータの手をランダムに選びます。
プレイヤーとコンピュータの手の名前を取得
player_hand = case player_choice when 0 then "グー" when 1 then "チョキ" when 2 then "パー" else "不明な手" end
case
文は条件分岐を行うための構文です。ここではplayer_choice
の値に応じてプレイヤーが選んだ手の名前を設定しています。when
節で0、1、2のいずれかの場合に対応する手の名前を返し、それ以外の場合は「不明な手」を返します。コンピュータの手の名前を取得
computer_hand = case computer_choice when 0 then "グー" when 1 then "チョキ" when 2 then "パー" end
先ほどと同様に
case
文を使ってコンピュータの手の名前を決定します。computer_choice
の値に応じて「グー」「チョキ」「パー」のいずれかが選ばれます。プレイヤーとコンピュータの手を表示
puts "あなたの手: #{player_hand}" puts "コンピューターの手: #{computer_hand}"
文字列の中で
#{}
を使うと変数の値を埋め込むことができます。これを式展開と呼びます。puts
を使ってプレイヤーとコンピュータが選んだ手を表示しています。勝敗の判定
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
if
文を使ってじゃんけんの勝敗を判定しています。上記以外の条件はプレイヤーの負けとし、「あなたの負けです!」と表示します。
player_choice == computer_choice
の場合は引き分けとして、「引き分けです!」と表示します。プレイヤーが勝つ条件(例:プレイヤーがグーで、コンピュータがチョキなど)を
elsif
で判定し、該当する場合は「あなたの勝ちです!」と表示します。
まとめ
このじゃんけんゲームのコードではRubyの基本的な入出力操作やランダムな数値生成、case
文を使った条件分岐、if
文による複雑な条件判定など、多くの基礎的な文法を学びました。
これらの文法は他のプログラムにも応用が効く大切なスキルです。
ぜひこのコードを実行しながら学習を進め、Rubyの理解を深めてください。