この連載
では、Ruby(ルビー)というプログラミング言語を使って、本格的
なプログラミングに挑戦
しているよ。
前回はおみくじゲームをつくったけど、みんな遊んでみたかな? 乱数
や変数
といった考え方も学んだよね。今回は、変数をさらに使いこなして、すごろくゲームをつくっていこう。
1 前回のおさらい
前回は、乱数というデタラメな数を出すメソッド(randメソッド)や、数字や文字列にを入れる箱に名前をつけ、その名前でプログラムをつくっていく「変数」という考え方を学んだね。
randメソッドは、「0から(整数-1)までの数字の中で、乱数(デタラメな数字)を出すもの」だったね。
rand(整数)
変数は、値を変数に代入
して、プログラムの中で変数を扱
っていたね。
変数名 = 値
そしてコイントスゲームやおみくじゲームをつくりながら、「if文」というプログラムの構文
を学んだよ。
if 条件文
条件文が正しいときに実行する行
elsif 条件文
直前のelsifより前の条件文がすべて正しくなく、
直前のelsifの条件文が正しいときに実行する行
else
条件文が正しくないときに実行する行
end
if文はとても重要
な構文なので、しっかり復習
しておこう。
2 サイコロを振るプログラムをつくろう
今回つくるすごろくゲームは、サイコロを振って、サイコロの目の数だけマスを進んでゴールを目指すよ。何回サイコロを振ればゴールできるかな?
すごろくゲームをつくる前に、まずはサイコロのプログラムをつくってみよう。
2.1 式展開を知ろう
サイコロのプログラムをつくるときには、「式展開
」という方法を使うよ。式展開では変数を使うけれど、ここでの変数は代入ではなく、変数に入っている値を呼び出して表示している。
例として、1冊110円のノートを5冊買う場合の合計金額
を求めて表示させるプログラム 「goukei.rb」を考えよう。これまでに学んだ考え方から、エディターで次のようにプログラミングしたよ。
これを保存して、コマンドプロンプトで実行
してみた。すると、次のような結果になったよ。
このように、「nedan * kosuu」の計算結果でなく、「nedan * kosuu」も文字列として表示されてしまうんだ。そこで、「nedan * kosuu」の計算結果を表示させるために、「式展開」という方法を使う。
式展開は、プログラムを書くときに、変数や式の部分を「#{ }」で囲
むよ。つまり、文字列の部分を「”金額は #{nedan * kosuu} です。”」とすれば、求める金額を表示させることができるんだ。
それでは、エディターで「goukei.rb」を次のように修正して、改めてコマンドプロンプトで実行してみよう。
実行結果は、次のようになったかな?
2.2 サイコロの目の合計数を表示してみよう
それでは式展開を使って、2個のサイコロを振ったときに、出た目と合計を表示するプログラム「saikoro.rb」をつくってみよう。
それでは、「saikoro.rb」のプログラムをくわしく見てみよう。
1行目、2行目は前回つくった「omikuji.rb」と同じように、エンターキーを入力させるためのメッセージ表示だ。ただし、文字列の前後が「” (ダブルクォート)」ではなく、「’ (シングルクォート)」になっていることに注目して欲しい。Rubyでは、「単なる文字列の表示」であれば、シングルクォート、ダブルクォートのどちらも使うことができるんだ。
でも、5行目のように「式展開を含んでいる文字列」はダブルクォートでなければならない。もしもシングルクォートにすると、#{me1},#{me2},#{me1 + me2 } の部分が、そのまま表示されてしまうんだ。式展開を使う場合は注意してね!
プログラミングのポイント
単なる文字列の表示:「’ (シングルクォート)」「” (ダブルクォート)」どちらでもOK
式展開を含んでいる文字列:「” (ダブルクォート)」のみ
3行目、4行目では、rand(6)で0から5までの乱数を出し、1を加えてサイコロの目を出しているよ。
また、別の方法でサイコロの目を表すこともできるよ。randメソッドの引数
(( )の中)を(1..6)と表記するんだ。この「..」は「範囲演算子
」といって、rand(1..6) は1から6までの乱数を取り出すことを表すよ。
このプログラムの実行例は次のようになるよ。試してみてね。
3 すごろくゲームをつくろう
サイコロを振るプログラムができたら、それを応用してそれではゴールをめざす「すごろくゲーム」をつくってみよう。まず、ゲームのルールを次のように決めるぞ。
<ゲームのルール>
・すごろくのマス目を20個とする
・サイコロを振って目の出た数だけマス目を進む
・マス目が20に達
したらゴールして終了する
このルールに基
づいて、プログラム「sugoroku1.rb」をつくっていこう。
それでは、「sugoroku1.rb」の内容をくわしく見てみよう。
1行目は、最初にマス目の数を指定しているんだ。Masu とMが大文字になっていることに注目して欲しい。これは変数ではなく、「定数
」というものだ。変数がプログラムの中で計算されたりして値を変えていくのに対して、定数はプログラムの中でずっと値を変えない使い方をするときに代入するよ。すごろくゲームでは、ゴールまでのマス目は変わることがないから、定数を使うんだ。
プログラムのポイント
定数とは、プログラムの中でずっと変わらない値
2行目は、20個のマス目の何番目に自分がいるか示す変数で、最初の値(「初期値
」)をスタートの0にしているんだね(ゴールは20になるね)。
4行目は初めての表現で、「while ~end」構文といって、4行目のwhile の後の条件文がtrue (真
、正しい)である間はずっと、15行目のend までの処理
を繰
り返す構文だ。
while 条件文
条件文が正しい間、この行を繰り返し実行する
end
ただし、条件文には注意が必要だよ。例えば、次のプログラムを見てみよう。
これは、aが1だから、whileの後のa > 0はずっと正しいことになる。結果として永遠
に「1」を表示し続ける、いわゆる無限
ループになってしまうよ。
これを避
けるためには、処理の中でなんらかの形で、条件文がfalse (偽
、正しくない)になるようにプログラムをつくる必要があるんだ。例えば、次のプログラムを見てみよう。
このプログラムでは、変数a の初期値は1で、while 条件の中でa が5以下である間、3行目からの処理が繰り返される。
3行目:puts a でaを表示する。
4行目:a= a+1で、右側のa+1 が先に計算されて、その結果が左側のaに再代入されるんだ。つまり、aが1の時、a+1の結果がaに代入される。
つまり3、4行目が実行されるたびにa の値は2、3、4、5と増えていって、a が6になったところでwhile 条件文がfalse になる。するとend に移って終了するというわけだ。結局、この例では1、2、3、4、5と順に表示することになるんだね。
さて、saikoro1.rbの内容にもどろう。
7行目と8行目でwhile 文の条件を決めているよ。
7行目では変数dice にrand(6) +1すなわちサイコロを振って出た目の数値が代入されるね。
そして8行目で自分のいる位置
であるmeを、me = me + dice (今の位置からサイコロの目の数だけ進んだ位置が新しい自分の位置)と計算をさせているんだ。また、この式(me = me + dice)をRubyではme += dice と短縮
できるんだよ。便利
だね。
9行目はさっき学んだ式展開を使ってサイコロの出た目を表示している部分だね。
11行目から14行目のif 文は、すごろくのどのマス目まで進んだか、見てわかるように、進んだマスを■で、残っているマスを□で表示しているんだ。
12行目では、文字列の足し算とかけ算を組み合わせてマスの表示をしているよ。8行目の計算で変数me (今の自分の位置)が増えていき、Masu(ゴールの位置)の値より大きくなったところでwhile条件がfalse となって17行目に進み、ゴールメッセージとマス目の表示がされているね。
構文で注意して欲しいのは、while文の中にif文が入っている形だよ。それぞれの構文でインデント(字下げ)が使われていて構造を見やすく、わかりやすくしていることだ。はじめは慣れないかもしれないけど、たくさんプログラムをつくって少しずつ直していけばいいよ!
このプログラムをコマンドプロンプト実行してみると、実行するたびにマス目が進んでいくね。例えば次のようになるけど(一部表示)、みんなはどうだったかな?
次回は、このすごろくゲームをよりおもしろくしていくよ! しっかり復習しておいてね!
(文/株式会社まちづくり三鷹 野口英一郎、竹下麻由)