13:行き先はサイコロで決めろ

ここから先だけど、キミたちはどんなゲームをつくりたいんだい?
うーんそうだねえ。ボクは・・・
シューティングだシューティング!チョウのようにいハチのようにす!アットウテキな連射れんしゃ全部ぜんぶぶっこわす!まさにゲームのなかのゲーム!
・・・まあ、ワンパクくんがそこまでうならシューティングでいいよ。
カンタンなシューティングゲームなら初心者しょしんしゃにもつくりやすいから、ボクも賛成さんせいするよ。
となると、なにからをつけようかなあ・・・
そんなのはわかりきったことだぜ。ムジヒなこうげきでプレイヤーをころしにくる、ものすごいラスボスをつくろうぜ。ぬがよい!
うーん、ものすごいラスボスはものすごい高度こうどなプログラムが必要ひつようだよ。たとえばかっこいい弾幕だんまくやレーザーをつにも、三角さんかく関数かんすうやらなにやら・・・
ううっ、また数学すうがくか!プレイヤーをころしにいくまえにオレサマがころされちまう・・・
まずは手始てはじめにザコキャラからつくろう。ザコキャラもものすごいラスボスも、基本きほんおなじだからね。
よし!ウデがなるぜ!エディットモードりかえてと・・・お、しまった。なんかんでたな。BackSpaceバックスペース全部ぜんぶすのめんどくせえんだよな。
ああごめん、大事だいじことおしえてなかったね。いまみたいにエディットモードになにかプログラムがのこっていて、きれいさっぱりしたいときは、ダイレクトモードでNEWニュー命令めいれい実行じっこうしてね。NEWニューって入力にゅうりょくしてEnterエンターだよ。これでエディットモードのプログラムはきれいさっぱりえるんだ。
ふふん、NEWニューか。よし、カモーンニュープログラム。



いいかい、プレイヤーとおなじで、てきもスプライトを使つかうよ。
じゃあ、したのプログラムを入力にゅうりょくしてみてね!てきを1たいだけしてみたよ!

 'てきのざひょう
 EX=200:EY=60
 'てきのスプライトID
 EID=100
 
 'てきスプライトひょうじ
 SPSET EID,1203
 SPOFS EID,EX,EY
 
 LOOP
  'てきをうごかす
  EX=EX+RND(3)-1
  EY=EY+RND(3)-1
  SPOFS EID,EX,EY
  VSYNC
 ENDLOOP

