【Ruby】じゃんけんプログラムの作り方を学ぼう|初心者が学習のアウトプットとしても最適な演習問題に挑戦しよう
開発環境
- Ruby version: ruby 3.1.2
Rubyのじゃんけんプログラムとは
じゃんけんとは、3種類の指の出し方で強弱関係を構成し、その相性により勝ち負けを争う遊びです。 プログラミングにおいて「グー・チョキ・パー」の勝敗を判定する最適なアルゴリズムを考えるだけでなく、オブジェクトをどのように構成するかなども重要になってきます。 そのため、じゃんけんプログラムは簡単なようで奥が深いため、プログラミング初心者だけでなく学習のアウトプットとしても演習問題として主題されることが多いです。 Wikipedia:https://ja.wikipedia.org/wiki/%E3%81%98%E3%82%83%E3%82%93%E3%81%91%E3%82%93
Rubyのじゃんけんプログラムのチュートリアル
じゃんけんプログラムにチャレンジするにあたり、じゃんけんプログラムのルールを定義します。 [st-mybox title="じゃんけんプログラムのルール" fontawesome="fa-check-circle" color="#757575" bordercolor="#BDBDBD" bgcolor="#ffffff" borderwidth="2" borderradius="5" titleweight="bold"]
- 指の出し方は「グー、チョキ、パー」の3種類とする
- 勝敗の結果は「勝ち、負け、あいこ」の3種類とする
- 勝敗にかかわらずじゃんけんは1度のみとする
- プレイヤーに指の出し方を決めさせることとする
- コンピューターはランダムに指の出し方を決めさせることとする
[/st-mybox]
じゃんけんプログラムのサンプルコード
Rubyのじゃんけんプログラムのサンプルコードは下記になります。
1class Janken 2 def initialize() 3 puts "最初はグー、じゃんけん・・・" 4 puts "グーなら0、チョキなら1、パーなら2、を入力してください。" 5 @input = gets.chomp.to_i 6 while @input > 2 7 puts "入力が間違っています。" 8 puts "グーなら0、チョキなら1、パーなら2、を入力してください。" 9 @input = gets.chomp.to_i 10 end 11 end 12 13 def judgement 14 hand_type = ["グー","チョキ","パー"] 15 my_hand = @input 16 pc_hand = rand(0..2) 17 18 puts "あなたは#{hand_type[my_hand]}です。" 19 puts "コンピューターは#{hand_type[pc_hand]}です。" 20 21 if my_hand == pc_hand 22 puts "結果はあいこです。" 23 elsif (my_hand == 0 && pc_hand == 1) || (my_hand == 1 && pc_hand == 2) || (my_hand == 2 && pc_hand == 0) 24 puts "結果はあなたの勝ちです。" 25 elsif (my_hand == 0 && pc_hand == 2) || (my_hand == 1 && pc_hand == 0) || (my_hand == 2 && pc_hand == 1) 26 puts "結果はあなたの負けです。" 27 end 28 end 29end 30 31janken = Janken.new() 32janken.judgement
じゃんけんプログラムの実行結果
Rubyのじゃんけんプログラムの実行結果は下記になります。
1最初はグー、じゃんけん・・・ 2グーなら0、チョキなら1、パーなら2、を入力してください。 30 // プレイヤーが0と入力 4あなたはグーです。 5コンピューターはパーです。 6結果はあなたの負けです。
Rubyのじゃんけんプログラムの解説
じゃんけんプログラムを順番に解説していきます。
じゃんけんクラスを定義する
まず、じゃんけんクラスを定義します。
1class Janken 2 3end
じゃんけんクラスを定義をすることにより、そのなかにどのような処理をするかのロジックをまとめることができます。
じゃんけんに必要な最初の処理をメソッド化する
次に、じゃんけんに必要な最初の処理をメソッド化します。
1 def initialize() 2 puts "最初はグー、じゃんけん・・・" 3 puts "グーなら0、チョキなら1、パーなら2、を入力してください。" 4 @input = gets.chomp.to_i 5 while @input > 2 6 puts "入力が間違っています。" 7 puts "グーなら0、チョキなら1、パーなら2、を入力してください。" 8 @input = gets.chomp.to_i 9 end 10 end
initializeは特別なメソッドですが、「class.new」とすることにより、インスタンスが生成されるときに自動的にinitializeメソッドが呼び出されます。 gets.chomp.to_iで入力を受け付けるようにして置き、入力されたものは@inputへ代入されるようにしています。 また、「0,1,2」以外の数字が入力された場合は正確に判定ができないため、whileメソッドにより「0,1,2」が正確に入力されるまで繰り返し処理を行うようにしておきます。
じゃんけんの勝敗を判定する処理をメソッド化する
次に、じゃんけんの勝敗を判定する処理をメソッド化します。
1 def judgement 2 hand_type = ["グー","チョキ","パー"] 3 my_hand = @input 4 pc_hand = rand(0..2) 5 6 puts "あなたは#{hand_type[my_hand]}です。" 7 puts "コンピューターは#{hand_type[pc_hand]}です。" 8 9 if my_hand == pc_hand 10 puts "結果はあいこです。" 11 elsif (my_hand == 0 && pc_hand == 1) || (my_hand == 1 && pc_hand == 2) || (my_hand == 2 && pc_hand == 0) 12 puts "結果はあなたの勝ちです。" 13 elsif (my_hand == 0 && pc_hand == 2) || (my_hand == 1 && pc_hand == 0) || (my_hand == 2 && pc_hand == 1) 14 puts "結果はあなたの負けです。" 15 end 16 end
じゃんけんクラス内に定義したことにより、クラスのインスタンスオブジェクトに対して「judgement」というインスタンスメソッドを実行することができます。 また、変数hand_typeにじゃんけんの指の形を配列で定義しておくことにより、配列のインデックス番号を入れると指の出し方を決めることができるようにしています。 if文では「あいこ、勝ち、負け」の勝敗を判定することができるように3種類の条件分岐を組み合わせています。
じゃんけんのプログラムを実行する
最後にじゃんけんのプログラムを実行します。
1janken = Janken.new() 2janken.judgement
initializeメソッドにより「class.new」でインスタンスが生成されるときに自動的にinitializeメソッドが呼び出され、変数jankenに代入されている状態です。 その後、代入された変数judgementに対して「janken.judgement」とすることにより、クラスのインスタンスオブジェクトに対してjudgementメソッドを実行することができるという流れになります。
おわりに
Rubyのじゃんけんプログラムのチュートリアルを解説してきましたが、いかがだったでしょうか。 今回はじゃんけん往路グラムの参考として私のサンプルコードをご紹介させていただきましたが、じゃんけんプログラムの処理のやり方は様々です。 また、今回のじゃんけんプログラムのルールは簡単なものにしましたが、さらにプレイヤーが勝利する確率を定義したり、勝率を蓄積したり、プレイヤーが必ず勝てるようにするなどしても面白いです。 もし余裕があれば、是非、じゃんけんプログラムを拡張させた「あっち向いてホイ」にもチャレンジしてみてください。