Ruby ではじめるプログラミング 【第 1 回】

著者:だん

はじめに

Rubyでプログラミングを体験しよう

「これからプログラミングをはじめたい!」

「今までプログラムには興味があったけど難しそうでなかなか手を出せなかった……」

そんな人に Ruby のプログラミングを紹介します。

筆者はゲームプログラマー*1 なので、簡単なゲームプログラムを作りながらプログラムの基本的な部分を連載形式で解説します。この連載では原則として Windows で Ruby を使うことを前提に解説します。 プログラミングははじめてだけど HTML くらいなら知っているというような、ある程度コンピュータを使い慣れている方が対象です。

プログラムは魔法!?

mage_s.png

プログラムはコンピュータを使う人にとって魔法です。その魔法は○○○の血を引いた者にしか使うことのできない摩訶不思議な超能力ではありません。決められたルールを覚えれば誰にでも唱えることのできる呪文です。

この呪文、つまりプログラムとはコンピュータを動かすために人間が作る命令のことです。この命令はコンピュータが理解する特別な言葉です。この言葉を「プログラム言語」といいます。

現在、より簡単で便利にプログラムが作れるようにたくさんのプログラム言語が開発されています。そして、Ruby もプログラム言語のひとつです。Ruby は簡単に楽しくプログラミングできることを目的として開発されました。

Ruby はオブジェクト指向スクリプト言語

dengaku_s.pngRuby は、便利な機能がたくさんあって、いろいろな分野*2で使うことができるとても強力なプログラム言語ですが、簡単な機能を使うだけでも十分にプログラミングを楽しむことができます。また、オブジェクト指向*3を知らなくても大丈夫です。

Ruby はまつもと ゆきひろ氏が中心となって開発しているフリーソフトウェアなので、誰でも無料で使用することができます。

Ruby のインストール

Ruby のインストールにはさまざまな方法がありますが、ここでは One-Click Installer - Windows を使ったインストール方法を紹介します。 Windows 以外の OS にインストールする場合や他のインストール方法を試す場合は Ruby インストールガイドを参考にしてください。

ダウンロード

RubyForge: Project Info- One-Click Ruby Installer のページからダウンロードすることができます。本稿執筆時点での最新版は 1.8.2-14_rc8 です。ここでは ruby182-14_RC8a.exe をダウンロードしたものとして話を進めます。

インストール

ダウンロードした ruby182-14_RC8a.exe を起動してください。英語のインストーラが立ち上がります。

  1. Next を選択してインストールを開始します
  2. ライセンスに同意するなら I Agree を押します
  3. コンポーネントの選択画面になります。このまま Next を押します
  4. インストールディレクトリを決めます。 c:\ruby でよければそのまま Install を押します

Install を押すとインストールがスタートします。無事に終了したら Finish を押してインストーラを閉じます。これでインストールは完了です。

コマンド プロンプトを使う

コマンド プロンプト を起動しましょう。Windows XP なら次の手順で起動することができます。

  1. スタート ボタンをクリック
  2. すべてのプログラム をクリック
  3. アクセサリ をクリック
  4. コマンド プロンプト をクリック

dos.png

コマンド プロンプトが起動したらキーボードから、

ruby -v

と入力して Enter キーを押してください。

ruby 1.8.2 (2004-07-29) [i386-mswin32]

と表示されれば無事にインストールが完了しています。 以降ではコマンド プロンプトを使って Ruby のプログラムを実行することを前提に話を進めます。

コマンド プロンプトで動かす「文字の表示がメインのプログラム」は見た目が地味ですが、基本的な考え方は派手なグラフィックを扱うプログラムも同じです。まずは簡単なプログラムでプログラミングの基礎をマスターしましょう。

はじめてのプログラム

エディタでプログラムのソースを書く

usa_s.png プログラムを実行するにはプログラムが書かれたファイルを作成しなければなりません。 このプログラムが書かれたファイルのことをソースファイルと呼びます。 ただ単にソースと呼ぶこともあります。

ソースファイルはエディタ*4というアプリケーションで作成します。 Windows には「メモ帳」というエディタがはじめから用意されています。プログラムのソースを書くにはあまり便利ではありませんが、今回はこれでも十分です。

