すごろくゲームをつくろう①

 この連載
(れんさい)
では、Ruby(ルビー)というプログラミング言語を使って、本格的
(ほんかくてき)
なプログラミングに挑戦
(ちょうせん)
しているよ。

 前回はおみくじゲームをつくったけど、みんな遊んでみたかな? 乱数
らんすう
変数
へんすう
といった考え方も学んだよね。今回は、変数をさらに使いこなして、すごろくゲームをつくっていこう。

1 前回のおさらい

 前回は、乱数というデタラメな数を出すメソッド(randメソッド)や、数字や文字列にを入れる箱に名前をつけ、その名前でプログラムをつくっていく「変数」という考え方を学んだね。

 randメソッドは、「0から(整数-1)までの数字の中で、乱数(デタラメな数字)を出すもの」だったね。

 rand(整数)

 変数は、値を変数に代入
だいにゅう
して、プログラムの中で変数を
あつか
っていたね。

 変数名 = 値

 そしてコイントスゲームやおみくじゲームをつくりながら、「if文」というプログラムの構文
こうぶん
を学んだよ。

 if 条件文
            条件文が正しいときに実行する行
 elsif 条件文
     直前のelsifより前の条件文がすべて正しくなく、
     直前のelsifの条件文が正しいときに実行する行
 else                      
     条件文が正しくないときに実行する行
 end

 if文はとても重要
じゅうよう
な構文なので、しっかり復習
ふくしゅう
しておこう。

2 サイコロを振るプログラムをつくろう

 今回つくるすごろくゲームは、サイコロを振って、サイコロの目の数だけマスを進んでゴールを目指すよ。何回サイコロを振ればゴールできるかな?

 すごろくゲームをつくる前に、まずはサイコロのプログラムをつくってみよう。

2.1 式展開を知ろう

 サイコロのプログラムをつくるときには、「式展開
しきてんかい
」という方法を使うよ。式展開では変数を使うけれど、ここでの変数は代入ではなく、変数に入っている値を呼び出して表示している。

 例として、1冊110円のノートを5冊買う場合の合計金額
ごうけいきんがく
を求めて表示させるプログラム 「goukei.rb」を考えよう。これまでに学んだ考え方から、エディターで次のようにプログラミングしたよ。

110円のものを5個買う場合の金額を求めるプログラム

 これを保存して、コマンドプロンプトで実行
じっこう
してみた。すると、次のような結果になったよ。

コマンドプロンプトでプログラム実行した結果

 このように、「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文が入っている形だよ。それぞれの構文でインデント(字下げ)が使われていて構造を見やすく、わかりやすくしていることだ。はじめは慣れないかもしれないけど、たくさんプログラムをつくって少しずつ直していけばいいよ!

 このプログラムをコマンドプロンプト実行してみると、実行するたびにマス目が進んでいくね。例えば次のようになるけど(一部表示)、みんなはどうだったかな?

すごろくゲームプログラムの実行結果
すごろくゲームの実行結果(一部を表示しているよ)

 次回は、このすごろくゲームをよりおもしろくしていくよ! しっかり復習しておいてね!

(文/株式会社まちづくり三鷹 野口英一郎、竹下麻由)

最新号好評発売中!

子供の科学 2020年 12月号

CTR IMG