ProgateでRubyを学んだ知識を使ってじゃんけんプログラムを作ろう!

じゃんけんプログラムアイキャッチ

この記事を読んでいるあなたは、アパレルからIT業界に転職するために、日々ProgateでRubyの勉強をしていると思います。

でも、本当にRubyのプログラミング力が身についているのか気になりませんか?

それなら、ビギナーが実力をテストするのに最適なじゃんけんプログラムを作って見ましょう。

プログラミングに慣れている人なら3分でできる超簡単なプログラムですので、自身がある人はどれだけ短時間で完成できるかタイムアタックに挑戦してみてください。

yuta
ちなみに、僕が一番最初に挑戦した時には30分かかりました…(笑)

じゃんけんプログラムの条件

rubyアイキャッチ
このじゃんけんプログラムを作成するにあたり、作って欲しい概要をお伝えします。

  • じゃんけんプログラムはコマンドラインで完結させる
  • じゃんけんにおいてユーザーにどの手を出すか選択させる
  • コンピューターの手はランダム関数を使用すること
  • “勝ち”、”負け”、”あいこ”のいずれかの結果になるように作る
  • if/elsif文と条件の組み合わせを使って作る

このプログラムを作成するにあたって、やり方はたくさんあります。今回はわかりやすいようにif/elsif文と条件の組み合わせを使って作って見ましょう。

最初に今回解説するソースコードをお見せします。

じゃんけんプログラムコード

まずはユーザーにどの手を出すか選択させよう

コンピューターと対戦させるには、まず最初にユーザーに”グー”,”チョキ”,”パー”のどれを出すかを選ばさせるようにします。

じゃんけんの時には「最初はグー、じゃんけん…」などと掛け声を言いますよね。

yuta
地域によって掛け声は違うかもしれません

Rubyにおいて画面に文字列を出力させるには、

puts

を使用します。これにより、最初の掛け声は

puts "最初はグー、じゃんけん..."

となリます。

yuta
文字列の部分はクォーテーション「””」or「”」で囲ってくださいね

次に、”グー”,”チョキ”,”パー”の選択肢を作成しましょう。これもputsを使って出力させます。

puts "[0]:グー\n[1]:チョキ\n[2]:パー"

ここでは、”グー”,”チョキ”,”パー”にそれぞれ数字を割り当てています。

0から割り当てているのは、プログラミングの世界において配列の要素は0からはじまるため、それに合わせているからです。(インデックス番号)

また、”\n”は改行を表示させるためのコードで、改行コードと呼ばれます。

yuta
この改行コードはどのプログラミング言語でも共通ですが、使用されているOSで異なります。詳しくはこちら

getsメソッドを使ってユーザーに選択させてみよう

getsメゾットは、キーボードから入力された値を文字列として取得するメソッドです。ただし、そのまま”グー”などを入力してしまうと、

no implicit conversion of 〜(ここの部分はその時発生するエラーによって異なります。) into String (TypeError)

というようなエラーが出てしまいます。これは、「文字列が入力されているけど、このままだと計算できないよ!」と怒られているわけです。

このエラーを回避するために、

.to_i

を使用して文字列を数値(10進数)に変換させます。(.to_iメソッド)

これで準備が整いました。

ユーザーの手をmy_handとして、 gets.to_iメソッドに代入させましょう。

my_hand = gets.to_i

このようになり、実行させると下記のような画面になれば成功です。

じゃんけん入力画面

コンピューターの手がランダムになるようにしよう

次にやることは、コンピューターの手をランダム関数で乱数にすることです。

じゃんけんをする際にいつも相手が同じ手を使ってきたら、つまらないですよね。

そこで、ランダム関数を使用して、プログラムを実行するたびに、コンピューターの手が毎回異なるようにしていきます。

じゃんけんにおける手数は、”グー”,”チョキ”,”パー”の3通り。Rubyの場合は

rand

を使用して乱数にします。コンピューターの手をenemy_handとして代入すると

enemy_hand = rand(3)

とプログラミングすることができますね。

yuta
randについてもっと知りたい方はこちら

if/elsifを使って条件を分岐させてみよう