hello world

ここでは C:\src というディレクトリ (フォルダ) *5にソースファイルを置くことにします。Cドライブのルートに src というディレクトリを作成してください。src は半角文字にしてください。

エディタ (メモ帳) を起動して次のように入力してください。必ず全ての文字を半角で入力してください。全角のスペースも使わないでください。アルファベットの大文字と小文字も区別されます。

puts 'hello world'

notepad.png

入力し終わったらファイルを C:\src に hello.rb という名前で保存してください。

実行する

コマンド プロンプトを起動します。筆者の環境ではコマンド プロンプトを起動すると、このように表示されています。

C:\Documents and Settings\dan>

まずは作業ディレクトリに移動します。ディレクトリの移動には cd コマンドを使います。

cd \src

と入力して Enter を押してください。 cd とはチェンジディレクトリの意味です。ディレクトリを移動するとコマンド プロンプトに

C:\src>

と表示されるはずです。ではプログラムを実行しましょう。Ruby のプログラムはコマンド プロンプトから次のように入力することで実行できます。

ruby ソースファイル名

次のように入力して hello.rb を実行しましょう。

ruby hello.rb

画面に

hello world

と表示されればプログラムがうまく実行されたことになります。もし、

ruby: No such file or directory -- hello.rb (LoadError)

とエラーメッセージが表示されてしまった場合は、そこに hello.rb というファイルがないということです。もう一度手順やファイル名を確認してみましょう。

基礎

さっそく簡単なプログラムを作って実行してみましょう。

文字を表示する

test.rb というファイルを作成し、次の一行を書き込んでください。

puts 'hello!'

ファイルを作成したら

ruby test.rb

で実行してみましょう。実行すると「 hello! 」という文字列が画面に表示されるはずです。この puts というのは文字を表示するための命令で Ruby ではこのような命令のことをメソッドといいます。

数字を表示することもできます。プログラムを次のように書き換えて実行してみましょう。

puts 2004

こんどは「 2004 」という数字が表示されたはずです。プログラム中に文字列を書く場合は ' (シングルコーテーション) で文字列を囲んでください。 数字は ' で囲まなくても OK です。

日本語の表示

Ruby では日本語を表示することもできます。

puts '日本語を表示します'

ただし、プログラム中で日本語を使う場合、漢字コードを指定しないとプログラムが正しく動作しないことがあります。Windows では通常シフト JIS (SJIS) という漢字コードが使われます。 シフト JIS を使用する場合は、Ruby のオプションに -Ks をつけることで Ruby の認識する漢字コードを指定できます。

ruby -Ks test.rb

漢字コードに EUC を使う場合は -Ke をつけます。UTF-8 を使う場合は -Ku をつけます。

コメントをつける

プログラム中にコメントをつけるには # (シャープ) を使います。コメントはプログラムの実行には影響しないので、コメント機能を使うとプログラム中に好きな事を書き込むことができます。

# このプログラムは画面に 2004 を表示します
puts 2004

Ruby では # から行末までがコメントになるので、このような書き方をすることもできます。

puts 2004 # 画面に 2004 を表示します

プログラムの流れ

次に test.rb を次のように書き換えてください。

puts 1
puts 2
puts 3

プログラムは上から順に実行されていきます。このプログラムを実行すると表示結果はこのようになります。

1
2
3

また、puts の代わりに print を使うと改行を行わずに文字を表示させることができます。print も文字を表示するメソッド (命令) です。

print '今は'
print 11
print '時です。'

test.rb を書き換えてこのプログラムを実行してみましょう。

今は11時です。

このように表示され、今度は改行されませんでした。

このテストプログラムは一瞬のうちに全てが表示されてしまいます。 このくらいの仕事は現代のコンピュータにとって朝飯前なのです。 そこで sleep というメソッドを使って一時的に流れを止めてみましょう。sleep 1 と書くとそこで 1 秒間プログラムが停止します。

print '私は'
sleep 1
print 15
sleep 1
print '歳です。'

このサンプルを実行すると「私は」「15」「歳です。」とそれぞれの文字列が 1 秒おきに表示されます。 sleep 1 の部分でプログラムの流れが 1 秒間止まっているのがわかると思います。 このようにプログラムは上から一行ずつ順番に実行されていきます。

