目次
開発環境
- 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のじゃんけんプログラムのチュートリアル
じゃんけんプログラムにチャレンジするにあたり、じゃんけんプログラムのルールを定義します。
じゃんけんプログラムのルール
- 指の出し方は「グー、チョキ、パー」の3種類とする
- 勝敗の結果は「勝ち、負け、あいこ」の3種類とする
- 勝敗にかかわらずじゃんけんは1度のみとする
- プレイヤーに指の出し方を決めさせることとする
- コンピューターはランダムに指の出し方を決めさせることとする
じゃんけんプログラムのサンプルコード
Rubyのじゃんけんプログラムのサンプルコードは下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class Janken def initialize() puts "最初はグー、じゃんけん・・・" puts "グーなら0、チョキなら1、パーなら2、を入力してください。" @input = gets.chomp.to_i while @input > 2 puts "入力が間違っています。" puts "グーなら0、チョキなら1、パーなら2、を入力してください。" @input = gets.chomp.to_i end end def judgement hand_type = ["グー","チョキ","パー"] my_hand = @input pc_hand = rand(0..2) puts "あなたは#{hand_type[my_hand]}です。" puts "コンピューターは#{hand_type[pc_hand]}です。" if my_hand == pc_hand puts "結果はあいこです。" elsif (my_hand == 0 && pc_hand == 1) || (my_hand == 1 && pc_hand == 2) || (my_hand == 2 && pc_hand == 0) puts "結果はあなたの勝ちです。" elsif (my_hand == 0 && pc_hand == 2) || (my_hand == 1 && pc_hand == 0) || (my_hand == 2 && pc_hand == 1) puts "結果はあなたの負けです。" end end end janken = Janken.new() janken.judgement |
じゃんけんプログラムの実行結果
Rubyのじゃんけんプログラムの実行結果は下記になります。
1 2 3 4 5 6 | 最初はグー、じゃんけん・・・ グーなら0、チョキなら1、パーなら2、を入力してください。 0 // プレイヤーが0と入力 あなたはグーです。 コンピューターはパーです。 結果はあなたの負けです。 |
Rubyのじゃんけんプログラムの解説
じゃんけんプログラムを順番に解説していきます。
じゃんけんクラスを定義する
まず、じゃんけんクラスを定義します。
1 2 3 | class Janken end |
じゃんけんクラスを定義をすることにより、そのなかにどのような処理をするかのロジックをまとめることができます。
じゃんけんに必要な最初の処理をメソッド化する
次に、じゃんけんに必要な最初の処理をメソッド化します。
1 2 3 4 5 6 7 8 9 10 | def initialize() puts "最初はグー、じゃんけん・・・" puts "グーなら0、チョキなら1、パーなら2、を入力してください。" @input = gets.chomp.to_i while @input > 2 puts "入力が間違っています。" puts "グーなら0、チョキなら1、パーなら2、を入力してください。" @input = gets.chomp.to_i end end |
initializeは特別なメソッドですが、「class.new」とすることにより、インスタンスが生成されるときに自動的にinitializeメソッドが呼び出されます。
gets.chomp.to_iで入力を受け付けるようにして置き、入力されたものは@inputへ代入されるようにしています。
また、「0,1,2」以外の数字が入力された場合は正確に判定ができないため、whileメソッドにより「0,1,2」が正確に入力されるまで繰り返し処理を行うようにしておきます。
じゃんけんの勝敗を判定する処理をメソッド化する
次に、じゃんけんの勝敗を判定する処理をメソッド化します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def judgement hand_type = ["グー","チョキ","パー"] my_hand = @input pc_hand = rand(0..2) puts "あなたは#{hand_type[my_hand]}です。" puts "コンピューターは#{hand_type[pc_hand]}です。" if my_hand == pc_hand puts "結果はあいこです。" elsif (my_hand == 0 && pc_hand == 1) || (my_hand == 1 && pc_hand == 2) || (my_hand == 2 && pc_hand == 0) puts "結果はあなたの勝ちです。" elsif (my_hand == 0 && pc_hand == 2) || (my_hand == 1 && pc_hand == 0) || (my_hand == 2 && pc_hand == 1) puts "結果はあなたの負けです。" end end |
じゃんけんクラス内に定義したことにより、クラスのインスタンスオブジェクトに対して「judgement」というインスタンスメソッドを実行することができます。
また、変数hand_typeにじゃんけんの指の形を配列で定義しておくことにより、配列のインデックス番号を入れると指の出し方を決めることができるようにしています。
if文では「あいこ、勝ち、負け」の勝敗を判定することができるように3種類の条件分岐を組み合わせています。
じゃんけんのプログラムを実行する
最後にじゃんけんのプログラムを実行します。
1 2 | janken = Janken.new() janken.judgement |
initializeメソッドにより「class.new」でインスタンスが生成されるときに自動的にinitializeメソッドが呼び出され、変数jankenに代入されている状態です。
その後、代入された変数judgementに対して「janken.judgement」とすることにより、クラスのインスタンスオブジェクトに対してjudgementメソッドを実行することができるという流れになります。
おわりに
Rubyのじゃんけんプログラムのチュートリアルを解説してきましたが、いかがだったでしょうか。
今回はじゃんけん往路グラムの参考として私のサンプルコードをご紹介させていただきましたが、じゃんけんプログラムの処理のやり方は様々です。
また、今回のじゃんけんプログラムのルールは簡単なものにしましたが、さらにプレイヤーが勝利する確率を定義したり、勝率を蓄積したり、プレイヤーが必ず勝てるようにするなどしても面白いです。
もし余裕があれば、是非、じゃんけんプログラムを拡張させた「あっち向いてホイ」にもチャレンジしてみてください。