🍌

Ruby で創る RPG 第六章 RPGを創り始める

2023/12/28に公開


第六章 RPGを創り始める

文字を出力するputs命令

「それじゃあ、環境も準備できたので、作っていきましょうか。」
「うん」と僕は期待に胸を膨らませる。

「それで今から作っていく。RPGの名前はなんていう名前なの。」
「名前はね。『遥かなる未来への旅立ち 失われし伝説を求めて』って言うんだ。」
「おお、凄い。格好いい名前ね。」
「うん、寝ないで考えたんだ。」
「そうなんだ。とってもワクワクするわ。あたしたちの名前も入ってるのね。素敵ね。」
と、お姉さまに褒められ、僕はとっても嬉しい。寝ないで考えたっていうのはちょっとオーバーだけれど、一生懸命考えてよかった。
「それじゃあ、早速それ画面に出してみましょうか。冒険の始まり、オープニング画面ね。」
Rubyではputs と言う命令を使うと画面に文字を出すことができるわ。やってみましょう。」

僕は、先日、遙香お姉様と一緒にインストールしたPulsarと言うエディタを立ち上げ、以下のように打ち込む。


https://github.com/Atelier-Mirai/Ruby_RPG/blob/master/rpg/rpg00.rb

タイピングの練習もばっちりしたので、スムーズに入力できる。

Rubyファイルの拡張子は .rb

「入力できたみたいね。じゃあどんなファイルにしようか?」とお姉様が僕に聞いてくる。
「ロールプレイングゲームだからRPGでどうかな?」
「オッケー、じゃあ rpg.rb という名前にして保存しようか。最後に付ける .rb っていうのは拡張子って言うんだけれど、Rubyで書かれたプログラムって言う意味よ。」
「そうなんだね。わかった。」と僕は、ファイル名を付けて保存する。

ターミナルから実行する

「じゃあ、みっくんが初めて作ったプログラムを実行してみましょう。」
「うん、実行するにはどうするの?」

「実行するときには、次のコマンドを入力すると良いわ。
先頭のドルマークはプロンプトを表す印よ。実際には入力しなくていいの。ruby rpg.rb と入力したらエンターキーを押してね。」

$ ruby rpg.rb

「ターミナルの画面にちゃんとタイトルが表示されたかしら。」
「うん、出たよ。」
「みっくんが作ってはじめてのプログラムだね。遥かなる未来への旅立ち。大冒険の始まりだね。おめでとう。」と喜んでくれるお姉様。僕は幸せ。

もし、うまく動かない時の対処法

