プログラミング超初心者のための講座
 第17回 BASIC編「アクションゲームを作る」(見えない壁)


さて第17回が始まりましたよ。 忘れ物はないですか?

前回のプログラムでエラーが出ました。

5 X=40:Y=10
10 K$=INKEY$
15 IF K$="4" THEN X=X-1
16 IF K$="6" THEN X=X+1
17 IF K$="8" THEN Y=Y-1
18 IF K$="2" THEN Y=Y+1
20 LOCATE X,Y:PRINT"A"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,Y:PRINT" "
30 GOTO 10

このプログラムだと画面からはみ出たときに
エラーになってしまいます。そりゃそうですよね。
LOCATEでマイナスを指定しても「そんな座標はないよ」といって怒られてしまいます。

そこで今回はこの対処法をやってみましょう。

謎の壁ブロック崩し

この小見出しに意味はありませんので(^^ゞ
(昔ファミコンディスクゲームにそんな名前のがあったもので、、、)

つまり、壁を作ってそれ以上先へ進めなくすればよいのです。
ところがおもしろいことに現実の世界とプログラムの世界では
逆なんです。なにが逆かって?

たとえば手を机の上に向かって下ろしてください。
机の上で止まりませんか?そんなことはあたりまえですって?
そうです。あたりまえなんです。机があるおかげでそれ以上手をおろせないのです。
机に当たってしまうからですね。
BASICプログラムで再現するとどうなるでしょうか?
実はまず先に止まるんです。そしてそこに机があることにするのです。
現実では机があって止まりますよね。BASICでは止まってから机があるんです。
なんだか訳が分からなくなりましたね。ではやってみましょう。
 

どうやって動かなくするかです。
今のプログラムでは無制限にXやYの値が変化してしまいます。
そのため時にはマイナスになったり必要以上に大きくなってしまいます。

そこで制限をかけます。左へ動かす為Xの値を減らしているところで
さらに判断をします。
つまり「もしXの値がマイナスになるならXの値を引かなければよい」のです。

現在はこうなっています
15 IF K$="4" THEN X=X-1

どうやって式にしましょうか、、、、ちょっと複雑ですね。
そこで表現を変えてみましょう。
もしXの値を引いてもマイナスにならなければXの値を引け」ばよいのです。
これならできそうです。

答えはこうなります。
15 IF K$="4" THEN IF X>0 THEN X=X-1

わかりますか?
キーを押してみてください、左へ左へどんどんどんどん進みます。
あら?
さっきはエラーが出たのに画面の端っこで止まりましたね。
これを4方向ともやればいいんです。

さらに行動半径を狭くしてみましょう。

プログラムはこうなります

5 X=40:Y=10
10 K$=INKEY$
15 IF K$="4" THEN IF X>20 THEN X=X-1
16 IF K$="6" THEN IF X<60 THEN X=X+1
17 IF K$="8" THEN IF Y>10 THEN Y=Y-1
18 IF K$="2" THEN IF Y<20 THEN Y=Y+1
20 LOCATE X,Y:PRINT"A"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,Y:PRINT" "
30 GOTO 10

いかがですか?
4方向ともまるで見えない壁ができたかのように
ぴたっととまりますね。
おもしろいでしょう。

これであとはこの止まる外側に壁の絵を描けば
まるで壁に当たって止まったように見えるのです。

これが最初に言った現実との逆転現象です。

では壁を書いてみましょう。以下の通りに付け加えます。
ついでですからRENUMで行番号を振り直しておきましょう
さらにREMで注釈をつけて、、、

10 REM ====== 初期設定 ============
20 X=40:Y=10
30 REM ====== 枠 描画 ============

40 LOCATE 19,9:PRINT"##########################################";
41 LOCATE 19,9:PRINT"#                                #";
42 LOCATE 19,9:PRINT"#                                #";
43 LOCATE 19,9:PRINT"#                                #";
44 LOCATE 19,9:PRINT"#                                #";
45 LOCATE 19,9:PRINT"#                                #";
46 LOCATE 19,9:PRINT"#                                #";
47 LOCATE 19,9:PRINT"#                                #";
48 LOCATE 19,9:PRINT"#                                #";
49 LOCATE 19,9:PRINT"#                                #";
50 LOCATE 19,9:PRINT"#                                #";
51 LOCATE 19,9:PRINT"##########################################";

60 REM ====== キーニュー力 ============
70 K$=INKEY$
80 IF K$="4" THEN IF X>20 THEN X=X-1
90 IF K$="6" THEN IF X<60 THEN X=X+1
100 IF K$="8" THEN IF Y>10 THEN Y=Y-1
110 IF K$="2" THEN IF Y<20 THEN Y=Y+1

120 REM ====== キャラクタ表示 ============
130 LOCATE X,Y:PRINT"A"
140 FOR I=0 TO 100:NEXT I
150 LOCATE X,Y:PRINT" "
160 GOTO 10
 
  いかがですか?
決められた壁の中を自分の思ったとおりにキャラクタが走り回るようになりました。

これでキャラクタを動かす基本はおしまいです。
あとは将来的にはAではなくてかっこいいキャラクタを描いてもやっていることは同じです。

次は・・・
最初は面白がって走り回らせていますが、人間せっかく苦労して作ったのにすぐに飽きてしまいます。
こうなると、 アクションゲームですから剣をもたせて、振り回したくなりますね(ちょっと強引だな、、)
次回はこれをやります。

 

では
次回の講義をお楽しみに
さいなら

もどる



このページはNetscapeNavigator or Netscape Communicator 4.7で
きれいに見えるように作られています。そちらをお使いください。