りょうのゲーム塾 -112ページ目

りょうのゲーム塾

再開、準備中。

チェックポイント
現段階でのサンプルに転記ミスがありました。
修正をお願いします。


■プログラム
変更前
0045 @UFO_WAIT
0046 UFO_CNT = UFO_CNT + 1
0047 IF UFO_CNT > 0 THEN RETURN
0048 GOTO @UFO_RSET


■プログラム
変更後
0045 @UFO_WAIT
0046 UFO_CNT = UFO_CNT - 1
0047 IF UFO_CNT > 0 THEN RETURN
0048 GOTO @UFO_RSET


今後もこの様な転記ミスはあると思います。
実際にプチコンで動作しているプログラムを表示できれば良いのですが、
残念ながらその方法がありません。

しかし現在簡易的に行われているようなプチコンの画面を画像にして転記する方法は容量的に問題があるのと1画面にマルチステートメントで多くのコードを乗せるとソースが見ずらいだけでなく、説明するのにも支障がでます。

サンプルを使用される方はプログラムの意味を理解していただき、
コードを入力していただきたいと思います。

どうぞ、宜しくお願いします。
チェックポイント
現在、みなさんの使っているプチコンのベーシックにはバグがあります。
今までにみつかっているものについては確認をしておいてください。
そのうえで今回、サンプルの中で使っていたFOR文にバグがあります。
その内容と回避について説明します。


バグを起こすサンプルです。

■プログラム
0001 ' bug sample 1
0002 @LOOP
0003 FOR I=0 TO 9
0004 IF I==2 GOTO @LOOP
0005 NEXT I

■プログラム
0001 ' bug sample 2
0002 @LOOP
0003 GOSUB @SUB
0004 GOTO @LOOP
0005 @SUB
0006 FOR I=0 TO 9
0007 IF I==2 THEN RETURN
0008 NEXT I
0009 RETURN


どちらも Out of memory というエラーで止まります。
このようにエラーで実行が不可能で終了することをアボートといいます。

上のサンプルはFOR文のループの中で条件が成立した場合先頭の@LOOPに戻ります。
サンプルは無理やり条件が成功するようにしてありますが、
このプログラムはすでにゲーム中で使っています。
下のサンプルにおいては前回の検索で使用したコードとほぼ同じです。
ゲームの方では発射していない武器を捜すため配列 TK1_F の要素が0のものを探すためにFORを使いました。
これがエラーとなります。

じゃ、なんで今エラーがでないのと思われますが、
実はすぐにはエラーになりません。
ただし、遊んでいるとそのうちにアボートします。

この原因は簡単なのですがプログラム初心者の方には難解なので説明は省きます。
ただこのパターンは今後よく使います。
スマイルブームへメールしましたがこれについてもバグ修正はできているとの事だったのでアップデートで解決すると思います。
ただ、現在のままでいくかどうかなのですが、回避策をここで紹介しておきましょう。
本来FOR文はあるパターンのプログラムを簡略化するために作られた命令です。
要するに、プログラムのなかで良く使われるということです。

では下のサンプルを変更してみます。

■プログラム
0001 ' bug sample 2
0002 @LOOP
0003 GOSUB @SUB
0004 GOTO @LOOP
0005 @SUB
0006 'FOR I=0 TO 9
0007 I=0
0008 @FOR_LOOP
0009 IF I==2 THEN RETURN
0010 'NEXT I
0011 IF I==9 GOTO @FOR_END
0012 I=I+1
0013 GOTO @FOR_LOOP
0014 @FOR_END
0015 RETURN


今後、バグ修正があったらもとに戻す必要があるので元のFOR文は注釈にしてあります。
0006行目のFOR文の意味は・・・

①ループのカウントをする変数がIであり、初期値として0を代入
②変数は増分が1(STEP が省略されているので増分は1です)
③Iが9になるまでループ

0007行目では変数Iを0で初期化しています。(①の部分)
0008行目はループの先頭を表すラベルです。(FOR文では現れない)

0011行目は変数Iが終値であるかどうか判定し最後までループが実行されたらループから抜け出します。(③の部分)
0012行は変数Iに増分を加算します。(②の部分)
0013行はループの先頭に戻ります。
0014行はループから抜け出すためのラベルです。(FOR文では現れない)
チェックポイント
2進数、16進数についての補足です。


今、10という数値があります。
10進数しか知らなかった人にはこれは『じゅう』ですよね。

しかし、皆さんは2進数や16進数の存在を知ってしまいました。

この10が10進数なのか、2進数なのか、または16進数なのか見分けがつきますか?

数学の分野ではこの問題を数値を(と)で囲み後ろに下付き文字で2進数のときは2を、
10進数のときは10を、16進数のときは16と記述します。

手書きやワープロだったら下付きや上付き文字の表示は簡単ですが、
そうでない場合には記述しづらいですよね。

このブログではべき乗が上付き文字だったので回避策とし^を使いました。
これと同じ方法は見栄えがよくないので違う方法をとります。

一般的なプログラミングの世界では(といってもアセンブラの世界のことです)
数値列の最後に2進数の場合にはBを10進数の場合にはDを、
そして16進数の場合にはHを記述します。
上記の例の場合、

2進数は・・・10B
10進数は・・・10D
16進数は・・・10H

10進数については省略してよいことになってることが多いので、

2進数は・・・10B
10進数は・・・10
16進数は・・・10H

となります。

読み方も違いがあり

2進数は・・・10B・・・『イチ・マル』
10進数は・・・10・・・『ジュウ』
16進数は・・・10H・・・『イチ・マル・ヘキサ』

10進数は最後のDを省略しましたが、
10進数以外は一桁ごとに読みます。
2進数はイチとマルだけなのでBの読みに方『バイナリ』を省略します。
16進数は逆に他のものと分かるように最後にHの読み方ヘキサデシマルをヘキサとして呼びます。

コンピュータのプログラムの中にも上のような表記で使われることがあります。

コンパイラなどでは2進数の場合先頭に&Bを、16進数の場合&Hをつけることがあります。
比較的10進数に何か特徴をつけることはないと思います。
ちなみにあと8進数がプログラムで使われることがあるので先頭に&Oをつけることがあります。
ちなみにOはオクタルの意味です。
ここでは8進数についてはもう説明はしません。