ふふん、どうってことないプログラムだな!なんか日本語にほんごがまざってるのと、スプライトIDってのがナゾなのと、LOOPループあとぎょうあたまにスペースれてるのと、からっぽのぎょうがあるのと、RNDってのがちっともわからないがよ!
自信じしんたっぷりにぜんぜんわからないってうんだね
じゃあ説明せつめいするよ。
まず1行目ぎょうめ、ワンパクくんのいう日本語にほんごがあるね。あたま'アポストロフィがついてるのに気がついたかな。これはコメントってうんだ。
'アポストロフィという記号きごう使つかうと、そのうしろはぎょう一番いちばん最後さいごまで無視むしされるんだ。
無視むしされるって、ちっともやくにはたたないってことか?
プログラムとしての役目やくめはないんだけど、無視むしされるってことぎゃくうと'アポストロフィうしろはなにいてもいいってことだね。
実際じっさいのプログラムでは、コメントはプログラムでなにをやっているかの説明せつめいいておくのに使つかうんだよ。変数へんすう役目やくめやわかりづらい動作どうさ説明せつめいいとくと、わかりやすいだろ?
1行目ぎょうめに「てきのざひょう」っていて、つぎぎょうEXEYをセットしてるってことは、EXEYてき座標ざひょうってことか。なるほど、たしかにわかりやすいぜ。
わかってくれたみたいだね!ちなみに'アポストロフィからうしろはプログラムとしては無意味むいみだから、入力にゅうりょくしなくても問題もんだいないよ。あとでわかりづらくなっちゃうけどね。
じゃあつぎにいこう。コメントにいてあるスプライトIDアイディーだけどこれはカンタン。スプライトの番号ばんごうっていう意味いみさ。
IDアイディーってのは英語のidentificationアイデンティフィケーションとかidentifierアイデンティファイヤーあたま2文字もじった略語りゃくごで、日本語にほんごだと識別子しきべつしっていうむずかしいやくもあるけど、プログラムのなかIDアイディーっててきたら番号ばんごう意味いみだとおもえばいいよ。
つぎは11行目ぎょうめから。LOOPループのうしろであたまにスペースを入れてるのはインデントっていう、プログラムをやすくする工夫くふうなんだ
このインデント使つかっても使つかわなくてもプログラムのうごきはわらないよ。ぎょうあたまにスペースを入れても無視むしされるんだ。
こうやってLOOPループENDLOOPエンドループのあいだにあるぎょうあたまインデントをつけると、どこがループのなか実行じっこうされるか一目ひとめでわかるおもわないかい?あとでためしにスペースを削除さくじょしてみて、どっちがやすいかたしかめてみるといいよ。
コメントインデントをつけたり、変数へんすう名前なまえをわかりやすくして、みやすいプログラムをくと、バグもにくくなるし、バグがとき原因げんいんをさがしやすくなるからとっても大事だいじことなんだ。
それと、5行目ぎょうめや9行目ぎょうめ改行かいぎょうだけはいっているからぎょうがあるよね?これもプログラムをみやすくするための工夫くふうさ。作文さくぶん段落だんらくけるように、プログラムちゅうでやっていることのかたまりごとにこうやってすきまをけるだけでプログラムがみやすくなるんだよ。もちろんからぎょうれてもプログラムのうごきはかわわらないんだ。
ふん、つまりプログラムもセイリセイトンが大事だいじってことだな!おりこうさんのかんがえそうなことだぜ!
まあそういうこと!
さてもうひとつのRNDランド。12行目ぎょうめと13行目ぎょうめだね。これは関数かんすう一種いっしゅさ。関数かんすうはおぼえてるかな?
なんだかよくわからないけどいろんなあたいかえすんだよな。これはナニをかえしてくれるんだ?
RNDランド乱数らんすうってのをかえしてくれるんだ。てっとりばやくうと、ばれるたびにサイコロをってバラバラなかずかえしてくれるんだよ。
てことは、1から6までなにかえってくるかわからないけど、どれかがかえってくるってことか?
おしいね。RNDランド引数ひきすうとして3ってのが指定していされてるだろ?RNDランド0から引数ひきすう-1までの目があるサイコロをって結果けっかかえってえばわかるかな?
つまり3だと、0から2をかえすと・・・0,1,2のどれかをバラバラにかえすってことか。
正解せいかい
そうすると、このEXEYの2つのしきはナニをやってるかというと、えーと・・・
EXに0,1,2のどれかをたして、1をひく・・・
んんん?んんんんん?
ワンパクくん、12しょうで、左右さゆうボタンがされたときことおもいだしてみて!
あのときひだりボタンがされたら1をひいて、みぎボタンがされたら1をたしたんだったな。座標ざひょうのXがちいさくなるとひだりに、おおきくなるとみぎにいったワケだ。
0,1,2のどれかをたして1をひくってことは、まとめると -1,0,1のどれかをたすってこと?
-1をたすってのは1をひくのとおなじだから・・・-1だとひだり、1だとみぎにいくってことか!
あいかわらず調子ちょうしいいじゃないか!そのとおりだよ!じゃあEYのほうはどうだろう?
XがYにかわっただけってことは、-1だと1るからうえ、1だと1えるからしたうごってこと?
よし、-1,1はわかったぜ。0の場合ばあいは・・・EXEYも0をたしてもなにわらないな。つまりうごかないってことか!
いいね!つまりこの12,13行目ぎょうめのふたつのしきなにをやっているかというと?
ちょっとてよ、こたえがもうかかってるぜ・・・
RNDランドかえしてきたバラバラな0,1,2によって、テキトウに上下じょうげ左右さゆううご
正解せいかい!じゃあ実際じっさいうごかしてみようか!
よし、うごけオレのシモベよ!


