この連載
では、Ruby(ルビー)というプログラミング言語を使って、本格的
なプログラミングに挑戦
しているよ。前回まではRubyでプログラミングをするための環境
を準備して、簡単
なプログラムをつくってきたね。前回は文字を表示するプログラムだったけど、今回は簡単なゲームをつくってみよう!
Rubyのプログラミング環境は準備できているかな? もし今回初めてこの連載を読んだなら、「Rubyを準備しよう!」を参考に準備してね。
さて、前回学んだことを復習しておこう。まず、プログラミングの流れは、以下のとおりだったね。
- コーディング(エディターで書く)
- プログラムの保存 (プログラムファイルを保存する)
- プログラム実行 (コマンドプロンプトでプログラムを実行する)
そして、「puts」と「print」というメソッド(コンピューターへの命令)を学んだね。「puts」と「print」の違いは覚えているかな? わからなかったら「プログラムをつくってみよう!」を参考にしてね。
1.コイントスゲームをつくろう
まずは、コイントスゲームをつくるよ。コイントスは、例えばサッカーの試合で、コインの表裏
でどちらのチームのボールでキックオフするかを決めるときに使う。審判
がコインを投げているのを見たことがあるかな。このコイントスをプログラムにしてみよう。
まずは、コイントスゲームに必要なメソッドなどを勉強しながら、つくっていくよ。
1.1 デタラメな数字を出してみよう(randメソッド)
randメソッドは「乱数
」というデタラメな数字を出すメソッドだよ。サイコロを振るたびに毎回サイコロの目が変わるように、ゲームの中で宝箱
の中身や、モンスターを出現
する回数を変えるなど、ゲームやシミュレーションで使うと効果的なんだ。
使い方は、引数
(”( )”の中身)を整数
にして、
rand(整数)
のようにすると、0から(整数-1)までの数字の中で、乱数を出してくれるよ。例えば、
rand(10)
とすると、0、1、2、3、4、5、6、7、8、9の中の数字が、等
しい確率
で出てくるんだ。
それでは次のプログラムをつくって実行してみよう。プログラムを保存するフォルダを準備しておいてね。最初につくった「myruby」フォルダでだいじょうぶだ。まずはエディター(TeraPad)で次のコードを書いてみよう。
次に「ファイル」メニューから「名前を付けて保存」を選んで、保存ウィンドウが出たら「保存する場所」が「myruby」、「ファイルの種類」が「Rubyファイル(*.rb)」であることを確認して、ファイル名を例えば「rand.rb」として保存しよう。
ファイルの保存ができたら、いよいよ実行だ。コマンドプロンプトを開こう。開き方は、「myruby」フォルダを開いて、アドレスバーのところに「cmd」と入力して、エンターキーを押せばよかったね。
コマンドプロンプトが開いたら、
ruby rand.rb
とキー入力してエンターキーを押そう。次のようになったかな?
上の実行例では「9」と表示されているけど、みんなの実行結果は、これとは違う数字が出たかもしれないね。でも「0」から「9」までの数字のいずれかが出ているはずだ。これを何回か実行すると、そのたびに出てくる数字が変わるのがわかるね。
でも、コマンドプロンプトで同じコマンドを実行する場合は、毎回「ruby rand.rb」と入力するのは手間がかかるね。これを簡単に行う方法があるんだ。それは、キーボードの右下のほうにあるカーソルキーを使うんだ。
上矢印(↑)キーを1回押すと、1回前のコマンドが表示されるから、そこでエンターキーを押すだけでいいんだ。これを何回か繰
り返してみて、「0」から「9」までの乱数が表示されることを確認してね。
1.2 変数を知ろう
これまでは、プログラムの中で数字や文字列をそのままデータとして使ってきた。でも、プログラムが大きくなったり複雑
になったりしてくると、いちいち数字や文字列をプログラムで記述
していると、ゴチャゴチャになってわかりにくくなってしまう。
そこで、数字や文字列にあらかじめ名前を付けておいて、その名前を使ってプログラムをつくっていくんだ。この数字や文字列を入れる箱を「変数
」と呼ぶよ。
そして、その箱に「変数名」という名前をつけ、これまでの数字や文字列のことを変数が示す「値」と呼んでいる。
これを次のようにイコール記号「=」を使って表現しよう。これを「代入
」と呼ぶよ。
変数名 = 値
それでは変数に値を代入したプログラムをつくってみよう。エディターに次のように書いてみよう。
ここでは変数名としてa、b、cを使った。Rubyでは変数名は小文字のアルファベットで始めることになっているんだ。もちろん一文字ではなく、apple、banana、camp など他の文字を変数名としてもいいよ。
プログラムができたら「hensuu.rb」というファイル名で保存して、さっきと同じように、コマンドプロンプトでこのプログラムを実行してみよう。結果は次のようになったかな?
このプログラムについて説明していこう。
1行目から3行目で、変数a、b にそれぞれ数字の10、20、変数c に文字列の「ルビー」を代入している。
4行目は何も書いてないけど、これはプログラムを見やすくするために入れただけだ。
5~7行目は、ちゃんと変数a、b、cに値が代入されているか、確認しているよ。
8行目はaとbの足し算で、結果は30と表示されている。
9行目はaとbのかけ算で、結果は200と表示されている。
10行目は文字列のかけ算で、「ルビー」が5回表示されている。
1.3 コイントスゲームをつくろう(if文)
それでは、rand メソッドと変数を使ってコイントスゲームをつくってみよう。コインを投げて、コインの表がでたら「表」、裏が出たら「裏」と表示するプログラムだよ。次のようにエディターに書いてみよう。
このプログラムを「coin.rb」というファイル名で保存して、コマンドプロンプトで実行してみよう。実行結果は次のようになったかな? これも、何回か繰り返して、「表」が出たり、「裏」が出ることを確認しよう。
プログラムについて説明しよう。
1行目では、a という変数にrand(2) を代入しているね。前に述べたように、rand(2)は、0か1の乱数が出る。つまり、変数a には、0か1かどちらかの数字が代入されることになる。
3行目から7行目の「if ~else ~end」の部分は、「条件分岐
」と呼ばれる構文
だよ。
3行目のif のあとに条件文が記述されて、条件が成立(「真
」または「true」)すれば、次の行である4行目が実行されて、条件が不成立(「偽
」または「false」)であれば、else に続く6行目が実行される。
7行目のendがこの構文の終わりを表しているよ。
if 条件文
条件文が正しいときに実行する行
else
条件文が正しくないときに実行する行
end
3行目では、ifの後の条件文の「a == 1」は、代入されたa の値が1に等しいかどうかをチェックする。イコール「=」が2つくっついていることに注意してね。これはif 分の条件式であることを示すもので、もしも「a = 1」としてしまうと、1をa に代入する意味になってしまうよ。
そこで、rand(2) の結果、a が1になっていれば、4行目が実行されて「表」の表示がされ、それ以外、すなわちa が0となっていれば、6行目が実行されて「裏」と表示されるわけだ。
もしも、a の値がどっちであるか確認したい場合は、2行目に「puts a」のコードを追加しよう。プログラムを保存して、コマンドプロンプトで実行したら、表、裏以外に何が表示されたかな。
プログラミング上達の技
コイントスゲームのプログラムで、ifとelseとendは行の先頭に書いているけど、4行目と6行目の処理
の部分は半角スペース2字分右にずれていることに注目して欲しい。これは「字下げ」または「インデント」と言って、if 文の構造をわかりやすく表現することにより、処理の流れ(ロジック)を明確
にして、ミスを減らすことにもなるんだね。
最後に、Rubyで重要なのは、7行目の「end」は絶対忘れないこと! これがないとプログラムを実行したときにエラーが出るよ。それに、もっと複雑
なプログラムをつくっていくと、if構文や他の構文をたくさん使うこともある。「end」があるとどこが区切りかがわかるね。わかりやすいプログラムにするためにも大事なので、気をつけよう!
2 おみくじゲームをつくろう(if文の応用)
コイントスゲームで使ったif 文を応用して、おみくじゲームをつくってみよう。プログラムを実行すると「大吉」、「中吉」、「小吉」のどれかが表示されるゲームだ。
それでは、エディターに、次のプログラムを書いていこう。完成したら「omikuji.rb」という名前で保存してね。
プログラムの内容を説明するよ。
1行目はおみくじを引くためのメッセージを表示している。
2行目は初めて出てきた「gets」メソッドだ。これはputs とは逆に、キーボードから入力したキーの文字を受け取るメソッドで、ここでは「おみくじを引いてください。」と表示した後にエンターキーが押されるまで、次のコードを実行するのを待つために使用しているんだ。ちょうどおみくじを引く時間を待っている感じだね。
3行目は、変数kuji にrand(3) の値を代入している。これで0から2までのどれかの値が得られるんだったね。
4行目から10行目までが肝心の条件分岐の部分だ。if の条件文はkuji == 0、すなわちkuji の値が0であれば5行目で「大吉」と表示するね。
6行目のelsif (エルシフ)は、4行目の条件が成立しない場合で、なおかつ kuji == 1 が成立する場合を意味しているんだ。kujiの値が1であれば、7行目で「中吉」が表示されることになる。
8行目のelse はそれ以外だから、2の値の場合に9行目が実行されて「小吉」と表示されることになる。
このように、「if ~elsif ~else ~end」構文は、分岐する条件の数が多い場合に使うことができる。elsif 条件を増やすことによって、分岐する数を増やすことができるので、おみくじの種類を無限
に増やすこともできるんだよ。
ただしelsif を使う場合は、条件の順序
に注意する必要があるよ。もしも順序を間違うとおかしなことになるから、気を付けてね。
それではコマンドプロンプトでプログラムを実行してみよう。次のような画面になったかな。
なお、このプログラムでは、「大吉」、「中吉」、「小吉」が表示される確率を、それぞれ変えることもできるんだよ。この場合、プログラムのどこを修正
するといいか、ぜひトライしてみてね。
(文/株式会社まちづくり三鷹 野口英一郎、竹下麻由)