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

Beginner/Chapter18 の変更点

パンくずリスト


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

#blockdiv(margin-bottom:2em)
CENTER:[ [[← 第17章へ>../Chapter17]]
|
[[もくじに戻る>../#beginner-contents]]
]
#blockdiv(end)

#blockdiv(class:block-info,width:60%,margin:auto,padding-left:2em,padding-right:2em,padding-bottom:2em)
* プログラマーからひとこと [#m66e238b]
いよいよサンプルプログラム7ともこれでおわかれです。~
~
時間をかけてサンプルがどう動いているのか見てきただけあって、今回はけっこうカンタンに話が終わるような気がします。~
それだけみなさんもスキルアップしたということです。おめでとう!~
~
前回いきなりサンプル7と関係ないビット演算の話が出てきておどろいたかもしれませんが、ちゃんと今回の話に使いますよ。~
それもこれもふくめて、これまでの講座の総まとめです。~
泣けるBGMなどをかけながら読んでみてください。~

#blockdiv(end)

* ゲームオーバーを作ってみよう [#z2e6a18b]
#fukidashi(i,さて、サンプルプログラム7のつくり方はだいたい分かったけれど……)
#fukidashi(w,イヨイヨ、このロクでもねえプログラムをマシにカイゾウするってワケだな!)
#fukidashi(hc,r,ソコまで言わんでもよかろうに……)
#fukidashi(k,start)
いちどロードしなおしておこうか。
#basic(black,noline){{
LOAD”SYS/EX7ALIEN”
}}
どこから手をつけたらいいのかな?
#fukidashi(end)
#fukidashi(w,マッサキにおかしいトコロと言ったら、ゲームオーバーにならねェとこだろうな。)
#fukidashi(i,セイカクには、ゲームオーバーになるのは「敵が自機のいる&basic{21};行目まで下りてきた時」ということになるかな。)
#fukidashi(w,チッ、コマカいやつだぜ!)
#fukidashi(h,r,どういうプログラムにするか、前もってハッキリとイメージしておくのはダイジじゃぞい。&br;まあ、思いつきでドンドン打ち込むのもひとつのダイゴミではあるが。)
#fukidashi(k,こまかく考えていくと、先頭の1匹が&basic{21};行目についたタイミングがいいのかな。&basic{20};行目のはじっこだとまだ早いって気がするし、何匹も&basic{21};行目に乗っていると遅いかんじだもんね。)
#fukidashi(h,r,うむうむ、そういうコトじゃ。こういうのを「仕様(しよう)を決める」と言うのじゃが、できるだけミノガシの少ない仕様を決められるのが良いプログラマーのジョウケンじゃぞい。)
#fukidashi(w,ムムム……アトは……そうだな、画面に「GAME OVER(ゲームオーバー)」って書かねェとな! そして&basic{END};だ!)
#fukidashi(k,そうか、それはたしかにダイジだね。ちゃんとゲームオーバーだってわからないと。)
#fukidashi(i,まずは、そういう仕様で作ってみようか。まずサイショにすべきコトは……)
#fukidashi(w,start)
もともとムダだった、自機のノコり表示をヤメようぜ! コメントアウトしとくか。
#basic(black,start=31){{
’LOCATE 0,23
’PRINT ”Г”*LIFE;
}}
#fukidashi(end)
#fukidashi(hc,r,そのトオリじゃが、あいかわらずコトバがキビしいのう……。)
#fukidashi(k,start)
プログラムの中で敵が&basic{21};行目におりてくるとすると……&basic{@DW};ルーチンになるのかな。
#basic(black,start=124){{
@DW
EY[I]=EY[I]+1
IF EY[I]>20 THEN EY[I]=3
ED[I]=(ED[I]+1) AND 3
GOTO @EPUT
}}
#fukidashi(end)
#fukidashi(i,start)
126行目では敵が画面の下から上にワープするように作ってあるけど、今回の改造ではココはいらないね。
#basic(black,start=126){{
’IF EY[I]>20 THEN EY[I]=3
}}
とりあえずコメントアウトしよう。
#fukidashi(end)
#fukidashi(w,せっかく&basic{IF EY[I]>20 THEN};なら、ソコでゲームオーバーにすりゃイイんじゃねェの?)
#fukidashi(i,オシイけど、ココではまだ敵が&basic{21};行目に表示されていないんだ。さっき決めた仕様どおりに作るならハズレだね。)
#fukidashi(w,start)
チッ、コマカいハナシはニガテだぜ! ウゴいた敵を書いてるのは、そのアトの&basic{@EPUT};ルーチンだったか。
#basic(black,start=139){{
@EPUT
LOCATE EX[I],EY[I]
PRINT ”Е”
RETURN
}}
どう見ても、141行目のアトにIF文を1行書けばイイはずだぜ!
#basic(black,start=142){{
IF EY[I]>20 THEN @GOVER
}}
たいしてやるコトもなさそうだが、イチオウ新しくゲームオーバー(Game OVER)サブルーチンに飛ばしといたぜ。
#fukidashi(end)
#fukidashi(k,start)
あとはムズカシイことは何もなさそうだね。
#basic(black,start=145){{
@GOVER
LOCATE 17,11
PRINT ”G A M E  O V E R”
END
}}
#fukidashi(end)
#ref(https://smileboom.com/special/ptcm2/co_konnichiwa/image/img-screen-sample7-gover1.png)
#ref(HNI_0037.JPG)
#fukidashi(h,r,ウム。キチンとできておる。)
#fukidashi(w,start)
しかし、やってみるとジミな気もするな。ドウセならこのぐらいは……
#basic(black,start=145){{
@GOVER
LOCATE PX,PY
COLOR 7
PRINT ”◎”
LOCATE 17,11
COLOR 3
PRINT ”G A M E  O V E R”
END
}}
#fukidashi(end)
#ref(HNI_0035.JPG)
#fukidashi(h,r,うむうむ。いくら仕様を前もって決めていても、作ってみるともっとやりたいコトは出てくるモノじゃ。ためらわず新しく作りはじめる心もダイジじゃぞ。)
#fukidashi(k,言ってるコトがバラバラな気もするけど……)
#fukidashi(h,r,あと、自分でワケがワカらなくなる前に、ホドホドで止めておく心もやっぱりダイジじゃな。)
#fukidashi(w,どうしろってんだ!)
#fukidashi(i,どの考え方も同じくらい大切なものさ。うまくバランスをとってプログラムしていきたいね。)

