【プチコン講座】GOTOを捨ててループと関数でかかって来いよ!
こんにちは。継続の錬金術士なおキーヌです。
ブログ毎日更新は131日目になります。
前回「【プチコン講座】関数!作らずにはいられないッ!」で関数の作り方を覚えました。
ごめんなさい!今回もRPG作りとはあんまり関係ないです……
便利すぎてダメプログラマになってしまうGOTO命令についてのお話になります。
コーディングは一切しませんので、ほーん……ぐらいの気持ちでみてあげてください。
GOTOを使いまくってる人はすぐに見てほしいぐらいです。
それではプチコンでRPG作り第3回目を始めましょう。
- ゲームプログラミングをするには関数が必須である理由
- 同じコードを書くのはカッコワルイしダサいのでやめよう
- GOTO命令は麻薬のように後からダメージを受ける危険物
- プログラミングでRPGを作りたいなら関数マスターになろう
ゲームプログラミングをするには関数が必須である理由
前回のおさらいも兼ねています。
結論から言うと、ゲームプログラミングは同じような処理を何回も呼び出すことがあるからです。
もう少し詳しく言うと前回やったマップチップを画面全体に敷きつめる処理を関数化しましたよね。
FORが2重になって小難しいコードになっていました。
あのような複雑なコードって二度と書きたくないですよね。
例えばマップチップを敷きつめた後、敵とエンカウントしてバトルの画面になったとします。
バトルが終わってマップ画面に戻ろうとするときに、
マップ画面に戻る際にまたマップチップを描写する必要があります。
そしてまたあのFORが2重のコードを書かなければいけません。いやですよね。
ゲームループのようにラベルを作ってからGOTOを使って、
マップチップのところに戻ればいいんじゃないの?
って思う方、正解であり間違いでもあります。
なぜ正解なのか、なぜ間違いなのかを説明します。
GOTOを使うことが正解な理由
ラベルをつけておけばGOTOで飛べるのがBASICのいいところですね。
後でも詳しく説明しますがGOTOは自由に好きな時に指定ラベルに飛べるので
一度書いたコードを使いまわしできたり、RPGによくありがちな「はい」「いいえ」の選択肢でいいえを選ぶと、
はいを押すまで無限ループをする通称カンダタループを楽に作ることができます。
他にもアンケートをやり直す場合最初に戻したいときにも使えますね。
便利なのですが、便利すぎるゆえに使いすぎると弊害が生まれてきます。
一番のメリットはGOTOを上手に使えばソースコードが増えないのでファイルサイズ削減ができるのですが、
素人の間はファイルサイズ削減はあまり気にしないでいいと思います。
特にプチコンは普通のBASICの時と違って容量が全然違いますからね。
当時のBASICは容量がかなり少なかったのでGOTOを使わざるを得なかった時もあったかもしれません。
私自身がBASICの時代の人間ではないしBASICそのものを殆ど触ったことが無いのであまり突っ込んだ話はできないのでなんともいえませんが……
GOTOを使うことが間違いな理由
先ほども言いましたが使いすぎると処理の流れがわかりづらいプログラムになります。
これがGOTOによる弊害の1つです。
便利だし使えるんだから使っちゃえばいいじゃん。と思う方は
後のことを考えなければ、もちろん使っても大丈夫です。
だってそういう風に作られているんですから。使うも使わないも自由です。
そしていっぱいGOTOを使って1ヶ月後ぐらいにそのソースコードを見てください。
そして「スパゲッティプログラム GOTO」で検索をかけてみるとGOTOの恐ろしさを理解できると思います。
私はプログラミングを始める前からGOTOに関してはよく耳にしたことがあったので、
ある程度プログラミング慣れてきたときにGOTOを使ってみたのですが便利すぎて恐ろしくなりました。
同じコードを書くのはカッコワルイしダサいのでやめよう
プログラミングのお作法としては同じコードを書くのはナンセンス(ダサい)です。
ほとんど同じ処理をしているのに、なんで2回も書いているの?
それ、関数にすればいいですよね。
プログラミング初心者のコードをみた中級者が言い放ちそうなセリフですね。
上級者にもなると「そこの処理、後から関数にするといいよ」というアドバイスをしてくれます。
実際に仕事でプログラミングをしているときに関数を作るのすらメンドウなときがあって、
1回作ったコードをコピペして特定の数値を変えるだけというコーディングはプロでも時間がないとやってしまいがちです。
そこ以外使いまわすことが無いといったときも私はいまでもやってしまいがちです。
プチコンの話に戻ると、パソコンのようにコピペをするのは楽ではない(BIGだとキーボードあるから楽かな?)ので、
使いまわせそうな処理は必ず関数化しておくべきです。
GOTOを使いまくっている人はGOTO使えばよくない?ってなるかもしれません。
100行程度の小さいプログラムであればそれでも構いませんが、
1000行を越えるプログラムだとデバッグをするときに処理を追うのがとても大変になってきます。
関数化していれば、1行記述して変化させたい値を引数に渡せば終わりです。
最初の時はこのままでいいけどGOTOで戻った時は値も処理もちょっと変えたいとなった場合、
大元のコードにどんどん処理を書いていくことになるのですがそれをしてしまうとどんどんコードが長くなってしまい汚いソースコードになってしまいます。
関数化していればそこに書いていくだけなので本来の処理の場所が見辛くなることはないですね。
GOTO命令は麻薬のように後からダメージを受ける危険物
麻薬と結構大げさに書いてしまいましたが、GOTOを使いすぎると便利すぎて依存してしまいます。
なんでそこ、GOTO使ってるの?って聞くと大抵の人は「こうするほうが楽だから」と答えるはずです。
BASICのしくみだとこうしないとやりたいことができない!
という時に使ってもいいですが、大体の人は楽だから使うんだと思います。
楽することが悪いわけではありません。
プログラマなんて9割が怠惰な人間なので楽するためにプログラムを組んでいるのですから楽するべきなのです。
しかしGOTOでやりたいことは大抵関数やwhile構文やフラグ等の変数を使えば使わずに済みます。
GOTOは古いプログラミング言語にしかありませんし、
プロの世界ではGOTOなんて使おうものなら呆れられるでしょう。
特にチーム開発をする場合、GOTOなんて使おうものならチーム内で争いが勃発してもおかしくないですね(笑)
プチコンの場合は基本的に自分しかコードをみないので大丈夫ですが、
プログラミングレベルが上がった時に後から自分でソースコードを見た時、過去の自分を腹パンしたくなりますよ。
俺!なんでこんなにGOTOつかってんの!って。
もしどうしてもGOTOを使わなければ生きていけない!という状態なのであれば
せめて関数の中だけにしておくべきですね。
1つの関数の中であればどこに処理が飛んだかわかりやすいので特に問題ないです。
GOTOの問題はラベルがあるところにどこでも処理を飛ばすことができると言う点ですね。
昔のBASICはBREAK文がなかったからGOTOを使わざるを得なかった?
スパゲッティプログラムのwikiを見てて分かったのですが、BASICはBREAK文が無くて
ループを抜けるのに使っていたと書かれていました。
最近のプログラミング言語ではbreak構文は普通にありますし、
SMILE BASICにも普通にBREAK文があったのでGOTOを使う意味がそんなに感じられませんでした。
まだプチコンを始めて1週間も経っていないのでGOTOを使わざるを得ないところまでたどり着いていません。
もしかしたらRPGを作っている内にSMILE BASICの仕様上どうしてもできないといった状況に陥るかもしれませんし、
そうなったときはGOTOを使ってみようと思います。
なので基本的に私の作るプログラムはGOTO縛りをしていこうと思います。
縛りを解かざるを得ない時が来たらまたご報告します。
プログラミングでRPGを作りたいなら関数マスターになろう
以上のことからGOTOの危険性と中毒性を分かっていただけただろうか……
もう一度言いますがそのGOTO、ループ関数とユーザー定義関数で書けませんか?
見やすいコードは未来の自分にとっても他人にとっても有意義なものです。
RPGを作るとなるとソースコードの量がすさまじく増えてきます。
最初は良くても後からどんどん見辛いコードになってきて開発が面倒くさくなってしまう前に、
GOTOに甘えるのをやめていきましょう。
もしあなたがGOTOの魔の力にハマってしまっているのであれば、
少しずつGOTOを使わないソースコードに書き換えてみてください。
私が2019年のGW中にJavaScriptで作った簡単なRPGでも1ファイルにコードを詰め込んで1200行を越えていました。
BASICだとクラスという概念もないので更にコード量が増えそうです。
プチコンでも外部ファイルを読み込んで関数を使うことができるみたいなので
出来る限り使いまわす処理は関数化して、メンテナンスしやすいゲーム作りをしましょう!
関数化も大事だけどコメントを付けることはもっと大事
BASICだとカンマ(’)を先頭につけるとコメントアウトされ、その行はプログラムとして認識されなくなります。
プロでもコメントをあまりつけない人もいるので、業務を引き継ぎをかしたときに色々問題が出てきます。
今のうちにコメントを付ける癖をしっかりとつけておきましょう!
プログラミングの8割はコメントをつけることだと私は思っています。
特にBASICはすべて大文字で書かれているので見通しが本当に悪いです。
──RPGを作る前に最低でも関数の作り方とGOTOの危険性を少しでも知って欲しくて第2、第3回をRPG作りをそっちのけにしました。
次回はちゃんとRPGを作っていきましょう。
マップを敷き詰める関数を作れたので、次回はマップデータを作成します。
マップデータを作っておけばそれを読み込んで関数に値を渡せば自動的にマップを表示してくれます。
プチコンには標準でマップエディタを使えるので楽ですね。
なのでマップエディタの使い方を軽く説明して保存したマップデータを読み込むということをやります。
マップエディタの使い方と外部ファイルの読み込みはRPG作りにおいても土台の部分になりますので、しっかりと覚えていきましょう。
それでは