プチコン3号&BIGまとめWiki

プチコン3号&BIG 非公式初心者講座 : 第18章 サンプルプログラム7 (その5)

パンくずリスト

プログラマーからひとこと

いよいよサンプルプログラム7ともこれでおわかれです。

時間をかけてサンプルがどう動いているのか見てきただけあって、今回はけっこうカンタンに話が終わるような気がします。
それだけみなさんもスキルアップしたということです。おめでとう!

前回いきなりサンプル7と関係ないビット演算の話が出てきておどろいたかもしれませんが、ちゃんと今回の話に使いますよ。
それもこれもふくめて、これまでの講座の総まとめです。
泣けるBGMなどをかけながら読んでみてください。

ゲームオーバーを作ってみよう

インテリくん

さて、サンプルプログラム7のつくり方はだいたい分かったけれど……

ワンパクくん

イヨイヨ、このロクでもねえプログラムをマシにカイゾウするってワケだな!

ハカセ(泣)

ソコまで言わんでもよかろうに……

神崎

いちどロードしなおしておこうか。

  1. LOAD”SYS/EX7ALIEN”

どこから手をつけたらいいのかな?

ワンパクくん

マッサキにおかしいトコロと言ったら、ゲームオーバーにならねェとこだろうな。

インテリくん

セイカクには、ゲームオーバーになるのは「敵が自機のいる21行目まで下りてきた時」ということになるかな。

ワンパクくん

チッ、コマカいやつだぜ!

ハカセ

どういうプログラムにするか、前もってハッキリとイメージしておくのはダイジじゃぞい。
まあ、思いつきでドンドン打ち込むのもひとつのダイゴミではあるが。

神崎

こまかく考えていくと、先頭の1匹が21行目についたタイミングがいいのかな。20行目のはじっこだとまだ早いって気がするし、何匹も21行目に乗っていると遅いかんじだもんね。

ハカセ

うむうむ、そういうコトじゃ。こういうのを「仕様(しよう)を決める」と言うのじゃが、できるだけミノガシの少ない仕様を決められるのが良いプログラマーのジョウケンじゃぞい。

ワンパクくん

ムムム……アトは……そうだな、画面に「GAME OVER(ゲームオーバー)」って書かねェとな! そしてENDだ!

神崎

そうか、それはたしかにダイジだね。ちゃんとゲームオーバーだってわからないと。

インテリくん

まずは、そういう仕様で作ってみようか。まずサイショにすべきコトは……

ワンパクくん

もともとムダだった、自機のノコり表示をヤメようぜ! コメントアウトしとくか。

  1. ’LOCATE 0,23
  2. ’PRINT ”Г”*LIFE;
ハカセ(泣)

そのトオリじゃが、あいかわらずコトバがキビしいのう……。

神崎

プログラムの中で敵が21行目におりてくるとすると……@DWルーチンになるのかな。

  1. @DW
  2. EY[I]=EY[I]+1
  3. IF EY[I]>20 THEN EY[I]=3
  4. ED[I]=(ED[I]+1) AND 3
  5. GOTO @EPUT
インテリくん

126行目では敵が画面の下から上にワープするように作ってあるけど、今回の改造ではココはいらないね。

  1. ’IF EY[I]>20 THEN EY[I]=3

とりあえずコメントアウトしよう。

ワンパクくん

せっかくIF EY[I]>20 THENなら、ソコでゲームオーバーにすりゃイイんじゃねェの?

インテリくん

オシイけど、ココではまだ敵が21行目に表示されていないんだ。さっき決めた仕様どおりに作るならハズレだね。

ワンパクくん

チッ、コマカいハナシはニガテだぜ! ウゴいた敵を書いてるのは、そのアトの@EPUTルーチンだったか。

  1. @EPUT
  2. LOCATE EX[I],EY[I]
  3. PRINT ”Е”
  4. RETURN

どう見ても、141行目のアトにIF文を1行書けばイイはずだぜ!

  1. IF EY[I]>20 THEN @GOVER