// ※3号には無いらしいです。
//
//#blockdiv(class:block-info,width:60%,margin:auto,padding-left:2em,padding-right:2em,padding-bottom:2em,margin-bottom:1em)
//* 画面リセット
//#fukidashi(h,start)
//このコラムもこれがサイゴかもしれんと思うと……ワシじゃ、コラムのヌシことハカセじゃ。~
//さっきのプログラムでは&basic{COLOR};を&basic{15};にモドさないで&basic{END};しておるから、その先にナニを打っても赤い字になるのう。&basic{COLOR};命令を何度も使うプログラムじゃと、いつも&basic{COLOR 15};で終われるとはかぎらん。そこで、ベンリなワザを教えておくぞい。
//#fukidashi(end)
//:“Rボタン + 左ボタン + STARTボタン”|
//こうDSiのボタンを押せば、画面がリセットされるのじゃ。~
//&basic{ACLS};と命令を打っても同じことじゃが、キーボードを使うよりラクじゃろ?
//#blockdiv(end)

* スピードを変えてみよう [#vcf16c4b]

#fukidashi(k,start)
そういえば、さっきから気になってたんだけど、
#basic(black,start=130){{
@RI
EX[I]=EX[I]+0.2
}}
#basic(black,start=135){{
@LF
EX[I]=EX[I]-0.2
}}
&basic{EX[I]};って、敵のX座標だよね。1ずつ足すんじゃないの?
#fukidashi(end)
#fukidashi(w,start)
ホントだな。&basic{+1};がタダしいんじゃねェのか?
#basic(black,start=130){{
@RI
EX[I]=EX[I]+1
}}
#basic(black,start=135){{
@LF
EX[I]=EX[I]-1
}}
#fukidashi(end)
#basic(black,noline){{
RUN
}}
#fukidashi(w,チクショウ!敵が早すぎてゼンゼン当たらねー!)
#fukidashi(k,そうか、敵の動きを&basic{+1};から&basic{+0.2};に減らして、敵を遅くしているんだね。)
#fukidashi(i,そうだね。ここの数字を変えると、敵の速さを自由に変えられるよ。)
#fukidashi(w,ン? 敵の位置が整数にならないのはイイのか?)
#fukidashi(i,それは大丈夫だよ!&basic{LOCATE};では、小数は切り捨てられて処理されるんだ。)
#fukidashi(h,r,ほっほっほ。敵の動く量を変えれば、速さが変わるのはトウゼンじゃな。&br;じゃが、敵の動きは&basic{+1};のままでも、敵を遅くする方法があるぞい。)

