目次
前
次
PONG(game)
PONG(ポン)は、table tennisを電子回路を実現した
TVゲームです。
ATARI社のゲームマシンで人気でしたが、高校生のとき
同級生の自宅で大画面で対戦していました。
人間が2人で対戦タイプのゲームですが、コンピュータと
人間が対戦するゲームとして作っていきます。
画面は、コンピュータが左のラケットを扱い、人間は
右のラケットを操作します。
ラケットを上下に移動させるため、関数INKEYを使い
↑と↓の使っている数値を取得して、確認します。
この動作テストプログラムは、以下。
10 '
20 @LOOP
30 I=INKEY()
40 ? I
50 WAIT 60
60 IF BTN() GOTO @EXIT
70 GOTO @LOOP
80 @EXIT
90 CLS
95 END
↑が30、↓が31とわかったので、ラケットを動かす
プログラムを書いてみます。
10 '
20 H=12:LC 28,H:? "|"
30 @LOOP
40 H=H+BTN(31)-BTN(30)
50 LC 28,H:? "|":WAIT 10
60 IF BTN() GOTO @EXIT
70 GOTO @LOOP
80 @EXIT
90 CLS
95 END
ラケットの移動は、次のサブルーチンで扱います。
100 @RMOV
110 H=H+BTN(31)-BTN(30)
120 LC 28,H:? "|"
130 RETURN
ボールを出現させて、移動するには
LOCATEを使って、位置を決めてから
表示すればよいでしょう。
ボールの位置を、(X,Y)とすれば、ボールの表示は
LC X,Y:? "o"
とすればよいはず。
ボールの移動は、次のサブルーチンで扱います。
200 @BMOV
210 LC X,Y:? "o"
220 WAIT 10
230 X=X + Z
240 Y=Y + U
250 RETURN
位置を示す値が決まっているとして、その位置に
ボールを表示。それが終わったなら、次の処理に
備えて、位置を示す値を更新しておきます。
変数に入っている値は、他のサブルーチンで決定する
ことにしましょう。
乱数を利用して、変数の値を決めてやれば
よいでしょう。0から9の値を求めておき
位置を示す変数に加減算します。
サブルーチンで定義すると、以下。
300 @INIT
310 R=RND(10)
320 X=12+R:Y=12-R
330 Z=1
340 U=-1
350 RETURN
これで、最初のボールの位置と移動する
方向と向きを決められます。
ボールは、時間とともに位置を変えますが
壁やラケットに当たったときには、方向と
向きを変えないといけません。
壁は4面あるので、Xが0と31になったときは
方向の値を逆にします。Yが0と24になったら
方向を逆にします。
サブルーチンの中を次のように変えるとよいでしょう。
200 @BMOV
210 LC X,Y:? "o"
220 WAIT 10
230 X=X + Z
240 IF X=0 || Y=31 Z=Z * (-1)
250 Y=Y + U
260 IF Y=0 || Y=24 U=U * (-1)
270 RETURN
ボールがラケットに当たったときも、方向を
変えていかないと駄目なので、壁とは別の
サブルーチンで判定します。
400 @HIT
410 A=SCR(X,Y):B=SCR(X,Y)
420 IF A=#7C || B=#3A GOTO 440
430 GOTO 470
440 Z=Z * (-1):U=U * (-1)
450 IF A=#7C P=P+1
460 IF B=#3A C=C+1
470 RETURN
方向を変えるだけでなく、コンピュータと
人間の得点を加算しておきます。
得点表示と時間切れの判定をサブルーチン
の中で決めます。
500 @SHOW
510 LC 5,24:? C
520 LC 15,24:? P
530 T=TICK()
540 IF T > 3600 G=0
550 RETURN
まとめると、次のようになります。
10 ' test10
20 GSB @INIT
30 @LOOP
40 CLS
50 GSB @RMOV:GSB @BMOV:GSB @HIT:GSB @SHOW
60 IF G=0 GOTO @EXIT
70 GOTO @LOOP
80 @EXIT
90 END
100 @RMOV
110 H=H+BTN(31)-BTN(30)
120 LC 28,H:? "|"
130 M=M+K
140 IF M=0 || M=24 K=K*(-1)
150 LC 2,M:? ":"
160 RETURN
200 @BMOV
210 LC X,Y:? "o"
220 WAIT 10
230 X=X + Z
240 IF X=0 || Y=31 Z=Z * (-1)
250 Y=Y + U
260 IF Y=0 || Y=24 U=U * (-1)
270 RETURN
300 @INIT
310 R=RND(10)
320 X=12+R:Y=12-R
330 Z=1
340 U=-1
350 K=1
360 G=1:C=0:P=0
370 RETURN
400 @HIT
410 A=SCR(X,Y):B=SCR(X,Y)
420 IF A=#7C || B=#3A GOTO 440
430 GOTO 470
440 Z=Z * (-1):U=U * (-1)
450 IF A=#7C P=P+1
460 IF B=#3A C=C+1
470 RETURN
500 @SHOW
510 LC 5,24:? C
520 LC 15,24:? P
530 T=TICK()
540 IF T > 3600 G=0
550 RETURN
目次
前
次