・・・
ちゃんとうごいたね!
また反応はんのうがうすい・・・
うごいたけどよう、今回こんかいもジミっつうか、なんかコバエがんでるっつうか、ザコにしてももうすこしかっこいいうごきを・・・
適当てきとう上下じょうげ左右さゆううごくだけだと、あまりおもしろいうごきにはならないねえ。
じゃあ、こんなのはどうかな?

 'てきのざひょう
 EX=200:EY=60
 'てきのそくど
 EVX=0:EVY=0
 'てきのいどうじかん
 ETIME=0
 'てきのスプライトID
 EID=100
 
 'てきスプライトひょうじ
 SPSET EID,1203
 SPOFS EID,EX,EY
 
 LOOP
  IF ETIME==0 THEN
   'うごくほうこうをきめる
   EVX=RND(3)-1
   EVY=RND(3)-1
   ETIME=20
  ENDIF
 
  'てきをうごかす
  ETIME=ETIME-1
  EX=EX+EVX
  EY=EY+EVY
  SPOFS EID,EX,EY
  VSYNC
 ENDLOOP

ちょっとながくなったし、変数へんすうもふえたよ!これはさきうごかしてみよう!


どれどれ・・・おお?ハエからトンボに進化しんかしたがするぞ!
このプログラムを説明せつめいをするよ!
最初さいしょのプログラムVSYNCブイシンクごとに座標ざひょうをてきとうに1ずつえていたよね。
今回こんかいは、うごかす方向ほうこう適当てきとうめたら、そのしばらくはその方向ほうこう移動いどうつづけるようにしたんだ。
そのまえに、15行目ぎょうめIFイフきかたなんかおかしくないか?THENゼンうしろになにいてないし、あと20行目ぎょうめにあるENDIFなんてのもはじめてるぜ。
これはIFイフぶんのもうひとつのかたで、ブロックIFイフぶんうんだ。
いままでのIFイフかたくとこうなるよ

 IF ETIME==0 THEN EVX=RND(3)-1:EVY=RND(3)-1:ETIME=20