; (セミコロン) で区切ると複数の行を一行にまとめることもできます。

print '私は'     ; sleep 1
print 15         ; sleep 1
print '歳です。'

このプログラムは先ほどのテストプログラムと全く同じように動作します。; で区切られたプログラムは左から順に実行されます。

さらに、このように全ての行を ; でつなげることもできます。

print '私は' ; sleep 1 ; print 15 ; sleep 1 ; print '歳です。'

プログラムには流れがあります。どんなに大きなプログラムでも必ず流れがあり、一行ずつ (一文ずつ) 順番に実行されていきます。今回のサンプルは流れがひとつしかなく、このようなプログラムをシングルスレッド*6と言います。Ruby では明示的にスレッド機能を使わない限り自動的にシングルスレッドのプログラムになります。

変数 (へんすう)

変数はプログラムではとても重要な仕組みで、いろいろな場面で使用します。 ここでは数値や文字列のデータを入れることのできる箱*7のようなものだと考えてください。

a = 1
b = 50

このプログラムでは、a という変数に 1 を、b という変数に 50 を入れています。この、変数にデータを入れる操作を代入と言います。

変数を puts や print 命令 (メソッド) に渡して内容を表示することもできま す。

a = 1
s = 'こんにちは'
puts a # 1 を表示
puts s # こんにちは を表示

変数にはもっと長い名前をつけることもできます。実際はその変数の中身を連想 できるような名前をつけて、プログラムがわかりやすくなるように工夫します。

length = 25
message = ' 南に行くと洞窟があるよ'
print length
puts message

変数名に使うことのできる文字はあらかじめ決められています。最もよく使 うローカル変数は先頭の文字をアルファベットの小文字にして、続く文字にはア ルファベットか数字かアンダースコアを使います。例えばこんな変数名を作るこ とができます。

a
b2
aBc_123_XyZ

メソッドと引数

これまでのテストプログラムに登場した puts 、print、sleep はメソッドと呼ばれます。 puts と print は文字を表示するメソッドです。 sleep はプログラムの実行を一時停止するメソッド*8です。

メソッドの後ろに書くパラメータを引数 (ひきすう) といいます。puts メソッドでは引数に与える文字列や数字によっていろいろな表示を行うことができます。

テストプログラムではメソッドの後ろの () を省略していましたが、メソッドの引数は () で囲むこともできます。

puts('おはようございます')
puts(100)

sleep の引数はプログラムを停止させる秒数です。

sleep 60  # 60秒間停止
sleep(60) # 60秒間停止

演算

hebi_s.gif

プログラムの中では簡単に四則演算を行うことができます。次のプログラムを実行するとそれぞれの演算結果が表示されます。

puts 5 + 5 # 足し算
puts 5 - 5 # 引き算
puts 5 * 5 # かけ算
puts 5 / 5 # わり算

演算と変数を組み合わせて使うこともできます。このプログラムでもそれぞれ puts の引数の演算結果が表示されます。

a = 3
b = 2
puts a + b
puts a - b
puts a * b + 5

演算結果を変数に入れることもできます。

a = 5 + 3
b = a * 2
c = a + b
puts c

かけ算 (*)、わり算 (/) は 足し算 (+)、引き算 (-) よりも先に計算されます。次のプログラムを実行すると 30 が表示されます。

puts 5 + 5 * 5

足し算を先に行いたい場合は () を使います。次のプログラムを実行すると (5 + 5) × 5 の計算結果の 50 が実行されます。

puts (5 + 5) * 5

文字を入力する

これまでは画面に文字を出力 (表示) するプログラムばかりだったので、今度はキーボードから文字を入力できるプログラムを作ってみましょう。

input_value = gets
puts input_value

まずはこのプログラムを実行してみてください。実行したらキーボードから何か文字を入力して Enter キーを押してください。 Enter キーを押すと入力した文字列の下に同じ文字列が表示されたと思います。

今回のプログラムソースにはなにやら見慣れないコードがたくさん出てきましたが、落ち着いてひとつひとつ見ていきましょう。 まず、1 行目の = より右側に注目してください。