「もし、うまく表示されないときには、プログラムを見直してみると良いわ。タイプミスがないかだったり、文字列を出力するためには、ダブルコーテーション(")で囲むのが、Rubyの文法なんだけれど、ちゃんと囲まれているかなど確認してみてね。」
「うん、わかった。」

戦闘シーンを創り始める

「じゃあ、次にRPGの魅力と言ったら、何といっても戦闘シーンよね。戦闘シーンを作ってみましょうか。」
とお姉さまに促され、僕はコーディングを始める。

「こんな風かなぁ。」







https://github.com/Atelier-Mirai/Ruby_RPG/blob/master/rpg/rpg01.rb

プレイヤーの入力を受け取る gets命令

「とても素敵ね。すごく雰囲気出てきたね。」
「じゃあ、もっと雰囲気を出すために、プレイヤーの入力を待ってから、戦闘シーンを始めるようにしましょうか。」
「うん、そうだね。どんなふうにするの?」
「キーボードからの入力を受け取るには、gets と言う命令を使うわ。get は得るという英単語で、最後のsはString 文字列の s よ。」
「そうなんだ。どんなふうに使えばいいの?」
「そうね。ここではエンターキーが押されたら、戦闘シーンが始まるようにしたいから、そのまま gets するだけでいいかも。」
「じゃあ、こんなふうかな?」と僕は書き換えて見る。

https://github.com/Atelier-Mirai/Ruby_RPG/blob/master/rpg/rpg02.rb

「ええ、素敵ね。」

画面を消す方法

「ぐっと雰囲気出てきたわね。」
「うん、そしてどんどん画面に文字がいっぱいになってしまうんだけれど。。。」
「ターミナル画面で clear ってタイプすると消えるわ。」
お姉さまに言われ、clear ってタイプする僕。
「うん、消えたよ。これで、もう一度、ruby rpg.rbってタイプすればいいんだね。」
「ええ、そうよ。」
「うん、綺麗に始まったよ。そしてこれ、毎回タイプしないといけないのかな?」
「そうね。ちょっと面倒よね。シェルコマンドっていうのだけれど、Rubyから、clearっていう命令を与えることもできるわ。」
「どうやるの?」
「プログラムの先頭に system "clear" って書いてみて」
そう、お姉様に教えられ、プログラムを書き換える僕。
「ほんとだ。きれいになった。」
「ええ、良かったわね。」
「あと気になるのがこの灰色の四角なんだけれど・・・」
「あぁそれね。それはここから入力するのよと促してくれているカーソルなんだけれど、確かにちょっと邪魔になるわよね。tput civis って、ターミナルに打ち込んでみて。」
「うん、やってみる。」
「お〜。消えて消えた。スッキリしたよ。」
「良かったわね。これも、Rubyから消すことができるわ。」
system "tput civis"って、書くといいわ。この先頭に書いた system っていうのが、ターミナルへの命令なの。」
「うん、わかった。」

コメント

「それから、Rubyにはコメントって言う機能もあるわ。直接実行されるプログラムではないので、絶対に書かなかればならないってものではないのだけれど、どういう処理をしているのか、自分用のメモでもいいし、未来の自分へのメッセージにもあるわ。」
「うん、そうなんだね。」
「書いたときには、どういうことを考えて書いたのか覚えているけれども、しばらくすると忘れてしまうもの。そういった時にコメントがあると思い出しやすくなるし、ところどころ説明書きがあるとプログラム全体が読みやすくなるわ。」
「うん、わかった。どんなふうに書くの?」
「先頭にシャープ#をつけて、その後は何でも自由に書くことができるの。」
「うん、書いて見るね。こんな風でいいのかな。」

https://github.com/Atelier-Mirai/Ruby_RPG/blob/master/rpg/rpg03.rb

「ええ、そうね。素敵!」
お姉さまは、僕の頭を撫でてくれた。僕はとってもうれしい。

バージョン管理について

「少しずつ進んできたわね。 これからもどんどんプログラムを変えていくことになると思うんだ。今のみっくんにはちょっと早いのだけれど、バージョン管理システム って紹介しておくね。」
「バージョン管理って何?」
「みっくんはファイルの最後に番号をつけているのね。」
「うん、rpg00.rb, rpg01.rb, rpg02.rb って順番に付けているよ。昨日作ったのを間違って消してしまわないように、コピーして番号を変えているんだ。たくさん増えると思うから、00って、先頭に0を付けたんだ。そうしたら、99になるまで文字数も一緒だし。」
「素敵ね。とっても良い工夫だわ。簡単にできて分かりやすくていいものね。」
「今のうちはそれで充分だわ。そしてねバージョン管理システムっていうのを使うと、例えば昨日作ったプログラムの方が良かったから、そっちに戻したいとか、間違って消してしまったから戻したいとか、 ちょっと思いついたことがあるから、新しい機能を追加したいんだけれど、元のプログラムを壊してしまう心配だなぁとか思ったりすることあると思うんだ。そういう時にバージョン管理システムを使っていると、元のプログラムはそのままにして、ちょっと実験したりとか、そういうことができるようになるのそうなんだ。」
「そうなんだね。難しいの?」
「そうね。基本的な機能を使うだけなら数時間も学習したら使えるようになるわ。」
「そうなんだ〜。」
Git(ギット)って呼ばれるバージョン管理システムが有名だわ。」
「それからね。今作ったプログラムはみっくんのMacの中に保存されているわよね。」
「うん、そうだよ。」
「手元にあるプログラムを、世界中のみんなに公開できるの。」
「うん、なにかいいことあるの?」
「ええ、一人で作っている時でも、うっかり間違って消してしまっても、バックアップ、控えね、の役割を果たしてくれるし、何人かで一緒に作ったりすることもできるの。」
「そうなんだ、とっても良さそうだね。」
「ええ。今はバージョン管理システムっていうものがあるんだなって、頭の片隅でも置いておいてね。このロールプレイングゲームを作り終えたら、また学んでみるといいわ。」

アスキーアート

「じゃあ、戦闘シーンの続きを作っていこうか。」
「うん」
「スライムの登場シーンに絵を表示させて見るのはどうかしら。」
「うん、いいね。どうやってやるの。」
「ええ、アスキーアートと呼ばれる、文字や記号を組み合わせて絵のようにしたものなの。だから今使っているputs命令でいいの。扱いも簡単だし、様々な絵を描くことができるわ。スライムを描いてみてね。
「うん、わかった。一生懸命書いてみるね。」

変数と代入

「それから、スライムが一撃でやられてしまうのね。ヒットポイントを持っていて、何回か斬られると死ぬようにしてみましょうか。」
「うん、わかった。どうやればいいの。」
「まず、スライムのヒットポイントは10だとするわ。」
「うん、それから。」
「先にコンピュータの仕組みをお話ししたの。覚えてるかしら。CPUがあって、メモリがあって、ストレージがある、そういうお話し」
「うん、もちろん覚えているよ」
「計算する頭脳がCPUで、メモリは作業机、ストレージは本棚のようなものだったわね。昔のコンピュータは、メモリの1000番地に納められている数値を読み込んできて、計算結果をまた1000番地に戻す。そんなふうにしてプログラムを書いていたの。」
「そうなんだね。」
「ええ、そうなの。そしてね、さすがに毎回1000番地だったり、1001番地とか番地を覚えているのは大変だわ。コンピュータは覚えていられるけれども、プログラムを作るのは人間だから、もう少し楽に書きたいの。そこでね、メモリに名前をつけることにしたの。1000番の代わりに、ヒットポイントだからHPという名前をつけようという感じね。もっと正確には番地を指し示すラベルのようなものね。」
「そうなんだね。わかったよ。じゃあ、そのヒットポイントを10にするにはどうやって書いたらいいの?」
hit_point = 10って書けばいいわ。そうするとヒットポイントが10って言うふうになるわ。」
「そうなんだね。」
「この hit_point のことを、プログラミングの世界では 変数 って言うわ。」
「数が入るから変数なんだね」
「ええ、そうね。もっとも変数という名前がついているけれど、数だけではなくて文字なんかも入れられるわ。」
「え〜。そうなんだ〜。」
「ええ、もし一匹一匹のスライムに名前を付けたかったら、name = "スライムA" のようにすることもできるわ。英語だと variable 変化する量 っていう意味よ。きっと数が入ることが多いから変数って訳にしたのね。きっと。」
「そうなんだね。数だけじゃなくて文字も入れられるんだね。了解。」
「あと、それから、hit_pointって名前、ちょっと長い気もするんだけれど。」
「そうね。Pulsarは優秀なエディタだから、数文字タイプすると、残りの文字を表示してくれるから苦にはならないけれども、hpもヒットポイントのことだって直ぐに分かるから、hpでもいいかもね。」

四則演算

「うん、わかったよ。じゃぁ、勇者に攻撃されて、HPが3ポイント減るっていうのは?」
hp = hp - 3って書けばいいわ。」
「そうなの? HPはHP-3に等しいって、なんか変じゃない?」
「ええ、そうね。普通の数式として見ると、ちょっと変だわね。HPっていうのは、メモリにつけた名前なの。この=と言う記号なんだけれど、値を設定する、代入するって言うんだけれど、そういう意味だって捉えてね。」
「等しいっていう意味じゃないんだ〜」
「ええ、そうよ。代入する記号なの。キーボードにね、もっといろんな記号があるといいんだけれど、人の指は10本だし、キーボードに載せられるキーの数も限られているわ。なので、プログラムをやっているときに、イコールって言う記号を見たら、代入しているんだなと言うふうに思ってほしいな。」
「わかった。」
「じゃあ、hp = hp - 3 は、HPから3を引いた数をもう一度HPに入れるってこと?」
「ええ、その通りよ。よく理解しているわね。素敵よ。」
「ちなみに、hp を増やすのは、+ を使うといいわ。」
「うん、数学と一緒だね。掛け算や割り算はどうするの?」
「そうね。スライムのhpが二倍になったりはしたら怖いけれど、掛け算したかったら、× はキーボードにないから、代わりに、* を使うの。割り算したかったら、/ね。」
「うん、わかった。」

式展開

「それから、せっかくなのでスライムのヒットポイントも表示させてみたらどうかしら。斬られる度に数値がヒットポイントが減っていくと、戦っている感じが出るわよ。」
「どうやったら、hpを表示できるの?」
puts hpってすれば、hpの値が表示されるわ。」
「うん。簡単だね。」
「ええ、そうね。そして、文字と一緒に表示させたいなら、例えばこんな感じかしら。」
puts "HP:#{hp}"
「これは、どういう意味なの?」
「式展開という書き方なのだけれど、#{hp}って書くと、hpの値を文字の中に埋め込んでくれるの。なので、画面には、HP:10 って表示されるわ。」
「うん、じゃあ、作って見る!」
「ええ、楽しみだわ。出来上がったら教えてね。」

僕は、コツコツ、キーボードをタイプする。そして大迫力の戦闘シーンを作り上げた。

https://github.com/Atelier-Mirai/Ruby_RPG/blob/master/rpg/rpg04.rb

Discussion