【はじめてのプチコン】乱数の導入 | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

チェックポイント
サンプルゲームに乱数を導入してみました。
乱数の導入により、よりゲームらしくなったと思います。


サンプルゲームの変更部分のプログラムです。

■プログラム
'
' system
'
@SYS_INI
CLEAR
SYS_CNT = 0
SYS_KEY = BUTTON()
RETURN
'
@SYS_MAIN
VSYNC 1
CLS
SYS_CNT = (SYS_CNT + 1) AND &H3FFFF
OLD_KEY = SYS_KEY
SYS_KEY = BUTTON()
TRG_KEY = SYS_KEY XOR OLD_KEY
ON_KEY = TRG_KEY AND SYS_KEY
RETURN
'
' UFO task
'
@UFO_INI
UFO_SX = 0.1
UFO_F = 0
UFO_CNT = 60
RETURN
'
@UFO_TASK
ON UFO_F GOTO @UFO_WAIT,@UFO_MVR,@UFO_MVL
STOP
'
@UFO_WAIT
UFO_CNT = UFO_CNT - 1
IF UFO_CNT > 0 THEN RETURN

IF RND(2) GOTO @UFO_LSET

GOTO @UFO_RSET
' move right
@UFO_MVR
LOCATE UFO_X,UFO_Y
PRINT "A"
UFO_X = UFO_X + UFO_SX
IF UFO_X > 32 GOTO @UFO_DETH
HITX = UFO_X
HITY = 0
GOSUB @WPN_HITC
IF HITF GOTO @UFO_DETH
RETURN
'
@UFO_LSET
UFO_X = 31
UFO_Y = RND(10)
UFO_F = 2
RETURN
' move left
@UFO_MVL
LOCATE UFO_X,UFO_Y
PRINT "A"
UFO_X = UFO_X - UFO_SX
IF UFO_X < 0 GOTO @UFO_DETH
HITX = UFO_X
HITY = 0
GOSUB @WPN_HITC
IF HITF GOTO @UFO_DETH
RETURN
'
@UFO_RSET
UFO_X = 0
UFO_Y = RND(10)
UFO_F = 1
RETURN
'
@UFO_DETH
UFO_F = 0
UFO_CNT = RND(60)
RETURN


システム部分に変更があります。
変更部分はシステムカウンタのカウントアップ部分です。

SYS_CNT = (SYS_CNT + 1) AND &H3FFFF

これはSYS_CNTに1を足していきますが、すぐにはエラーがでません。
しかしコンピュータの変数は有限なデータなので上限値が決まっています。
これをオーバーするとオーバーフローエラーが発生します。
それを起こさないためにマスクをしています。
マスクについては解説してありますが今回のケースは前回のマスクとは意味合いが違うため必要になった時に解説します。
ここでは変更だけしておいてください。

あとはUFO部分の変更です。

①ラベル@UFO_WAIT部分の変更点


IF RND(2) GOTO @UFO_LSET


1行追加されています。
今まではUFOが画面に出るまで60フレーム待ちました。
時間になると@UFO_RSETへジャンプしUFOが画面左端に表示され移動し始めます。

今回の変更でRND(2)により0から1までの乱数が発生します。
ここでUFOを右端から出すか、左端から出すかを決めているのです。
それの乱数を使うので右か左かは分かりません(ランダムです)。


②UFO表示の変更
右移動および左移動ともにUFOの表示を行っている部分が下記のように変更されています。

LOCATE UFO_X,UFO_Y
PRINT "A"

今までUFOは画面一番上の行を移動していましたが新たに変数UFO_Yを使いY座標を変更できるようにしました。


③UFOの画面端に到達したときの処理を変更

UFO_X = UFO_X + UFO_SX
IF UFO_X > 32 GOTO @UFO_DETH

右移動の部分で説明します。
右に移動し端に到達したか判定し端に来た場合、今までは反転していました。
そこを端まで来たらUFOを消しています。
要するにUFOは往復しません。


④移動の初期化を変更

@UFO_RSET
UFO_X = 0
UFO_Y = RND(10)
UFO_F = 1
RETURN

右移動および左移動の初期化部分で新たに変数UFO_Yの初期化を行っています。
Y方向の座標を与えていますがRND(10)により0から9までの乱数が代入されるのでUFOの位置をランダムに変更できます。


⑤UFOが画面に発生するまでの待ち時間処理の変更

@UFO_DETH
UFO_F = 0
UFO_CNT = RND(60)
RETURN

UFOがプレイヤの武器で破壊されたか画面移動で端に到達した場合、いったんUFOを消し新たに画面に登場させるまでの待ち時間を今まで60フレーム固定にしていました。
それを0から59フレームの乱数にしました。
これで現れるタイミングにばらつきができます。