gets

というコードがあります。 gets はコマンド プロンプトの端末から文字の入力を求めるメソッドです。 = より左側の input_value はただの変数です。とても偉そうな名前ですが、プログラムをわかりやすくするために格納するデータの内容を示した名前をつけてあります。もちろん input_value を a などの変数名に変えてもプログラムは同じように動作します。

入力された文字列は input_value という変数に代入されます。順序としてはまず gets が実行されて、そこで入力された文字列が input_value に渡されます。 このようなプログラムでは = の右側から実行され、その結果が左側の input_value に代入されます。

gets は文字列の入力処理を行い、入力された文字列を返すメソッドです。メソッドが返す値を戻り値といいます。メソッドの戻り値は = を使って変数に代入することができます。

2 行目は変数 input_value の中身をただ画面に表示しているだけですね。

入力された文字列を数値にして 2 倍する

ちょっと難しくなるのでここは読み飛ばして頂いても結構です。興味ある方は次 のプログラムを見てください。入力された数字を 2 倍して表示するプログラム です。

input_value = gets
num = input_value.to_i
puts num * 2
fat_s.png

プログラムを実行したら、数字を入力して Enter キーを押してください。例え ば 100 と入力すれば 200 という数字が表示されると思います。

このプログラムは 2 行目で入力された文字列を数値 (整数) に変換しています。 変数の内容を数値として計算するにはデータが数値である必要があります。

表示された結果は文字列数値も同じ文字列に見えますが、プログラム中では文 字列と数値は明確に区別されています。gets が返すデータ (戻り値) は文字列に なります。100 と入力しても input_value には必ず文字列の '100' が代入され ます。

そこで 2 行目の

input_value.to_i

で文字列から整数を作り出しています。この to_i はメソッドです。文字列から 数値を作り出すメソッドです。

そして .(ドット) でつながれた to_i は input_value 、つまり '100' という文 字列データに対する操作になります。 (何か文字列).to_i は、その文字列を整 数に変換して返すメソッドです。その戻り値が変数 num に代入されます。つまり、num は 100 になるわけです。

3 行目ではこの整数が格納された変数 num と 2 をかけ算して結果を表示してい ます。

ちなみに、こんな書き方もできます。次のプログラムも文字列と .to_i を使っ た例です。

puts '100'.to_i * 2

少し複雑な話になってしまいましたが、慣れるとプログラムの流れが直感的に見 えてくるようになります。

はじめのサンプルプログラムはこのように書き換えることもできます。num を 省略してしまった形です。

input_value = gets
puts input_value.to_i * 2

input_value を省略してしまうこともできます。最初のプログラムはこの一行だ けでも全く同じ動作をします。

puts gets.to_i * 2

制御構造

前に説明したとおりプログラムには流れがあります。プログラムにはその流れに変化を与えるための制御構造という仕組みがあります。制御構造を使ってプログラムの流れをコントロールしましょう。

if 文を使って条件分岐

if を使うとプログラムを分岐させることができます。プログラムを分岐させるには条件が必要です。 数値が代入されている変数 a があった場合、例えばこのような条件が指定できます。

  • a がある値だったら
  • a がある値でなかったら
  • a がある値より大きかったら

これは if を使ったプログラムの例です。

a = 0
if a == 0
  puts 'a は 0 です'
end

このプログラムでは 2 行目で条件判断が行われます。このとき a の内容が 0 であれば 3 行目の puts メソッドが実行されます。 if 文では if の後に書かれた条件が成立したときだけ if と end に囲まれた部分*9が実行されます。2 行目の条件の部分で a と 0 の間に == が使われています。 この == は a と 0 が等しかったらという意味を表す記号で比較演算子といいます。このプログラムでは1行目で a の中身には 0 がセットされているので if 文の条件が成立し、 3 行目が実行されます。比較演算子にはいくつか種類があります。

== 等しい
!= 等しくない
> より大きい
< より小さい

これは比較演算子に != を使ったプログラムです。

a = 0
if a != 1
 puts 'a は 1 ではありません。a は'
 puts a
 puts 'です'
end

if 文では変数と変数を比べることもできます。

a = 10 ; b = 5
if a > b
 puts 'a は b より大きいです'
