Ruby講座|第7回 クラスを使ったサンプルコード(料金表の課題回答編)
皆さん、こんにちは。
しょうとく(@syoucha0107)と申します。
こちらの講座は第3回目の課題の回答につながるものになります。前回の課題を知らずとも、こちら講座だけでも勉強できますのでご安心ください。
Rubyのクラスの学習をしておられる初心者の方に
学習用のサンプルコードとして
お使いいただければと思います。
まずはどんなものを作るかを定義します。
サンプルは、マッサージ店を想定してお客さんにメニューを提示してコースを選択。3名以上が利用した場合は、トータル合計金額から2000円割引を適用。
さらに1名あたりの料金を表示し、その料金が100円未満、つまり10円単位のものは切り捨てて表示。
クラスが記述されたファイル、出力ページが記述されたファイル、rubyファイルを2つに分けて作成。
サンプルソースを写経して実行してみよう
2つのrbファイルを同じ保存場所に配置して実行してみて下さい。
クラス記述ファイル
#ryoukin.rbというファイル名で保存 class Menu attr_accessor :name attr_accessor :price def initialize(name:, price:) self.name = name self.price = price end def info return "#{self.name} #{self.price}円" end def get_total_price(count) total_price = self.price * count if count >= 3 total_price -= 2000 end return total_price end end
出力ページ(外部ファイルを読む)
#ファイル名はお好きなもので保存して下さい。 #ターミナルからこちらのファイル名で実行しましょう。 require "./ryoukin" puts "リラクゼーションマッサージへようこそ" menu1 = Menu.new(name: "足つぼマッサージ", price: 3000) menu2 = Menu.new(name: "小顔リンパマッサージ", price: 5000) menu3 = Menu.new(name: "全身アロママッサージ", price: 8000) menus = [menu1, menu2, menu3] index = 1 menus.each do |menu| puts "#{index}. #{menu.info}" index += 1 end puts "--------------" puts "ご希望のマッサージの番号を入力してください。" order = gets.chomp.to_i selected_menu = menus[order - 1] puts "ご希望のマッサージ: #{selected_menu.name}" puts "何名様でご利用になりますか(3名以上でご利用されると2000円割引)" count = gets.chomp.to_i puts "#{count}名様#{selected_menu.get_total_price(count)}円になります。" puts "1名様につき#{(selected_menu.get_total_price(count)/count).floor(-2)}円(100円未満は切捨て)になります。"
今回の第7回でRuby講座はひとまず終了になります。他の言語の講座もありますので、そちらもぜひ学習してみてくださいね。
Ruby講座|第6回 じゃんけんゲーム「5回勝ったらゲームクリアと表示させるには」
皆さん、こんにちは。
しょうとく(@syoucha0107)と申します。
Rubyプログラミング講座
本日のお題は「じゃんけんゲーム」です。
本日のお題をクリアできると第2回目の課題の答えが導けるようになるはずです。
まずはプレイヤーとコンピューターの対戦で勝ち負けを判定するものを作って行くのですが、表題にある通り、「5回勝ったらゲームクリアと表示させる」という条件を加えてゲーム終了となるものを作ります。
トータルで5回と数を積み上げ、5回に到達するとゲームクリアと表示させる。さあ、あなたならどう記述しますか。
あいこの場合にじゃんけんを再開させるには
ジャンケンと言えば、勝ち負けあいこを判定するゲームですよね。プレイヤーが入力した手の数値と、ランダムで選ばれたコンピューターの手の数値を基準にして、勝ち負けあいこの判定をします。
puts "じゃんけんゲーム" def guchokipa puts "[0]:グー\n[1]:チョキ\n[2]:パー" player_hand = gets.to_i program_hand = rand(3) jankens = ["グー", "チョキ", "パー"] puts "あなたの手:#{jankens[player_hand]}, コンピューターの手:#{jankens[program_hand]}" if player_hand == program_hand puts "あいこで" return true elsif (player_hand == 0 && program_hand == 1)|| (player_hand == 1 && program_hand == 2)|| (player_hand == 2 && program_hand == 0) puts "あなたの勝ちです" return false else puts "あなたの負けです" return false end end next_game = true # じゃんけんを繰り返す while next_game do next_game = guchokipa end
実行結果をみてみましょう。
あいこで再度ゲームをさせて、勝ちでゲームが終了していることがわかります。
トータル5回でゲームクリアと表示させるには
では本題です。
要は、勝ったときに勝ちの回数を積み上げるにはどうすればよいかですね。一例ではありますが、こうなります。
puts "じゃんけんゲーム" puts "トータルで5回勝つとゲームクリアだよ!" def guchokipa puts "[0]:グー\n[1]:チョキ\n[2]:パー" player_hand = gets.to_i program_hand = rand(3) jankens = ["グー", "チョキ", "パー"] puts "あなたの手:#{jankens[player_hand]}, コンピューターの手:#{jankens[program_hand]}" if player_hand == program_hand puts "あいこで" elsif (player_hand == 0 && program_hand == 1)|| (player_hand == 1 && program_hand == 2)|| (player_hand == 2 && program_hand == 0) puts "あなたの勝ちです" return true else puts "あなたの負けです" end end wins = 0 while wins < 5 do if guchokipa wins += 1 end end puts "おめでとうございます。ゲームクリア!!"
返り値を利用して、それをwhile文で判定させてみました。5回に達すれば最後のputsが表示され、ゲーム終了となるものです。
いかがでしたでしょうか。
これからもまた更新していきますので、どうぞまたこのブログに来てやってください。以上です。
Ruby講座|第5回 数当てゲーム「対話入力の値が想定外であった場合」
皆さん、こんにちは。
しょうとく(@syoucha0107)と申します。
今回も初心者向けによく使われる
数当てゲームを作ってRubyを学んでいきます。
実はこの講座を学んでいただけると
第1回目の課題の答えが導き出せるはず。
ゲームを作るにあたり、
まずはこちらの要点をご覧ください。
今回の数当てゲームの難点は、ユーザーが数字以外の入力をした場合です。正しく入力してくださいとエラーメッセージを返すことで、再度入力をうながしてみます。
まずは入力値を条件分岐で表示を分けるところから
難点を考える前にまずは標準入力の値を受け取り、受け取った値に応じて、条件分岐させるものを記述します。
puts "数当てゲーム。0から9までの数字を1つ選んで、数字を当ててみて。"
loop do #loopメソッド number = gets.to_i #getsメソッドはキーボードで入力した値を取得 #to_i 文字列を整数に変換 if number <= 4 puts "入力した数値より大きいよ!" elsif number >= 6 && number <= 9 puts "入力した数値より小さいよ!" else break end end puts "あたり!"
まずは数字だけを入力してみます。
うまくできてます。
ただし・・・下の画像をご覧下さい。
カタカナを入力、そしてスペースや何も入力せずに実行キーを押した場合も「入力した数値より大きい」と返答が帰ってきます。gets.to_iで、文字列を数値に変換した値を受け取るがゆえに表示されたのです。
文字列や記号、スペースキー、空実行、また2桁以上の数字が入力された場合に「1桁の数字以外は入力しないでね。もう一回入力してね。」とエラーメッセージを表示させて、再度入力をうながすにはどうすれば良いのか・・・。
ループの中にさらにループを記述
puts "数当てゲーム。0から9までの数字を1つ選んで、数字を当ててみて。" loop do number = loop do #getsメソッドで入力した値を、文字列で取得 line = gets #to_i 文字列を整数に変換 さらに正規表現で判定する break line.to_i if /^\d$/ =~ line puts "1桁の数字以外は入力しないでね。もう一回入力してね。" end number = number.to_i if number <= 4 puts "入力した数値より大きいよ!" elsif number >= 6 && number <= 9 puts "入力した数値より小さいよ!" else break end end puts "あたり!"
loop do の記述の中に、さらにループの記述している箇所をご覧ください。getsメソッドで入力した値を、文字列で取得して文字列を整数に変換。さらに正規表現で判定させる。
いかがでしたでしょうか。今回はこちらの正規表現の記述に対する理解がそれなりに求められる問題です。正規表現の基礎をきっちり学習したのち、またこの問題を振り返ってみるとより理解が深まります。
Ruby講座|第4回 おみくじゲーム「想定外の入力があった場合」
皆さん、こんにちは。
しょうとく(@syoucha0107)と申します。
普段は社内SEとして働く身であり、
Rubyを普段活用することはないのですが、
手軽にプログラミングを楽しむには
やはり最適な言語で、好みの言語の一つです。
それでは第一回目の投稿の中身は・・・
おみくじゲームです!
テキストによく採用されるサンプルですが、
「想定外の入力があった場合」を仮定して
作成してみました。
Ruby初学者の方の参考になれば幸いです。
まだ数回ほどRubyの記事は予定してます。
是非また見にきていただければと思います。
まず作るにあたり上から順番に
どんな必要となってくるか書いてみました。
・”おみくじだよ。1から5の好きな数字を入れてね。”
→表示はputsで記述します。
・ユーザーからの入力を促す。
→入力値を受け取るコードを記述。
・受け取った数字で、くじの結果を返す。
→数字によって処理を分岐させる。
・想定外の入力は入力をやり直し。
今回のポイントは入力のやり直しですね。
これをどのように実現させるか・・・。
入力のやり直しは後回しにして
まずは入力値の受け取り、
それぞれの入力値で異なるくじの結果を
表示させることをやってみましょう。
puts "おみくじだよ。1から5の好きな数字を入れてね。" number = gets.to_i if number == 1 puts "大吉" elsif number == 2 puts "中吉" elsif number == 3 puts "吉" elsif number == 4 puts "凶" elsif number == 5 puts "大凶" else puts "1から5以外は入力しないでね。もう1回" end
想定外の入力があった時にやり直しをさせるには
皆さんはどのようにお考えになったでしょうか。おそらく上記の画像の赤字に記載した”1から5以外は入力しないでね。もう1回”の下に何かしらの記述をすることで解決できるのではと、考えた方もおられると思います。
ここで検索エンジンでひたすらに調べて答えを出す必要があります。
私なりの答えを出しますと、loopを使ってコードの全体を囲い、想定内の答えが入力されたときは、breakで処理を中断させ、想定外のときはループを発生させることで解決させました。
loop do puts "おみくじだよ。1から5の好きな数字を入れてね。" number = gets.to_i if number == 1 puts "大吉" break elsif number == 2 puts "中吉" break elsif number == 3 puts "吉" break elsif number == 4 puts "凶" break elsif number == 5 puts "大凶" break else puts "1から5以外は入力しないでね。もう1回" end end
あくまでこれは一例に過ぎません。While文で違った記述をしても良いでしょうし、色々な記述の仕方が想定されます。
これまでの手順をyoutubeで公開してます。動画でもぜひ学習してみてください。
いかがでしたでしょうか。テキストなどでRubyを勉強するとき、コードをそのまま書き写したりすることも大事ですが、こんな場合はどのような記述になるのか、疑問に思ったら調べて回答を導き出す行為も、非常に力がつきますのでぜひ試してくださいね。
Ruby講座|第3回 クラスを使ったサンプルコード(料金表)
皆さん、こんにちは。
しょうとく(@syoucha0107)と申します。
初心者様用にクラスを使ったサンプルコードをご用意しました。またまた変なもの作ってしまってすみません・・・。
前回はじゃんけんゲームをやっていただいたわけですが、今回は「料金表」をご用意しました。クラスを使ったプログラムになります。それではまず、今回も3分弱ほどの動画からご覧下さい。
下にコードを貼り付けておきます。
皆様お使いのPCにrbファイルとして保存し、
ターミナルソフトで実行してみましょう。
今回は2つのファイルを使っております。
class Menu attr_accessor :name attr_accessor :price def initialize(name:, price:) self.name = name self.price = price end def info return "#{self.name} #{self.price}円" end def get_total_price(count) total_price = self.price * count if count >= 3 total_price -= 3000 end return total_price end end
require "./ryoukin" menu1 = Menu.new(name: "60分コース", price: 10000) menu2 = Menu.new(name: "90分コース", price: 15000) menu3 = Menu.new(name: "120分コース", price: 18000) menus = [menu1, menu2, menu3] index = 0 menus.each do |menu| puts "#{index}. #{menu.info}" index += 1 end puts "--------------" puts "ご希望のコース番号を選択してください" order = gets.chomp.to_i selected_menu = menus[order] puts "ご希望のコース: #{selected_menu.name}" puts "何名様でご利用ですか(3名以上のご利用で3000円割引)" count = gets.chomp.to_i puts "#{count}名様#{selected_menu.get_total_price(count)}円になります。"
動画でお伝えした課題がこちら!
3名以上の利用の場合
一人あたり1000円割引して
“お一人様「◯◯円」です””
と一人当たりの料金を表示させる
記述に書き換えてください。
動画もしくはブログのコメント欄に回答の記述をお願いします。
Ruby講座|第2回 じゃんけんゲームを作ったらこんなんできました
皆さん、こんにちは。
しょうとく(@syoucha0107)と申します。
前回は数当てゲームをやっていただいたわけですが、今回は「じゃんけん」を用意しました。初心者用のプログラミング教材には、じゃんけんゲームがよく課題に取り上げられるのですが、その教材を活用して私がアレンジ致しました。まずは3分弱ほどの動画をご覧下さい。
下にコードを貼り付けておきます。
皆様お使いのPCにrbファイルとして保存し、
ターミナルソフトで実行してみましょう。
puts "やーきゅうーするならー♪こういう具合にしやさんせ♪" puts "アウト!セーフ!よよいのよい♪" def yakyuuken puts "[0]:グー\n[1]:チョキ\n[2]:パー" player_hand = gets.to_i program_hand = rand(3) jankens = ["グー", "チョキ", "パー"] puts "あなたの手:#{jankens[player_hand]}, 女の子の手:#{jankens[program_hand]}" if player_hand == program_hand puts "あいこで" return true elsif (player_hand == 0 && program_hand == 1)|| (player_hand == 1 && program_hand == 2)|| (player_hand == 2 && program_hand == 0) puts "あなたの勝ちです" return false else puts "あなたの負けです" return false end end next_game = true # じゃんけんを繰り返す while next_game do next_game = yakyuuken end
それでは「本日の課題」がこちら。
じゃんけんゲームを繰り返し
5回以上勝った時、
女の子が全裸になりました
と表示されるようなコード
に修正してみてください。
ブログもしくはyoutubeのコメント欄にて回答をお待ちしております。
答えを知りたい方は第6回目を受講すれば、その回答を導きださせるようになるはずです。
Ruby講座|第1回 数当てゲームを作ったら変なものができた
皆さん、こんにちは。
しょうとく(@syoucha0107)と申します。
プログラミング学習が嫌いな私が、お試しでプログラミング学習講座を作ってみました。
数当てゲームでも作ろうと思ったのですが、中身は思わぬ方向に・・・
私は、過去何度もプログラミング 学習に挫折してきました。真面目にやらなきゃと考えるからつまらない。なら面白くするにはどうしたら良いか・・と考えて私が講座を作ったら、こんなんになっちゃいました(笑) Ruby初学者の方、よかったらこちらで学習してみて下さい。動画学習ができるようyoutubeも配信中です。
loop do puts "私のバストサイズを当ててみて!!" boobs = gets.to_i #getsメソッドはキーボードで入力した値を取得 #to_i 文字列を整数に変換 if boobs < 80 puts "失礼な!もっとあるわ!" elsif boobs >= 80 && boobs < 90 puts "もう少しあるわよ!頑張って当ててみて!" elsif boobs > 90 puts "夢を抱かせてしまってごめんね!" else break end end puts "正解!触ってみる!?"
さて動画でお伝えした通り、
皆様に課題がございます。
・数値以外が入力された場合
・何も入力せずに実行キーを押した場合
正しく表示されるようにコードに追記修正をしてみて下さい。これからも楽しくお勉強していきましょう。
答えが知りたい方は第5回目の講座を受講すると答えが導け出せるようになるはずです。