たいしてやるコトもなさそうだが、イチオウ新しくゲームオーバー(Game OVER)サブルーチンに飛ばしといたぜ。

神崎

あとはムズカシイことは何もなさそうだね。

  1. @GOVER
  2. LOCATE 17,11
  3. PRINT ”G A M E  O V E R”
  4. END
HNI_0037.JPG
ハカセ

ウム。キチンとできておる。

ワンパクくん

しかし、やってみるとジミな気もするな。ドウセならこのぐらいは……

  1. @GOVER
  2. LOCATE PX,PY
  3. COLOR 7
  4. PRINT ”◎”
  5. LOCATE 17,11
  6. COLOR 3
  7. PRINT ”G A M E  O V E R”
  8. END
HNI_0035.JPG
ハカセ

うむうむ。いくら仕様を前もって決めていても、作ってみるともっとやりたいコトは出てくるモノじゃ。ためらわず新しく作りはじめる心もダイジじゃぞ。

神崎

言ってるコトがバラバラな気もするけど……

ハカセ

あと、自分でワケがワカらなくなる前に、ホドホドで止めておく心もやっぱりダイジじゃな。

ワンパクくん

どうしろってんだ!

インテリくん

どの考え方も同じくらい大切なものさ。うまくバランスをとってプログラムしていきたいね。

スピードを変えてみよう

神崎

そういえば、さっきから気になってたんだけど、

  1. @RI
  2. EX[I]=EX[I]+0.2
  1. @LF
  2. EX[I]=EX[I]−0.2

EX[I]って、敵のX座標だよね。1ずつ足すんじゃないの?

ワンパクくん

ホントだな。+1がタダしいんじゃねェのか?

  1. @RI
  2. EX[I]=EX[I]+1
  1. @LF
  2. EX[I]=EX[I]−1
  1. RUN
ワンパクくん

チクショウ!敵が早すぎてゼンゼン当たらねー!

神崎

そうか、敵の動きを+1から+0.2に減らして、敵を遅くしているんだね。

インテリくん

そうだね。ここの数字を変えると、敵の速さを自由に変えられるよ。

ワンパクくん

ン? 敵の位置が整数にならないのはイイのか?

インテリくん

それは大丈夫だよ!LOCATEでは、小数は切り捨てられて処理されるんだ。

ハカセ

ほっほっほ。敵の動く量を変えれば、速さが変わるのはトウゼンじゃな。
じゃが、敵の動きは+1のままでも、敵を遅くする方法があるぞい。

神崎

そう言えば、スピードをコントロールしてる部分がもうあったような……

ワンパクくん

! タシカに、オレとしたコトがワスレてたぜ!

  1. @LOOP
  2.  GOSUB @MYSHIP
  3.  GOSUB @MYSHOT
  4.  GOSUB @ALIEN
  5.  GOSUB @SCORE
  6.  VSYNC 1
  7. GOTO @LOOP

メインループの中のVSYNC 1で1/60秒オソくしてたんだったな。じゃあ、コレをもっとオソくすりゃイイんじゃねェか?

  1. VSYNC 20
神崎

あれ? なんだか……

  1. RUN
神崎

……あ、そうか。

ワンパクくん

し、シマッタ! 自機がオソいのは100歩ゆずっても、ショットがオソいのだけはガマンならねー!
というかコレ、ただゲームのテンポがユルくなったダケだな!

インテリくん

そういうコトだね。VSYNCはその場でポーズするようなモノだから、ゲーム全体のスピードが変わってしまうんだ。

神崎

VSYNCじゃなくて、敵だけが遅くなるような改造にしないとダメなんだね。

ワンパクくん

ムムム……自分やショットはウゴくが、敵はウゴかない……ん? そう考えるとアンガイよくあるパターンじゃねえか?

インテリくん

そう、敵を動かす部分をスキップすればいいってコトだね。

  1. @EMOVE
  2. IF ??? THEN @EPUT
  3. ON ED[I] GOTO @RI,@DW,@LF,@DW

ある条件のトキ以外は敵の場所を変えないことにしたよ。

神崎