//#fukidashi(i,次はどこを改造するのがいいかな。ゲームとしてちゃんとしてないのは……)
//#fukidashi(w,そりゃ、敵のスピードが早すぎるコトだな! ゲームオーバーを作ってマスマスよくワカッたが、敵をオソくしねえとハナシにならねェぜ!)
#fukidashi(k,そう言えば、スピードをコントロールしてる部分がもうあったような……)
#fukidashi(w,start)
! タシカに、オレとしたコトがワスレてたぜ!
#basic(black,start=38){{
@LOOP
 GOSUB @MYSHIP
 GOSUB @MYSHOT
 GOSUB @ALIEN
 GOSUB @SCORE
 VSYNC 1
GOTO @LOOP
}}
メインループの中の&basic{VSYNC 1};で1/60秒オソくしてたんだったな。じゃあ、コレをもっとオソくすりゃイイんじゃねェか?
#basic(black,start=43){{
 VSYNC 20
}}
#fukidashi(end)
#fukidashi(k,あれ? なんだか……)
#basic(black,noline){{
RUN
}}
#fukidashi(k,……あ、そうか。)
#fukidashi(w,し、シマッタ! 自機がオソいのは100歩ゆずっても、ショットがオソいのだけはガマンならねー!&br;というかコレ、ただゲームのテンポがユルくなったダケだな!)
#fukidashi(i,そういうコトだね。&basic{VSYNC};はその場でポーズするようなモノだから、ゲーム全体のスピードが変わってしまうんだ。)
#fukidashi(k,&basic{VSYNC};じゃなくて、敵だけが遅くなるような改造にしないとダメなんだね。)
#fukidashi(w,ムムム……自分やショットはウゴくが、敵はウゴかない……ん? そう考えるとアンガイよくあるパターンじゃねえか?)
#fukidashi(i,start)
そう、敵を動かす部分をスキップすればいいってコトだね。
#basic(black,start=121){{
@EMOVE
IF ??? THEN @EPUT
ON ED[I] GOTO @RI,@DW,@LF,@DW
}}
ある条件のトキ以外は敵の場所を変えないことにしたよ。
#fukidashi(end)
#fukidashi(k,ずっとスキップしっぱなしじゃ動かなくなっちゃうから、このIF文で「何回かに1回だけ動く」ようにすればいいってことか……。)
#fukidashi(w,start)
だいたいハナシが見えてきたゼ。こうすりゃイイんだな!
#basic(black,start=89){{
’−−− 
@ALIEN
ESTOP=ESTOP+1
}}
まず敵をウゴかすオオモトのところに、変数&basic{ESTOP};をヨウイするぜ! コイツは敵を止める(STOP)ためのフラグだな。
#basic(black,start=92){{
IF ESTOP==10 THEN ESTOP=0
}}
こうやって、10回に1回は&basic{0};にモドるようにしておくゼ! アトは、スキップするジョウケンを……
#basic(black,start=123){{
@EMOVE
IF ESTOP THEN @EPUT
}}
&basic{IF ESTOP THEN};、ツマリ&basic{ESTOP};がゼロじゃなければスキップする、ってコトにすればデキアガリじゃねえか!?
#fukidashi(end)
#fukidashi(i,おっ、やったじゃないか! これで敵のスピードだけが10分の1になったね。)
#fukidashi(w,ワレながら、ジョウタツぶりがミゴトだぜ……。)
#fukidashi(k,あれ? そういえばこの10回に1回は&basic{0};にもどるってパターンは……)
#fukidashi(h,r,どうやらオボエていたようじゃのう。ワンパク君のプログラムの、ドコを変えればいいかわかったかの?)
#fukidashi(w,オレのプログラムのシュウセイからのスタートかよ!)
#fukidashi(k,start)
この92行目はやっぱりけずって……
#basic(black,start=91){{
ESTOP=ESTOP+1
'IF ESTOP==10 THEN ESTOP=0
}}
#fukidashi(end)
#fukidashi(w,そしたら、数がフエるイッポウじゃねェか?)
#fukidashi(k,start)
うーん、タシカにそうなんだけど。
#basic(black,start=124){{
IF ESTOP MOD 10 THEN @EPUT
}}
スキップの条件をこう書きかえれば、10回に1回だけ&basic{ESTOP MOD 10};の答が0になる……つまりスキップしないってコトになるよね。
#fukidashi(end)
#fukidashi(i,「&basic{I=I+1};でループするとき、&basic{I MOD N};と書くと&basic{I};が『&basic{N};の倍数』になるたびゼロまでおり返しながら1増えていく」。前におぼえたホウソクだね。)
#fukidashi(h,r,やってるコトは同じじゃが、IF文がひとつ消えてコンピューターにやさしく、短いプログラムになったのう。&br;&basic{ESTOP};の数はサイゴまで増えっぱなしじゃが、このゲームではメモリーのゲンカイまで増える前にゲームオーバーになるから、これでもよかろう。)
#fukidashi(w,そこまでコウリツをモトめるその考え方、オレは気にくわねェな!)
#fukidashi(h,r,タシカに、ワンパク君のプログラムの方が初心者にはわかりやすいとも言えるわい。&br;どこまでプログラムにコウリツを求めるべきか、それはプログラマーにとってエイエンのテーマじゃ。)
#fukidashi(i,start)
どれがセイカイとも言えない、ってコトかな。ちなみにスキップする回数はちょっと変わるけど、こういう方法もあるよ。
#basic(black,start=91){{
ESTOP=(ESTOP+1) AND 7
}}
#basic(black,start=124){{
IF ESTOP THEN @EPUT
}}
ビット演算のくわしいセツメイはもうはぶくけど、8回に1回だけ&basic{ESTOP};がゼロになってスキップしなくなるプログラムだね。~
コンピューター的にはわり算よりビット演算の方が早いから、ボクは&basic{I MOD N};を使うよりもスキかなあ。
#fukidashi(end)
#fukidashi(w,ケッキョク、プログラムするヤツのスキズキってコトか……。)
#fukidashi(h,r,セイカイがひとつとかぎらんのも、プログラムのおもしろさじゃな。プログラマー2人に合作させるとおたがいのビガクがぶつかって、見ていてオモシロいもんじゃよ。)
#fukidashi(k,……やじうま?)

