guide12

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

ここから先だけど、キミたちはどんなゲームを作つくりたいんだい?
うーんそうだねえ。ボクは・・・
シューティングだシューティング!チョウのように舞まいハチのように刺さす!アットウテキな連射れんしゃで全部ぜんぶぶっこわす!まさにゲームの中なかのゲーム!
・・・まあ、ワンパク君くんがそこまで言いうならシューティングでいいよ。
カンタンなシューティングゲームなら初心者しょしんしゃにも作つくりやすいから、ボクも賛成さんせいするよ。
となると、なにから手てをつけようかなあ・・・
そんなのはわかりきったことだぜ。ムジヒなこうげきでプレイヤーを殺ころしにくるものすごいラスボスをつくろうぜ!死しぬがよい!
うーん、ものすごいラスボスはものすごい高度こうどなプログラムが必要ひつようだよ。たとえばかっこいい弾幕だんまくやレーザーを打うつにも、三角さんかく関数かんすうやらなにやら・・・
ううっ、また数学すうがくか!プレイヤーを殺ころしにいく前まえにオレサマが殺ころされちまう・・・
よし、まずは手始てはじめにザコキャラから作つくろう。ザコキャラもものすごいラスボスも、基本きほんは同おなじだからね。
いいかい、プレイヤーと同おなじで、敵てきもスプライトを使つかうよ。
じゃあ、下したのプログラムを入力にゅうりょくしてみてね!敵てきを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
ふふん、どうってことないプログラムだな!なんか日本語にほんごがまざってるのと、LOOPループの後あとの行ぎょうで頭あたまにスペース入いれてるのと、からっぽの行ぎょうがあるのと、RNDってのがちっともわからないがよ!
自信じしんたっぷりにぜんぜんわからないって言いうんだね
じゃあ説明せつめいするよ。
まず1行目ぎょうめ、ワンパク君くんのいう日本語にほんごがあるね。頭あたまに'アポストロフィがついてるのに気がついたかな。これはコメントって言いうんだ。
'アポストロフィという記号きごうを使つかうと、その後うしろは行ぎょうの一番いちばん最後さいごまで無視むしされるんだ。
無視むしされるって、ちっともやくにはたたないってことか?
プログラムとしての役目やくめはないんだけど、無視むしされるって事ことは逆ぎゃくに言いうと'アポストロフィの後うしろは何なにを書かいてもいいって事ことだね。
実際じっさいのプログラムでは、コメントはプログラムで何なにをやっているかの説明せつめいを書かいておくのに使つかうんだよ。変数へんすうの役目やくめやわかりづらい動作どうさの説明せつめいを書かいとくと、わかりやすいだろ?
1行目ぎょうめに「てきのざひょう」って書かいて、次つぎの行ぎょうでEXとEYをセットしてるって事は、EXとEYが敵てきの座標ざひょうってことか。なるほど、たしかにわかりやすいぜ。
わかってくれたみたいだね!ちなみに'アポストロフィから後うしろはプログラムとしては無意味むいみだから、入力にゅうりょくしなくても問題もんだいないよ。あとでわかりづらくなっちゃうけどね。
じゃあ次つぎにいこう。11行目ぎょうめから。LOOPループのうしろで頭あたまにスペースを入れてるのはインデントっていう、プログラムを見みやすくする工夫くふうなんだ
このインデントも使つかっても使つかわなくてもプログラムの動うごきは変かわらないよ。行ぎょうの頭あたまにスペースを入れても無視むしされるんだ。
こうやってLOOPループとENDLOOPエンドループのあいだにある行ぎょうの頭あたまにインデントをつけると、どこがループの中なかで実行じっこうされるか一目ひとめでわかると思おもわないかい?あとでためしにスペースを削除さくじょしてみて、どっちが見みやすいかたしかめてみるといいよ。
コメントやインデントをつけたり、変数へんすうの名前なまえをわかりやすくして、読よみやすいプログラムを書かくと、バグも出でにくくなるし、バグが出でた時ときも原因げんいんをさがしやすくなるからとっても大事だいじな事ことなんだ。
それと、5行目ぎょうめや9行目ぎょうめに改行かいぎょうだけ入はいっている空からの行ぎょうがあるよね?これもプログラムを読よみやすくするための工夫くふうさ。作文さくぶんで段落だんらくを分わけるように、プログラム中ちゅうでやっている事ことのかたまりごとにこうやってすきまを空あけるだけでプログラムが読よみやすくなるんだよ。もちろん空からの行ぎょうを入いれてもプログラムの動うごきは変かわわらないんだ。
ふん、つまりプログラムもセイリセイトンが大事だいじって事ことだな!おりこうさんの考かんがえそうな事ことだぜ!
まあそういうこと!
さてもうひとつのRNDランド。12行目ぎょうめと13行目ぎょうめだね。これは関数かんすうの一種いっしゅさ。関数かんすうはおぼえてるかな?
なんだかよくわからないけどいろんな値あたいを返かえすんだよな。これはナニを返かえしてくれるんだ?
RNDランドは乱数らんすうってのを返かえしてくれるんだ。てっとりばやく言いうと、呼よばれるたびにサイコロを振ふってバラバラな数かずを返かえしてくれるんだよ。
てことは、1から6まで何なにが返かえってくるかわからないけど、どれかが返かえってくるってことか?
おしいね。RNDランドに引数ひきすうとして3ってのが指定していされてるだろ?RNDランドは0から引数ひきすう-1までの目があるサイコロを振ふって結果けっかを返かえすって言いえばわかるかな?
つまり3だと、0から2を返かえすと・・・0,1,2のどれかをバラバラに返かえすってことか。
正解せいかい!
そうすると、このEXとEYの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の場合ばあいは・・・EXもEYも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だったら、EVXとEVYに-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行目ぎょうめ、EXとEYにそれぞれEVXとEVYをたすってことは、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ランド関数かんすうで作つくったけど、もっと凝こった動うごきを作つくる時ときは、あらかじめ作つくっておいたかっこいい動うごきのとおりに動うごかしたり、プレイヤーのいる場所ばしょによって動うごきかたを変かえたり、いろんな事ことをするよ。どんなに複雑ふくざつな事ことをしても、最終さいしゅう的てきにはこのプログラムでいうEXとEYをどんどん変かえていけば、絵えがプログラムにしたがって画面がめんの中なかを動うごき回まわるんだよ。プレイヤーはコントローラーの操作そうさでEX,EYが変かわるし、敵てきはプログラムで勝手かってに変かわっていく。そう考かんがえると、プレイヤーと敵てきは「動うごかすきっかけが違ちがう」っていうだけでそれ以外いがい実じつはいっしょっていうのは、頭あたまのかたすみにおいとくといいかもね。
そうそう、ダミーとは違ちがうけど、敵てきの動うごきのプログラムもAIエーアイと言いえるよ。実際じっさい最近さいきんのすごいゲームだと、ダミーみたいな本当ほんとうのAIエーアイで敵てきが動うごいていてものすごく賢かしこい動うごきをしたりするんだ。