ずっとスキップしっぱなしじゃ動かなくなっちゃうから、このIF文で「何回かに1回だけ動く」ようにすればいいってことか……。

ワンパクくん

だいたいハナシが見えてきたゼ。こうすりゃイイんだな!

  1. ’−−− 
  2. @ALIEN
  3. ESTOP=ESTOP+1

まず敵をウゴかすオオモトのところに、変数ESTOPをヨウイするぜ! コイツは敵を止める(STOP)ためのフラグだな。

  1. IF ESTOP==10 THEN ESTOP=0

こうやって、10回に1回はにモドるようにしておくゼ! アトは、スキップするジョウケンを……

  1. @EMOVE
  2. IF ESTOP THEN @EPUT

IF ESTOP THEN、ツマリESTOPがゼロじゃなければスキップする、ってコトにすればデキアガリじゃねえか!?

インテリくん

おっ、やったじゃないか! これで敵のスピードだけが10分の1になったね。

ワンパクくん

ワレながら、ジョウタツぶりがミゴトだぜ……。

神崎

あれ? そういえばこの10回に1回はにもどるってパターンは……

ハカセ

どうやらオボエていたようじゃのう。ワンパク君のプログラムの、ドコを変えればいいかわかったかの?

ワンパクくん

オレのプログラムのシュウセイからのスタートかよ!

神崎

この92行目はやっぱりけずって……

  1. ESTOP=ESTOP+1
  2. ’IF ESTOP==10 THEN ESTOP=0
ワンパクくん

そしたら、数がフエるイッポウじゃねェか?

神崎

うーん、タシカにそうなんだけど。

  1. IF ESTOP MOD 10 THEN @EPUT

スキップの条件をこう書きかえれば、10回に1回だけESTOP MOD 10の答が0になる……つまりスキップしないってコトになるよね。

インテリくん

I=I+1でループするとき、I MOD Nと書くとが『の倍数』になるたびゼロまでおり返しながら1増えていく」。前におぼえたホウソクだね。

ハカセ

やってるコトは同じじゃが、IF文がひとつ消えてコンピューターにやさしく、短いプログラムになったのう。
ESTOPの数はサイゴまで増えっぱなしじゃが、このゲームではメモリーのゲンカイまで増える前にゲームオーバーになるから、これでもよかろう。

ワンパクくん

そこまでコウリツをモトめるその考え方、オレは気にくわねェな!

ハカセ

タシカに、ワンパク君のプログラムの方が初心者にはわかりやすいとも言えるわい。
どこまでプログラムにコウリツを求めるべきか、それはプログラマーにとってエイエンのテーマじゃ。

インテリくん

どれがセイカイとも言えない、ってコトかな。ちなみにスキップする回数はちょっと変わるけど、こういう方法もあるよ。

  1. ESTOP=(ESTOP+1) AND 7
  1. IF ESTOP THEN @EPUT

ビット演算のくわしいセツメイはもうはぶくけど、8回に1回だけESTOPがゼロになってスキップしなくなるプログラムだね。
コンピューター的にはわり算よりビット演算の方が早いから、ボクはI MOD Nを使うよりもスキかなあ。

ワンパクくん

ケッキョク、プログラムするヤツのスキズキってコトか……。

ハカセ

セイカイがひとつとかぎらんのも、プログラムのおもしろさじゃな。プログラマー2人に合作させるとおたがいのビガクがぶつかって、見ていてオモシロいもんじゃよ。

神崎

……やじうま?

クリア画面をつくってみよう

ワンパクくん

スピードが変わって、だいぶゲームらしくなってきたな!

インテリくん

敵が少なくなると、デタラメに撃っても当たらなくなるのがよくわかるね。だけどあんまりじっくり当てようとしていると、敵にせめこまれてゲームオーバーになっちゃう。ゲームにはこういうカケヒキがないとね。

ハカセ(泣)

なんだかハジメてホメられた気がするわい……。

神崎

こうなってくると、敵を全滅させた時に何もないのがさびしいね。ゲームクリア画面を作っておこうよ。

ワンパクくん