* クリア画面をつくってみよう [#e7003fbe]

#fukidashi(w,スピードが変わって、だいぶゲームらしくなってきたな!)
#fukidashi(i,敵が少なくなると、デタラメに撃っても当たらなくなるのがよくわかるね。だけどあんまりじっくり当てようとしていると、敵にせめこまれてゲームオーバーになっちゃう。ゲームにはこういうカケヒキがないとね。)
#fukidashi(hc,r,なんだかハジメてホメられた気がするわい……。)
#fukidashi(k,こうなってくると、敵を全滅させた時に何もないのがさびしいね。ゲームクリア画面を作っておこうよ。)
#fukidashi(w,start)
そうムズカシくないんじゃねェか? とりあえず敵の数をチェックするための変数がいるな。
#basic(black,start=14){{
ELEFT=EMAX
}}
敵の最大数を決める変数&basic{EMAX};がもともとあったから、新しい敵(Enemy)の残り(LEFT)変数&basic{ELEFT};に使うことにするゼ!
#fukidashi(end)
#fukidashi(i,start)
敵が1匹やられるたびに、変数&basic{ELEFT};を1へらせばいいね。
#basic(black,start=117){{
ELEFT=ELEFT−1
}}
あとはこの数がゼロになったら、ゲームエンド(Game END)でいいかな。
#basic(black,start=118){{
IF ELEFT==FALSE THEN @GEND
}}
#fukidashi(end)
#fukidashi(k,start)
そこからは新しいサブルーチンになるね。
#basic(black,start=160){{
@GEND
LOCATE 20,11
PRINT ”しんりゃく みすい”
END
}}
こんなところかな?
#fukidashi(end)
#ref(https://smileboom.com/special/ptcm2/co_konnichiwa/image/img-screen-sample7-clear.png)
#ref(HNI_0039.JPG)
#fukidashi(h,r,さすがにサクサクいくようになったのう。&br;クリアしたその時、はじめてゲームタイトルが出てそのイミが明らかになる。ワシのノゾミどおりの、ハリウッド的クールなエンシュツじゃ。)
#fukidashi(k,そこまで考えてなかったけど……。)
#fukidashi(i,あっと、まだ終わりじゃないよ。ひとつわすれてることがあったね。)
#fukidashi(w,そうか? トクにおかしいトコロはなさそうだが……)
#basic(black,noline){{
SCORE: 190
}}
#fukidashi(k,あっ! 最後の敵を撃った点が入ってないよ!)
#fukidashi(i,最後の敵が撃たれたらスグに&basic{@GEND};に飛んでいるから、こうなっちゃうね。)
#fukidashi(w,start)
じゃあ、&basic{@GEND};に飛んだサキですぐに点を入れればイイんじゃねェか?
#basic(black,start=160){{
@GEND
GOSUB @SCORE
}}
#fukidashi(end)
#fukidashi(i,ず……ずいぶんストレートな方法でカイケツしてきたね。)
#fukidashi(h,r,&basic{@SCORE};に行って10点プラスして帰ってくるワケじゃな。10点以上の敵を倒してクリアしたトキはどうする、というモンダイはあるが……そもそも10点以上の敵がいないので、マチガイなくこれでカイケツはしておるな。)
#fukidashi(k,いいの? ハカセにしてはアッサリしてるけど。)
#fukidashi(h,r,何点の敵を打ってもOKなプログラムを組むのがリソウではあるんじゃが……、ショクンならフラグをうまく使えばスグにできるじゃろうしな。10点以上の敵を出すヨテイもない今は、これでよかろう。)
#fukidashi(w,(さっき自分も気がつかなかったコトを、ゴマカそうとしてるんじゃねェか……?))

