前回作ったナイトライダーを思い出して下さい。
こんなのでした。
10 FOR X=10 TO 30
20 LOCATE X,10:PRINT"#"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,10:PRINT" "
30 NEXT I
40 FOR X=30 TO 10 STEP -1
50 LOCATE X,10:PRINT"#"
60 FOR I=0 TO 100:NEXT I
70 LOCATE X,10:PRINT" "
80 NEXT I
90 GOTO 10
これでキャラクタを動かすことができるようになりました。
自由に動きたい
ところがこれでは勝手に動いているだけであまりおもしろくはありません。
そこで、こちらが好きに操れるようにしたいと思います。
どうしたらいいかは何となく予想がつきませんか?
どこに移動するか人間に尋ねてそこへ表示したらよいのです。
「うーん、じゃあこんなかんじかな」
作り直してみました
10 INPUT X
20 LOCATE X,10:PRINT"A"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,10:PRINT" "
30 GOTO 10
でもこれではあまりおもしろくありませんね。
直接座標を指定するのではなく、キーを押したらその方向に動いて欲しいですね。
これも簡単です。あるキーを押したら、たとえば4を押したら左へ動き6を押したら右へ動く
こんな感じです。ノートパソコンの人破片に思おうかもしれませんが、フルキーボードの場合
右にテンキーがついていますよね。ここに手をおくと丁度いい感じになります。昔から4628で上下左右に
動くプログラムがたくさんでまわっていました。
10 INPUT X
15 IF X=4 THEN X=X-1
16 IF X=6 THEN X=X+1
20 LOCATE X,10:PRINT"A"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,10:PRINT" "
30 GOTO 10
いかがでしょう?一見うまくいきそうなプログラムですが実はうまくいきません。
4というキーを押して得られるのは4という数字ではなく4という文字なのです。
なので文字として扱うためXではなくX$として変数を使います。$のついた変数は
文字列を扱えるんでしたね。そして当然文字ですから、ダブルクォーテーションをつけて
10 INPUT X$
15 IF X$="4"
THEN X=X-1
16 IF X$="6"
THEN X=X+1
20 LOCATE X,10:PRINT"A"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,10:PRINT" "
30 GOTO 10
となります。
さあ!自由に動くようになったでしょう?え?なんかブーイングが聞こえますねえ
そうなんです動くことは動くけどINPUT文の特性上1回1回止まるんです。
そこで新しいことを覚えます。
押したらすぐ反応せよ
INPUT文と違い押した瞬間に反応する方法あります。
このプログラムを見てください
10 K$=INKEY$
20 PRINT K$
30 GOTO 10
40 END
まず10行目ですK$は文字列変数でしたね。あたらしくINKEY$というのが出てきました。
これは押したキーを取得するという意味です。
つまり10行目は押したキーをK$に入れています。
キーが押されなければK$の値は変わりません。
ところが30行でGOTO10で帰ってきてまた押された内容をK$に入れますから
もしキーが押されていなければヌル値となりK$には「なにもなし」が入ります。
そして20行で表示していますから、このプログラムをRUNすると
キーが押されたらその文字を表示するようになります。
INPUTと違いキーが押されても押されなくても次の行へいってしまうので
GOTO10で永久ループを作っています。ここで必ず10行へ帰るのがポイントです。
これをつかって先ほどのプログラムを書き換えてみましょう
5 X=40
10 K$=INKEY$
15 IF K$="4"
THEN X=X-1
16 IF K$="6"
THEN X=X+1
20 LOCATE X,10:PRINT"A"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,10:PRINT" "
30 GOTO 10
RUNしてみてください。4や6のキーを押してみてください。
なんとマイキャラの「A」が左右に動きますね。しかも自分の意志通りに!
縦横無尽に走り回ろう
さらに上下にも動かしたくなりましたよね。これは簡単です。
やってみてください。
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
いかがですか?自分の思うとおり画面中を走り回りませんか?\^o^/バンザーイ
こんかいはここまでです。
エラーの出た方へ
えらい!
次回はこれをやる予定だったんです。
エラーの出た方はおそらく画面の1番端っこまで動かしませんでしたか?
つまりはこういうことです。4を押したらXを1引きますXの座標に表示します。
ところがXがだんだん減ってきてついにはゼロを超えてマイナスになります。
しかしマイナスの座標などありませんから。「そんな座標ないよ!!」といって
エラーになってしまったわけです。
それでは次回はこのエラーの対策をしてみましょう。
では
次回の講義をお楽しみに
さいなら