つまり、ETIMEが0だったら、EVXEVYに-1,0,1を適当てきとうれて、ETIMEに20をれるっていう意味いみ
とはいえ、これだとTHENゼンうしろに:コロン使つかってたくさんの命令めいれいをつなげていてあって、みづらいとおもわないかい?
たしかに、THENゼンうしろがクシャクシャっとしててわかりづらいね。
そう。:コロン使つかうとたくさんの命令めいれいを1ぎょうにまとめてけるけど、つなげればつなげれるほどわかりづらくなるんだ。おなじような命令めいれいをまとめてきたいとき以外いがいは、:コロン使つかわないほうがみやすくなる。でもTHENゼンのうしろで:コロン使つかわないと、1命令めいれいしかけない。そこで登場とうじょうするのがこのブロックIFイフぶんだよ。
ブロックIFイフぶんのしるしはカンタン。THENゼンのうしろに命令めいれいなにかない。そうすると、SmileBASICスマイルベーシックつぎぎょう以降いこうもずっとTHENゼンとき実行じっこうする命令めいれいだとおもいこむんだ。
そして、ENDIFエンドイフ命令めいれい。これはここまでがTHENのときにやることですよっていう意味いみなんだよ。
ENDIFエンドイフかないとどうなるんだ?
ブロックIFイフぶんENDIFエンドイフかないと、ENDIFエンドイフがない!っていうエラーがるから注意ちゅういしてね。
なるほどな・・・このプログラムだと、THENゼンENDIFエンドイフのあいだにある16行目ぎょうめから19行目ぎょうめが、THENゼンとき実行じっこうされるってことだな!
そう!ついでに、16行目ぎょうめから19行目ぎょうめにもインデントがついてるよ。こうするとどこがTHENゼンとき実行じっこうされるかひとめでわかるだろ?
よーし、あとは解読かいどくするだけだな・・・
わかんねえ!なんかイッキにむずかしくなったがするぞ!
そうだねえ。しばらくうご方向ほうこう固定こていするってのをれただけなんだけど、それだけでかなりむずかしくなるんだ。すごいラスボスをつくるってのがどれほど大変たいへんなのかなんとなく想像そうぞうできるんじゃないかな。
くそう、オレはあきらめないぜ。まってろラスボス!
ヒントをそうか。ETIMEってのがこのプログラムのカギになる変数へんすうなんだ。ETIME注目ちゅうもくしてプログラムの最初さいしょから動作どうさっていってごらん。
よし・・・さいしょは6行目ぎょうめETIMEが0だな。そのままLOOPループ突入とつにゅうと。
で、15行目ぎょうめ、いきなりIFイフETIMEが0だったら、だから、THENゼンだな。ブロックIFイフぶんだから16行目ぎょうめから先を実行じっこうすると。
コメントは飛ばして17,18行目ぎょうめEVX,EVYには・・・お、これは最初さいしょのプログラムでいう-1,0,1のどれかがはいるってことか。
そして19行目ぎょうめETIMEに20をれると。そしてENDIFエンドイフたからブロックIFイフぶんはおしまい、と。
23行目ぎょうめETIME=ETIME-1。ここでETIMEは19になる。
24,25行目ぎょうめEXEYにそれぞれEVXEVYをたすってことは、IFイフぶんなかめた-1,0,1のどれかのあたいどおりに、上下じょうげ左右さゆううごくってことだな。ここからさき最初さいしょのプログラムとわってなさそうだな。
いいね!じゃあENDLOOPエンドループLOOPループのところにもどったらどうなる?
またIFイフだな。こんどはETIMEは0じゃないから、THENゼンはスキップと。これはENDIFエンドイフのうしろ、21行目ぎょうめまですっとばすってことだな?
正解せいかい!そのままいこう。
それで、ETIMEがこんどは18になって、EX,EYにまたEVX,EVYをたして、ということは、最初さいしょTHENゼンなかれたほうにまたうごくのか。
で、またENDLOOPエンドループて、ETIMEが17になって、またおなきにうごいて、16になって、またおなきにうごいて・・・
ははあ・・・つまりはだ!
おお?
ETIMEが0になるまでのあいだ、20かいおなじきにうごくってことか!
20かいうごくとETIMEが0になるから、THENゼンなかはいって、EVX,EVYあたいわる、つまりうごきがわる。そしてそのあと20かいTHENゼンをスキップするから、20かいおなきにうごく!なんてこった!
おめでとう!よくわかったね!
SmileBASICスマイルベーシックはすごくカンタンな言語げんごだから、どんなにむずかしくえても、いまやったみたいに1命令めいれいずつうごきをっていけば、かならず理解りかいできるはずさ。これからもこうやってプログラムのうごきを調しらべていくと、しらずしらずのあいだにいろんなきかたをおぼえられるよ。そうすればすごいラスボスもゆめじゃないね!
今回こんかいてきうごきをカンタンにRNDランド関数かんすうつくったけど、もっとったうごきをつくときは、あらかじめつくっておいたかっこいいうごきのとおりにうごかしたり、プレイヤーのいる場所ばしょによってうごきかたをえたり、いろんなことをするよ。どんなに複雑ふくざつことをしても、最終さいしゅうてきにはこのプログラムでいうEXEYをどんどんえていけば、がプログラムにしたがって画面がめんなかうごまわるんだよ。
プレイヤーはコントローラーの操作そうさEX,EYわるし、てきはプログラムで勝手かってわっていく。そうかんがえると、プレイヤーとてきは「うごかすきっかけがちがう」っていうだけでそれ以外いがいじつはいっしょっていうのは、あたまのかたすみにおいとくといいかもね。
そうそう、ダミーとはちがうけど、てきうごきのプログラムもAIエーアイえるよ。実際じっさい最近さいきんのすごいゲームだと、ダミーみたいな本当ほんとうAIエーアイてきうごいていてものすごくかしこうごきをしたりするんだ。