end

else を使うと if の条件が成立しなかった時の処理を実行することもできます。

a = 5 ; b = 10
if a > b
 puts 'a は b より大きいです'
else
 puts 'a は b と同じか小さいです'
end

このプログラムでは if の条件が成立しないので else と end にはさまれた puts が実行されます。

while で繰り返し

Ruby のループ処理にはいくつかの方法がありますが、ここでは while を紹介します。 次のプログラムは while を使ってループ処理を行うプログラムです。 2 行目から 5 行目までが while によるループ処理です。

ct = 0
while ct < 5
  puts ct
  ct += 1
end
puts 'ループが終了しました'
puts ct

書き方は if と同じです。 while の後ろに条件を書きます。while と対になる end も必要です。 ct はただの変数です。プログラムが実行されて処理が while の行まで来ると条件判定が行われます。条件が成立するとまず end の一行手前までが実行されます。プログラムの処理が end まで来るとプログラムの流れは while の行にジャンプします。そこでまた条件判定が行われ条件が成立していれば end 手前までの行が実行されます。そしてまた while の行までジャンプして条件判定が行われます。while の後ろの条件が成立している限りはこの繰り返しです。

4 行目にこのような処理があります。

ct += 1

この処理は変数 ct の内容を 1 加算するという意味です。ct には、はじめ 0 が代入されているのでここを通ると ct の内容は 0 に 1 が足されて 1 に変わります。次に通るときは 1 に 1 が足されるので ct の中身は 2 に変わります。また次に通るときにはさらに 1 が足されて ct が 3 に変わります。

while の条件は ct < 5 となっています。つまり ct が 5 より小さければ条件成立です。ct の内容はループする度に 1 ずつ加算されていき ct が 5 になったときに条件が成立しなくなります。するとプログラムは while の行から end の次の行へジャンプします。

無限ループ

次のプログラムでは条件が必ず成立するのでプログラムが終了しません。このようなループを無限ループといいます。 このプログラムを停止させるには Ctrl キーを押しながら C キーを押して Ruby を強制終了させてください。*10

while 1 > 0
  puts 'とまらないよ'
  sleep 1
end

1 > 0 は必ず成立する条件です。これは 100 > 10 でも 5 == 5 でも OK です。また、必ず成立する条件を書く場合、普通は true を使います。

while true
  # 繰り返したい処理
end

これも無限ループのプログラムです。

times を使ったループ

times はある決まった回数だけループさせたいときに便利なメソッドです。次のプログラムは 10 回の繰り返し処理を行います。

10.times do
  # 繰り返したい処理
  puts 'hello'
end

10 の部分には変数を書くこともできます。

じゃんけんゲーム

これまでの知識を使ってじゃんけんゲームに挑戦します。 グー、チョキ、パーのいずれかを出してくるじゃんけんロボットとプレイヤーがじゃんけん対決をして、勝敗結果を表示するプログラムを作ってみましょう。

乱数 (らんすう)

じゃんけんゲームを作る前に乱数という機能を説明します。 じゃんけんロボットはグー、チョキ、パーの三つのうちのどれかひとつを出してきます。 プログラムが実行されるまで何が出されるかわからないようにするために乱数を使用します。

さいころ

puts rand(6) + 1

saikoro_s.png これは 1 ? 6 の数値をランダムで画面に表示するプログラムです。rand(6) は 0 ? 5 の整数をランダムで返します。 rand の引数に1 以上の整数を与えると「 0 以上で 与えた引数 -1 以下の整数」のいずれかの値が取得できます。

次のプログラムでは画面に 0 ? 19 の数値がランダムで表示されることになります。

puts rand(20)

ループを使えばさいころを 10 回繰り返して振ることもできます。

10.times do
  puts rand(6) + 1
end

じゃんけんロボット

じゃんけんゲームを作る前にじゃんけんロボットを作ってみます。じゃんけんロボットはグー、チョキ、パーのいずれかを画面に表示するプログラムです。

   1|puts 'じゃんけん'
   2|sleep 1
   3|r = rand(3) + 1
   4|if r == 1
   5|  puts 'グー'
   6|elsif r == 2
   7|  puts 'チョキ'
   8|elsif r == 3
   9|  puts 'パー'
  10|end

