いよいよサンプルプログラム7ともこれでおわかれです。
時間をかけてサンプルがどう動いているのか見てきただけあって、今回はけっこうカンタンに話が終わるような気がします。
それだけみなさんもスキルアップしたということです。おめでとう!
前回いきなりサンプル7と関係ないビット演算の話が出てきておどろいたかもしれませんが、ちゃんと今回の話に使いますよ。
それもこれもふくめて、これまでの講座の総まとめです。
泣けるBGMなどをかけながら読んでみてください。
さて、サンプルプログラム7のつくり方はだいたい分かったけれど……
イヨイヨ、このロクでもねえプログラムをマシにカイゾウするってワケだな!
ソコまで言わんでもよかろうに……
いちどロードしなおしておこうか。
- LOAD”SYS/EX7ALIEN”
どこから手をつけたらいいのかな?
マッサキにおかしいトコロと言ったら、ゲームオーバーにならねェとこだろうな。
セイカクには、ゲームオーバーになるのは「敵が自機のいる21行目まで下りてきた時」ということになるかな。
チッ、コマカいやつだぜ!
どういうプログラムにするか、前もってハッキリとイメージしておくのはダイジじゃぞい。
まあ、思いつきでドンドン打ち込むのもひとつのダイゴミではあるが。
こまかく考えていくと、先頭の1匹が21行目についたタイミングがいいのかな。20行目のはじっこだとまだ早いって気がするし、何匹も21行目に乗っていると遅いかんじだもんね。
うむうむ、そういうコトじゃ。こういうのを「仕様(しよう)を決める」と言うのじゃが、できるだけミノガシの少ない仕様を決められるのが良いプログラマーのジョウケンじゃぞい。
ムムム……アトは……そうだな、画面に「GAME OVER(ゲームオーバー)」って書かねェとな! そしてENDだ!
そうか、それはたしかにダイジだね。ちゃんとゲームオーバーだってわからないと。
まずは、そういう仕様で作ってみようか。まずサイショにすべきコトは……
もともとムダだった、自機のノコり表示をヤメようぜ! コメントアウトしとくか。
- ’LOCATE 0,23
- ’PRINT ”Г”*LIFE;
そのトオリじゃが、あいかわらずコトバがキビしいのう……。
プログラムの中で敵が21行目におりてくるとすると……@DWルーチンになるのかな。
- @DW
- EY[I]=EY[I]+1
- IF EY[I]>20 THEN EY[I]=3
- ED[I]=(ED[I]+1) AND 3
- GOTO @EPUT
126行目では敵が画面の下から上にワープするように作ってあるけど、今回の改造ではココはいらないね。
- ’IF EY[I]>20 THEN EY[I]=3
とりあえずコメントアウトしよう。
せっかくIF EY[I]>20 THENなら、ソコでゲームオーバーにすりゃイイんじゃねェの?
オシイけど、ココではまだ敵が21行目に表示されていないんだ。さっき決めた仕様どおりに作るならハズレだね。
チッ、コマカいハナシはニガテだぜ! ウゴいた敵を書いてるのは、そのアトの@EPUTルーチンだったか。
- @EPUT
- LOCATE EX[I],EY[I]
- PRINT ”Е”
- RETURN
どう見ても、141行目のアトにIF文を1行書けばイイはずだぜ!
- IF EY[I]>20 THEN @GOVER
たいしてやるコトもなさそうだが、イチオウ新しくゲームオーバー(Game OVER)サブルーチンに飛ばしといたぜ。
あとはムズカシイことは何もなさそうだね。
- @GOVER
- LOCATE 17,11
- PRINT ”G A M E O V E R”
- END
ウム。キチンとできておる。
しかし、やってみるとジミな気もするな。ドウセならこのぐらいは……
- @GOVER
- LOCATE PX,PY
- COLOR 7
- PRINT ”◎”
- LOCATE 17,11
- COLOR 3
- PRINT ”G A M E O V E R”
- END
うむうむ。いくら仕様を前もって決めていても、作ってみるともっとやりたいコトは出てくるモノじゃ。ためらわず新しく作りはじめる心もダイジじゃぞ。
言ってるコトがバラバラな気もするけど……
あと、自分でワケがワカらなくなる前に、ホドホドで止めておく心もやっぱりダイジじゃな。
どうしろってんだ!
どの考え方も同じくらい大切なものさ。うまくバランスをとってプログラムしていきたいね。
そういえば、さっきから気になってたんだけど、
- @RI
- EX[I]=EX[I]+0.2
- @LF
- EX[I]=EX[I]−0.2
EX[I]って、敵のX座標だよね。1ずつ足すんじゃないの?
ホントだな。+1がタダしいんじゃねェのか?
- @RI
- EX[I]=EX[I]+1
- @LF
- EX[I]=EX[I]−1
- RUN
チクショウ!敵が早すぎてゼンゼン当たらねー!
そうか、敵の動きを+1から+0.2に減らして、敵を遅くしているんだね。
そうだね。ここの数字を変えると、敵の速さを自由に変えられるよ。
ン? 敵の位置が整数にならないのはイイのか?
それは大丈夫だよ!LOCATEでは、小数は切り捨てられて処理されるんだ。
ほっほっほ。敵の動く量を変えれば、速さが変わるのはトウゼンじゃな。
じゃが、敵の動きは+1のままでも、敵を遅くする方法があるぞい。
そう言えば、スピードをコントロールしてる部分がもうあったような……
! タシカに、オレとしたコトがワスレてたぜ!
- @LOOP
- GOSUB @MYSHIP
- GOSUB @MYSHOT
- GOSUB @ALIEN
- GOSUB @SCORE
- VSYNC 1
- GOTO @LOOP
メインループの中のVSYNC 1で1/60秒オソくしてたんだったな。じゃあ、コレをもっとオソくすりゃイイんじゃねェか?
- VSYNC 20
あれ? なんだか……
- RUN
……あ、そうか。
し、シマッタ! 自機がオソいのは100歩ゆずっても、ショットがオソいのだけはガマンならねー!
というかコレ、ただゲームのテンポがユルくなったダケだな!
そういうコトだね。VSYNCはその場でポーズするようなモノだから、ゲーム全体のスピードが変わってしまうんだ。
VSYNCじゃなくて、敵だけが遅くなるような改造にしないとダメなんだね。
ムムム……自分やショットはウゴくが、敵はウゴかない……ん? そう考えるとアンガイよくあるパターンじゃねえか?
そう、敵を動かす部分をスキップすればいいってコトだね。
- @EMOVE
- IF ??? THEN @EPUT
- ON ED[I] GOTO @RI,@DW,@LF,@DW
ある条件のトキ以外は敵の場所を変えないことにしたよ。
ずっとスキップしっぱなしじゃ動かなくなっちゃうから、このIF文で「何回かに1回だけ動く」ようにすればいいってことか……。
だいたいハナシが見えてきたゼ。こうすりゃイイんだな!
- ’−−−
- @ALIEN
- ESTOP=ESTOP+1
まず敵をウゴかすオオモトのところに、変数ESTOPをヨウイするぜ! コイツは敵を止める(STOP)ためのフラグだな。
- IF ESTOP==10 THEN ESTOP=0
こうやって、10回に1回は0にモドるようにしておくゼ! アトは、スキップするジョウケンを……
- @EMOVE
- IF ESTOP THEN @EPUT
IF ESTOP THEN、ツマリESTOPがゼロじゃなければスキップする、ってコトにすればデキアガリじゃねえか!?
おっ、やったじゃないか! これで敵のスピードだけが10分の1になったね。
ワレながら、ジョウタツぶりがミゴトだぜ……。
あれ? そういえばこの10回に1回は0にもどるってパターンは……
どうやらオボエていたようじゃのう。ワンパク君のプログラムの、ドコを変えればいいかわかったかの?
オレのプログラムのシュウセイからのスタートかよ!
この92行目はやっぱりけずって……
- ESTOP=ESTOP+1
- ’IF ESTOP==10 THEN ESTOP=0
そしたら、数がフエるイッポウじゃねェか?
うーん、タシカにそうなんだけど。
- IF ESTOP MOD 10 THEN @EPUT
スキップの条件をこう書きかえれば、10回に1回だけESTOP MOD 10の答が0になる……つまりスキップしないってコトになるよね。
「I=I+1でループするとき、I MOD Nと書くとIが『Nの倍数』になるたびゼロまでおり返しながら1増えていく」。前におぼえたホウソクだね。
やってるコトは同じじゃが、IF文がひとつ消えてコンピューターにやさしく、短いプログラムになったのう。
ESTOPの数はサイゴまで増えっぱなしじゃが、このゲームではメモリーのゲンカイまで増える前にゲームオーバーになるから、これでもよかろう。
そこまでコウリツをモトめるその考え方、オレは気にくわねェな!
タシカに、ワンパク君のプログラムの方が初心者にはわかりやすいとも言えるわい。
どこまでプログラムにコウリツを求めるべきか、それはプログラマーにとってエイエンのテーマじゃ。
どれがセイカイとも言えない、ってコトかな。ちなみにスキップする回数はちょっと変わるけど、こういう方法もあるよ。
- ESTOP=(ESTOP+1) AND 7
- IF ESTOP THEN @EPUT
ビット演算のくわしいセツメイはもうはぶくけど、8回に1回だけESTOPがゼロになってスキップしなくなるプログラムだね。
コンピューター的にはわり算よりビット演算の方が早いから、ボクはI MOD Nを使うよりもスキかなあ。
ケッキョク、プログラムするヤツのスキズキってコトか……。
セイカイがひとつとかぎらんのも、プログラムのおもしろさじゃな。プログラマー2人に合作させるとおたがいのビガクがぶつかって、見ていてオモシロいもんじゃよ。
……やじうま?
スピードが変わって、だいぶゲームらしくなってきたな!
敵が少なくなると、デタラメに撃っても当たらなくなるのがよくわかるね。だけどあんまりじっくり当てようとしていると、敵にせめこまれてゲームオーバーになっちゃう。ゲームにはこういうカケヒキがないとね。
なんだかハジメてホメられた気がするわい……。
こうなってくると、敵を全滅させた時に何もないのがさびしいね。ゲームクリア画面を作っておこうよ。
そうムズカシくないんじゃねェか? とりあえず敵の数をチェックするための変数がいるな。
- ELEFT=EMAX
敵の最大数を決める変数EMAXがもともとあったから、新しい敵(Enemy)の残り(LEFT)変数ELEFTに使うことにするゼ!
敵が1匹やられるたびに、変数ELEFTを1へらせばいいね。
- ELEFT=ELEFT−1
あとはこの数がゼロになったら、ゲームエンド(Game END)でいいかな。
- IF ELEFT==FALSE THEN @GEND
そこからは新しいサブルーチンになるね。
- @GEND
- LOCATE 20,11
- PRINT ”しんりゃく みすい”
- END
こんなところかな?
さすがにサクサクいくようになったのう。
クリアしたその時、はじめてゲームタイトルが出てそのイミが明らかになる。ワシのノゾミどおりの、ハリウッド的クールなエンシュツじゃ。
そこまで考えてなかったけど……。
あっと、まだ終わりじゃないよ。ひとつわすれてることがあったね。
そうか? トクにおかしいトコロはなさそうだが……
- SCORE: 190
あっ! 最後の敵を撃った点が入ってないよ!
最後の敵が撃たれたらスグに@GENDに飛んでいるから、こうなっちゃうね。
じゃあ、@GENDに飛んだサキですぐに点を入れればイイんじゃねェか?
- @GEND
- GOSUB @SCORE
ず……ずいぶんストレートな方法でカイケツしてきたね。
@SCOREに行って10点プラスして帰ってくるワケじゃな。10点以上の敵を倒してクリアしたトキはどうする、というモンダイはあるが……そもそも10点以上の敵がいないので、マチガイなくこれでカイケツはしておるな。
いいの? ハカセにしてはアッサリしてるけど。
何点の敵を打ってもOKなプログラムを組むのがリソウではあるんじゃが……、ショクンならフラグをうまく使えばスグにできるじゃろうしな。10点以上の敵を出すヨテイもない今は、これでよかろう。
(さっき自分も気がつかなかったコトを、ゴマカそうとしてるんじゃねェか……?)
おぼえたコトは、なんでもムダにはならないってコトだね。
ビット演算にかぎらず、このBASIC講座で勉強したことは、イガイなところで役に立ったり、応用しだいでもっとイロイロな使いみちがあるハズさ。
そういうコトじゃな。読者のショクンも、このサンプルをさらに改造するコトから始めてみてはどうかな?
これまでの講座でおぼえた命令を組み合わせると、イガイにやりたいコトができたりするものじゃ。
たしかに、まだ改造したいポイントはいっぱいあるね。敵の種類をふやしてみたいし、プレイヤーが1機でおわりじゃなくてもいいよね。
もっとカラフルにするのもよさそうじゃな。敵がやられた時にバクハツパターンを出すなどもいいじゃろう。
こういう見た目のエンシュツはイガイに考えるところが多く、うまくいった時のジュウジツ感も大きいのでおすすめじゃぞ。
やりたいコトに手が届かない時は、説明書をながめてみるのもいいかもね。
ムズカシそうだけど、ここまで読んだ今なら、何が書いてあるのかカナリわかるようになってるハズだよ。
……テメーら! 最後だけマジメな話でまとめて、さもキョウイク的な講座だったってカオしてんじゃねえぞ!
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.355 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:35 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30