そうムズカシくないんじゃねェか? とりあえず敵の数をチェックするための変数がいるな。

  1. ELEFT=EMAX

敵の最大数を決める変数EMAXがもともとあったから、新しい敵(Enemy)の残り(LEFT)変数ELEFTに使うことにするゼ!

インテリくん

敵が1匹やられるたびに、変数ELEFTを1へらせばいいね。

  1. ELEFT=ELEFT−1

あとはこの数がゼロになったら、ゲームエンド(Game END)でいいかな。

  1. IF ELEFT==FALSE THEN @GEND
神崎

そこからは新しいサブルーチンになるね。

  1. @GEND
  2. LOCATE 20,11
  3. PRINT ”しんりゃく みすい”
  4. END

こんなところかな?

HNI_0039.JPG
ハカセ

さすがにサクサクいくようになったのう。
クリアしたその時、はじめてゲームタイトルが出てそのイミが明らかになる。ワシのノゾミどおりの、ハリウッド的クールなエンシュツじゃ。

神崎

そこまで考えてなかったけど……。

インテリくん

あっと、まだ終わりじゃないよ。ひとつわすれてることがあったね。

ワンパクくん

そうか? トクにおかしいトコロはなさそうだが……

  1. SCORE: 190
神崎

あっ! 最後の敵を撃った点が入ってないよ!

インテリくん

最後の敵が撃たれたらスグに@GENDに飛んでいるから、こうなっちゃうね。

ワンパクくん

じゃあ、@GENDに飛んだサキですぐに点を入れればイイんじゃねェか?

  1. @GEND
  2. GOSUB @SCORE
インテリくん

ず……ずいぶんストレートな方法でカイケツしてきたね。

ハカセ

@SCOREに行って10点プラスして帰ってくるワケじゃな。10点以上の敵を倒してクリアしたトキはどうする、というモンダイはあるが……そもそも10点以上の敵がいないので、マチガイなくこれでカイケツはしておるな。

神崎

いいの? ハカセにしてはアッサリしてるけど。

ハカセ

何点の敵を打ってもOKなプログラムを組むのがリソウではあるんじゃが……、ショクンならフラグをうまく使えばスグにできるじゃろうしな。10点以上の敵を出すヨテイもない今は、これでよかろう。

ワンパクくん

(さっき自分も気がつかなかったコトを、ゴマカそうとしてるんじゃねェか……?)

まとめのようなもの

インテリくん

おぼえたコトは、なんでもムダにはならないってコトだね。
ビット演算にかぎらず、このBASIC講座で勉強したことは、イガイなところで役に立ったり、応用しだいでもっとイロイロな使いみちがあるハズさ。

ハカセ

そういうコトじゃな。読者のショクンも、このサンプルをさらに改造するコトから始めてみてはどうかな?
これまでの講座でおぼえた命令を組み合わせると、イガイにやりたいコトができたりするものじゃ。

神崎

たしかに、まだ改造したいポイントはいっぱいあるね。敵の種類をふやしてみたいし、プレイヤーが1機でおわりじゃなくてもいいよね。

ハカセ

もっとカラフルにするのもよさそうじゃな。敵がやられた時にバクハツパターンを出すなどもいいじゃろう。
こういう見た目のエンシュツはイガイに考えるところが多く、うまくいった時のジュウジツ感も大きいのでおすすめじゃぞ。

インテリくん

やりたいコトに手が届かない時は、説明書をながめてみるのもいいかもね。
ムズカシそうだけど、ここまで読んだ今なら、何が書いてあるのかカナリわかるようになってるハズだよ。

ワンパクくん

……テメーら! 最後だけマジメな話でまとめて、さもキョウイク的な講座だったってカオしてんじゃねえぞ!

今回のまとめ

まとめ方
最後のほうで、みんないい子になって教育的なことでまとめれば、まるでいい講座だったように思い込めるものです。

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 1 人がこのサイトを見ています
  • このページはこれまでに 1238 回、本日は 1 回、昨日は 0 回閲覧されました

ページの先頭に戻る

表示モード : [ スマホ・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