※プログラムの各行の頭にある数字と縦棒は説明しやすくするための行番号なので、プログラムには書き込まないでくださいね。

robo_s.png

3 行目で変数 r に 1 か 2 か 3 のどれかの数字が代入されます。6 行目と 8 行目ではじめてみる elsif というコードがあります。これは 4 行目の if に対応していて 4 行目の if の条件が成立しなかった場合に elsif までプログラムの処理がジャンプしてきます。 elsif の行までくると if 文と同じようにここで条件判定が行われます。つまりこの if から end までの処理はこういう意味です。

  1. r が 1 なら「グー」を表示する
  2. r が 1 ではないときに r が 2 なら「チョキ」を表示する
  3. r が 1 ではなくかつ r が 2 ではないときに r が 3 なら「パー」を表示する

整理するとこういうことです。

  1. r が 1 なら ⇒ 「グー」を表示する
  2. r が 2 なら ⇒ 「チョキ」を表示する
  3. r が 3 なら ⇒ 「パー」を表示する

case と when を使う

先ほどのじゃんけんロボットのプログラムは case 文を使って書くこともできます。

   1|puts 'じゃんけん'
   2|sleep 1
   3|r = rand(3) + 1
   4|case r
   5|when 1 # r が 1 のとき
   6|  puts 'グー'
   7|when 2 # r が 2 のとき
   8|  puts 'チョキ'
   9|when 3 # r が 3 のとき
  10|  puts 'パー'
  11|end

ひとつの同じ変数を何度も == で比較する場合は case 文を使ったほうが便利です。

じゃんけんゲームのプログラム

以下が完成したじゃんけんプログラムです。

   1|puts 'じゃんけんゲーム開始'
   2|sleep 1
   3|
   4|# プレイヤーのじゃんけん入力
   5|puts '何を出しますか?'
   6|puts '1 グー'
   7|puts '2 チョキ'
   8|puts '3 パー'
   9|input_value = gets
  10|
  11|# じゃんけんロボットの処理
  12|robo = rand(3) + 1
  13|case robo
  14|when 1
  15|  puts 'ロボットはグーを出した!'
  16|when 2
  17|  puts 'ロボットはチョキを出した!'
  18|when 3
  19|  puts 'ロボットはパーを出した!'
  20|end
  21|
  22|# じゃんけん結果判定
  23|player = input_value.to_i
  24|case player
  25|when 1
  26|  puts 'あなたはグーを出した!'
  27|  case robo
  28|  when 1 # ロボットがグーなら
  29|    puts '引き分けです'
  30|  when 2 # ロボットがチョキなら
  31|    puts 'あなたの勝ちです'
  32|  when 3 # ロボットがパーなら
  33|    puts 'あなたの負けです'
  34|  end
  35|when 2
  36|  puts 'あなたはチョキを出した!'
  37|  case robo
  38|  when 1 # グー
  39|    puts 'あなたの負けです'
  40|  when 2 # チョキ
  41|    puts '引き分けです'
  42|  when 3 # パー
  43|    puts 'あなたの勝ちです'
  44|  end
  45|when 3
  46|  puts 'あなたはパーを出した!'
  47|  case robo
  48|  when 1 # グー
  49|    puts 'あなたの勝ちです'
  50|  when 2 # チョキ
  51|    puts 'あなたの負けです'
  52|  when 3 # パー
  53|    puts '引き分けです'
  54|  end
  55|else # どの when の条件も成立しなかったとき
  56|  puts 'あなたは何も出さなかった!'
  57|  puts 'あなたの負けです'
  58|end

case 文の中に case 文が入っていることに注意してください。

55 行目の else は 24 行目の case に対応していて変数 player が 1、2、3 ではなかったときに else と end に囲まれた部分が実行されます。

ゲームブックを作る