あいこをプログラミングするには?

さて、ここからはどのプログラミング言語でも必ず出てくるif/elsif文を使用して、条件分岐させてみましょう。

if文は上から順番に処理が実行されますので、まずは一番難しい処理の”あいこ”から処理をさせるようにします。

if my_hand == enemy_hand

ここで使用しているのが、「==」という比較演算子です。これは、左の値と右の値が同じであるかを調べる演算子でしたね。

“あいこ”はユーザーとコンピューターの手が同じである場合に成立するので、上記のようにプログラミングすることができます。

elsif文を使用してユーザーがコンピューターに勝った時をプログラミングする

次に、ユーザーが手を出した時に、コンピューターに勝つ時の条件をプログラミングしましょう。if文は”あいこ”ですでに使用したので、elsif文を使います。
「もしユーザーとコンピューターがあいこ出なく、勝っていたら処理を実行する」というようなプログラムを作りたい時に使用するのがelsif文でしたね。


elsif (my_hand == 0 && enemy_hand == 1) ||
(my_hand == 1 && enemy_hand == 2) ||
(my_hand == 2 && enemy_hand == 0)
puts "あなたの勝ちです!"

じゃんけんで勝つ時の条件は、

  • グーを出した時に、相手がチョキ・・・ my_hand == 0 && enemy_hand == 1)
  • チョキを出した時に、相手がパー・・・my_hand == 1 && enemy_hand == 2
  • パーを出した時に、相手がグー・・・my_hand == 2 && enemy_hand == 0

ですね。ここでも比較演算子の「==」を使用していることに注目してください。また、複数の条件を組み合わせることができる「&&(かつ)」を使用して、

ユーザーがグー、かつ、コンピューターがチョキ

というようなプログラミングを行うことができます。

ユーザーがコンピューターに勝つ条件は3通りあるので、「||(または)」を使用することで条件を連結させることが可能です。

ユーザーが負ける時の表現はelse文を使う

最後は、ユーザーがコンピューターに負ける時の条件をプログラミングしましょう。勝った時と同じように、「&&」や「||」を使うのかな?と思うところですが、
実はそんなことをする必要はありません。

この負けるという条件は、

  • 「あいこ」
  • 「勝つ」

のいずれにも当てはまりませんよね。そんな時はelse文を使えば


else
puts "あなたの負けです!"

これだけのコードを書くだけで済みます。意外と初心者がハマりやすい部分なので、覚えておいてくださいね。

最後に

冒頭でも一度紹介しましたが、最終的なコードは次のようになります。

じゃんけんプログラムコード

初心者でもこのように実行できるプログラムができるようになると、プログラミングを学ぶのがもっと楽しくなると思います!

Googleで「Ruby 演習問題」などと検索すると、たくさん出てくるので参考にしてみてくださいね!

ちなみに、僕が一番オススメするサイトはこちら!

https:https://www.yukisako.xyz/entry/ruby-practice

大学生の迫さんは、学生でありながらもブログだけで月40万円以上稼ぐすごい人。

プログラミングにも精通しており、特にこのruby問題集は取り組むだけでかなりの実力がつきます。

興味のある方は是非チャレンジして見てください!

この記事を作成するにあたり、以下のサイトを参考にさせていただきました。

https:https://docs.ruby-lang.org/ja/latest/method/String/i/to_i.html

https:https://qiita.com/aamonaamon9/items/7de49e4881ee07e24248

https:https://www.xmisao.com/2014/03/30/how-to-pick-randomly-from-an-array.html

https:https://qiita.com/jnchito/items/dedb3b889ab226933ccf

https:https://qiita.com/prgseek/items/4140ea928be40f55c68e
https:https://teratail.com/questions/23696
https:https://www.sejuku.net/blog/16134
https:https://www.rsch.tuis.ac.jp/~ohmi/ruby/gets.html

https:https://www.sejuku.net/blog/16134

https:https://qiita.com/Konboi@github/items/e53296e99e297f83cfd1

https:https://qiita.com/ya6maDev/items/dc2f4704fddaaaa07f5e
https:https://tech-camp.in/note/1481/