// * ショットをボタン操作に変えてみよう

* まとめのようなもの [#q02a12d3]
#fukidashi(i,おぼえたコトは、なんでもムダにはならないってコトだね。&br;ビット演算にかぎらず、このBASIC講座で勉強したことは、イガイなところで役に立ったり、応用しだいでもっとイロイロな使いみちがあるハズさ。)
#fukidashi(h,r,そういうコトじゃな。読者のショクンも、このサンプルをさらに改造するコトから始めてみてはどうかな?&br;これまでの講座でおぼえた命令を組み合わせると、イガイにやりたいコトができたりするものじゃ。)
#fukidashi(k,たしかに、まだ改造したいポイントはいっぱいあるね。敵の種類をふやしてみたいし、プレイヤーが1機でおわりじゃなくてもいいよね。)
#fukidashi(h,r,もっとカラフルにするのもよさそうじゃな。敵がやられた時にバクハツパターンを出すなどもいいじゃろう。&br;こういう見た目のエンシュツはイガイに考えるところが多く、うまくいった時のジュウジツ感も大きいのでおすすめじゃぞ。)
#fukidashi(i,やりたいコトに手が届かない時は、説明書をながめてみるのもいいかもね。&br;ムズカシそうだけど、ここまで読んだ今なら、何が書いてあるのかカナリわかるようになってるハズだよ。)
#fukidashi(w,……テメーら! 最後だけマジメな話でまとめて、さもキョウイク的な講座だったってカオしてんじゃねえぞ!)

#blockdiv(class:block-info,width:60%,margin:auto,padding-left:2em,padding-right:2em,padding-bottom:2em,margin-bottom:1em)

* 今回のまとめ [#dc02a258]

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

CENTER:&size(24){''[[もくじに戻る>../#beginner-contents]]''};

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.015 秒 | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30