最後に、今まで紹介した機能を使ってゲームブックプログラムを作ってみました。 まずはこのプログラムを実行してみてください。 選択肢が表示されたら数字を入力してから「Enter」を押してください。

   1|scene = 'opening'
   2|while true
   3|  case scene
   4|  when 'opening'
   5|    puts '3本の分かれ道があります。どの道を進みますか。'
   6|    puts "  1 左の道"
   7|    puts "  2 真ん中の道"
   8|    puts "  3 右の道"
   9|    input_value = gets
  10|    case input_value.to_i
  11|    when 1
  12|      scene = 'left'
  13|    when 2
  14|      scene = 'center'
  15|    when 3
  16|      scene = 'right'
  17|    end
  18|  when 'left'
  19|    puts 'あっ!'
  20|    sleep 1
  21|    puts '落とし穴に落ちてしまいました。'
  22|    puts '〜 GAME OVER 〜'
  23|    exit # プログラムを終了
  24|  when 'center'
  25|    puts '真ん中の道をまっすぐ歩いていくと……'
  26|    sleep 1
  27|    puts '宝箱をみつけました!'
  28|    puts "  1 そのままにしておく"
  29|    puts "  2 あける"
  30|    input_value = gets
  31|    case input_value.to_i
  32|    when 1
  33|      scene = 'leave'
  34|    when 2
  35|      scene = 'ending'
  36|    end
  37|  when 'right'
  38|    puts 'しばらく歩き続けると もとの場所にもどってしまいました。'
  39|    sleep 1
  40|    scene = 'opening'
  41|  when 'leave'
  42|    puts '宝箱には見向きもせず お家に帰りました。'
  43|    puts '〜 GAME OVER 〜'
  44|    exit # プログラムを終了
  45|  when 'ending'
  46|    puts 'パカッ'
  47|    sleep 1
  48|    puts 'まばゆい光があふれだす……'
  49|    sleep 1
  50|    puts '100枚の金貨を手に入れました!'
  51|    sleep 2
  52|    puts '〜 CONGRATULATIONS! 〜'
  53|    sleep 2
  54|    puts '    シナリオ だん'
  55|    sleep 2
  56|    puts '   プログラム だん'
  57|    sleep 2
  58|    puts '      〜 END 〜'
  59|    exit # プログラムを終了
  60|  end
  61|end

乱数を使っていないので、同じ選択肢を選べば毎回同じ結果になります。

exit はプログラムを終了させるメソッドです。

exit 以外はこれまでに紹介した機能しか使っていないのでじっくりソースを読んでみてください。 一行ずつ理解しながら読んでいけば頭の中でプログラムの流れをイメージすることができると思います。

読者のみなさんもこのプログラムを参考にゲームブックプログラムを是非作ってみてください*11。乱数の機能を使えば新たなゲーム性をプラスすることもできるでしょう。

著者について

だん (dan at dgames dot jp)

ゲームメーカーに勤めるゲームクリエイター。

最近までずっとコンシューマーゲームソフトの開発という閉じた世界にいた。この春からこっち、オープンソースというものに興味を持ちはじめオープンソースで面白いゲームが作れないかと開発日記にて試行錯誤している。

Ruby ではじめるプログラミング 連載一覧

*1 プログラムを書いていることが多いのでそう言われますが、自分ではあくまでゲームデザイナーだと思っています!

*2 もちろんゲームだって作れます。

*3 オブジェクト指向プログラミングとはプログラミング技法のひとつです。

*4 エディタとはテキストファイルを編集するツールのことです。

*5 ディレクトリとはフォルダのことです。

*6 流れが複数あるプログラムはマルチスレッドと言います。

*7 実はこのたとえは正確ではありません。 Ruby の世界では、複数の箱に同時に同じデータが入ることがあります。変数とはオブジェクトに付ける名札と言ってもいいかもしれません。

*8 ここでは詳しい解説はしませんが、オブジェクト指向プログラミングにおいてメソッドとはデータに対する「手続き」のことを指します。

*9 上のプログラムでは puts の前にスペースが挿入してありますが、これはプログラムを見やすくするためのものでインデント (字下げ) といいます。インデントをしなくてもプログラムは同じように動作します。

*10 Windows の場合です。例えば Linux ならばターミナル画面で、Ctrl + D です。

*11 このゲームを作るのに一番気を使ったのは sleep です。sleep のタイミングは何度もプログラムを実行しながら調整しました。微妙な数値で印象がガラリと変わってしまうからアプリケーションって不思議ですね。