ワンパク君くんは本当ほんとうに見上みあげたもんじゃ。わしも見習みならわんといかんな。
さて、今回こんかい2つのプログラムを紹介しょうかいしたが、手てで入力にゅうりょくしてもかまわないし、入力にゅうりょくしたくないめんどくさがりやさん用ように公開こうかいキーも作つくっておいた!
プチコン4の作品さくひんを見みるで公開こうかい作品さくひんに行いってXエックスボタンを押おすと公開こうかいキー入力にゅうりょく画面がめんが出でてくる。そこでXDFDFDXと入力するとダウンロードができるぞい。ローカルに初心者しょしんしゃガイド12章しょうという作品さくひんが増ふえてると思おもうから、そこをでマイナスボタンを押おすと、2つのプログラムが出でてくる。XXX1が最初さいしょ、YYYY2が2番目ばんめのプログラムじゃ。そのまま選えらんで+プラスボタンを押おすと実行じっこうできるぞい。
実行じっこうしたあとは、+プラスボタンでプログラムを止とめたあと、プチコン4の最初さいしょの画面がめんに戻もどってプログラムを作つくるを選えらんでくれい。ジョイコンXエックスボタンかUSBユーエスビーキーボードのF4キーを押おすとプログラムを見みる事ことができる!
ちなみにこのやりかたは他ほかの作品さくひんでも使つかえるんじゃ。他ほかの人ひとの作品さくひんを遊あそんで、こいつはすごい!どうやってるか見みてみたい!と思おもったら、+プラスボタンでプログラムを止とめて、プログラムを作つくるに行いけばプログラムをのぞく事ことができるぞい。すごい人ひとのプログラムを調しらべるのはとても良よいプログラミングの勉強べんきょうになるから、ためしてみてくれい。
さて、最後さいごに2番目ばんめのプログラムを使つかった問題もんだいをいくつか出だしておこう。まだまだものたりないぜ!というキミはぜひチャレンジしてくれい。
その1:左右さゆうにしか動うごかない敵てきを作つくってみるのじゃ!ヒントは、上下じょうげの動うごきを止とめればよいぞ?。
その2:向むきを変かえる間隔かんかくをもっと長ながくしてみるのじゃ!ヒントは、ずばりETIMEじゃ!
もう2問もんはちょいとむずかしいぞい!
その3:向むきを変かえる間隔かんかくをバラバラにしてみよう!IFイフ文の中でETIMEにセットする値あたいをバラバラにすればいいんじゃが、バラバラな値あたいというのはなんじゃったかの?
その4:動うごくスピードを速はやくしてみよう!ヒントはEVX,EVYじゃ!いろんなやりかたがあるぞい。

guide12.txt · Last modified: 2019/11/08 15:00 (external edit)

Page Tools