ワンパクくん本当ほんとう見上みあげたもんじゃ。わしも見習みならわんといかんな。
さて、今回こんかい2つのプログラムを紹介しょうかいしたが、入力にゅうりょくしてもかまわないし、入力にゅうりょくしたくないめんどくさがりやさんよう公開こうかいキーもつくっておいた!42APE33QJじゃ!
プチコン4の作品さくひん公開こうかい作品さくひんってXエックスボタンをすと公開こうかいキー入力にゅうりょく画面がめんてくる。そこで42APE33QJと入力するとダウンロードができるぞい。ローカルしょしんしゃガイド13しょう サンプルという作品さくひんえてるとおもうから、そこでマイナスボタンをすと、3つのプログラムがてくる。P1が最初さいしょ、P2が2番目ばんめのプログラムじゃ。MAIN.PRGは使つかわないのでにせんでええぞ。そのままえらんで+プラスボタンをすと実行じっこうできるぞい。
実行じっこうしたあとは、+プラスボタンでプログラムをめたあと、プチコン4の最初さいしょ画面がめんもどってプログラムをつくえらんでくれい。ジョイコンXエックスボタンかUSBユーエスビーキーボードのF4キーをすとプログラムをことができる!
ちなみにこのやりかたはほか作品さくひんでも使つかえるんじゃ。ほかひと作品さくひんあそんで、こいつはすごい!どうやってるかてみたい!とおもったら、+プラスボタンでプログラムをめて、プログラムをつくけばプログラムをのぞくことができるぞい。すごいひとのプログラムを調しらべるのはとてもいプログラミングの勉強べんきょうになるから、ためしてみてくれい。



今回のポイント

NEW

エディットモードで編集へんしゅうちゅうのプログラムをしたいときにはダイレクトモードでNEWと入力し、Enterしてください。
セーブしていないとほんとうにえてしまうので注意ちゅうい

RND

0から引数ひきすう-1までのあいだ乱数らんすう(バラバラのかず)をかえ関数かんすうです。たとえばRND(6)は0から5のあいだかずをバラバラにかえします。RND(6)+1とすればサイコロがわりになります。

ブロックIF文

THENゼンのうしろに命令めいれいかずにすぐ改行かいぎょうするブロックIFイフぶん開始かいしです。そのあとENDIFエンドイフくまでTHENゼン処理しょりする内容ないよう何行なんぎょうでもかくことができます。

コメント

'アポストロフィ記号きごうのうしろは行末ぎょうまつまでなにをいても無視むしされます。
プログラムの説明せつめいいておくのに使つかいます。

インデント

ぎょうあたまにスペース文字もじがいくつあっても無視むしされます。
ループのなかブロックIFイフぶんなかはインデントを使つかってわかりやすくきましょう。

サンプルプログラムの公開キー

42APE33QJ



さて、最後さいごに2番目ばんめのプログラムを使つかった問題もんだいをいくつかしておこう。まだまだものたりないぜ!というキミはぜひチャレンジしてくれい。
その1:左右さゆうにしかうごかないてきつくってみるのじゃ!ヒントは、上下じょうげうごきをめればよいぞ?。
その2:きをえる間隔かんかくをもっとながくしてみるのじゃ!ヒントは、ずばりETIMEじゃ!
もう2もんはちょいとむずかしいぞい!
その3:きをえる間隔かんかくをバラバラにしてみよう!IFイフ文の中でETIMEにセットするあたいをバラバラにすればいいんじゃが、バラバラなあたいというのはなんじゃったかの?
その4:てきキャラのうごくスピードをはやくしてみよう!ヒントはEVX,EVYじゃ!いろんなやりかたがあるぞい。