プログラミング超初心者のための講座
 第14回 BASIC編「爆弾ゲームに挑戦 その4」(表示位置)


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

今回は予告通り画面の好きな位置に文字を表示してみましょう

1画面は何文字?

その前に画面には何文字表示できるか知っておかないといけません。
ここでは80*25文字と思ってください
つまり横の方が縦より多いのです。
ですから1つの文字は縦長だということです。

ためしに画面に
123456789
223456789
323456789
423456789
523456789
623456789
723456789
823456789
923456789
と表示したとしたら、縦も横も9文字のはずが全体では縦長に見えませんか?

これを知っておいてください。
「画面は縦と横の座標で表される」

好きな位置に表示

では早速この命令を使ってみましょう

10 CLS
20 LOCATE 10,10
30 PRINT "HELLO"
40 END

RUNすると変な位置にHELLOと表示されませんか?

これがLOCATEです。
書式は LOCATE X,Yです。
Xは横軸0から始まりますから1番左が0です
Yは縦軸0から始まりますから1番上が0です。

これで も画面の好きな位置に表示できるようになりました。
ではリストに付け加えます。

10 REM ========== 初期化 ============================
20 CLS:C=0
25 CONSOLE 0,25,0,1
26 COLOR 7
30 A=VAL(RIGHT$(TIME$,1))+1
31 PRINT" の家に爆弾が仕掛けられた!!!"
32 PRINT"それを知ったのはついさっきだ、やっとの思いで爆弾を発見したが"
33 PRINT"これを自分で処理しなくればいけない!!!!"
34 PRINT"おそるおそる爆弾の解体をはじめると、額に汗が流れてきた。"
35 PRINT"「これならうまくいけそうだ」そう思った瞬間、息をのんだ。"
36 PRINT"後は起爆装置へつながる線を切るだけなのだが、なんとダミーの線で囲まれている。"
37 PRINT"数は10本!!このうち1本が当たりだ。これを見つけだし切断に成功すれば"
38 PRINT"この危機を脱出することができる。しかし、爆弾には防衛策がとってあった"
39 PRINT"どうやら5本以上間違えて切ると即座に起爆装置が作動して、"
40 PRINT"我が家とともにこっぱみじんというわけだ。"
41 PRINT"しかしぐずぐずしているヒマはない!!!運を天に任せ切ることに決めた、、、、、、、"
42 PRINT" が切るのは、、、、、、この線だ!!!!!!!!!!!!!!!!!!!"
43 REM ========== 入力 ==============================
50 LOCATE 0,13:INPUT "何番の線を切りますか?(1-10)";B
60 C=C+1
70 REM ========== 判断 ==============================
70 IF B=A THEN GOTO 100
80 IF B<>A THEN GOSUB 130
90 GOTO 50
100 REM ========= 当たり処理 ========================
105 FOR T=0 TO 300:FOR I=0 TO 300:BEEP 1:BEEP 0:NEXT I:NEXT T
110 LOCATE 0,15:COLOR 5:PRINT "よかった助かった!!":COLOR 7
120 GOTO 190
130 REM ========= はずれ処理 =======================
135 BEEP
140 LOCATE 0,15:COLOR 2:PRINT "間違いだ!!":COLOR 7
150 IF C>=5 THEN GOTO 170
160 RETURN
170 REM ========= ゲームオーバー =====================
173 COLOR 6
174 LOCATE 0,17:PRINT "ドッカーン!!!"
175 FOR T=0 TO 500:FOR I=0 TO 100:BEEP 1:BEEP 0:NEXT I:NEXT T
176 PRINT "あなたは死にました"
179 FOR C=1 TO 7
180 COLOR C:PRINT "GAME OVER"
185 NEXT C
190 REM ========== もう1回 ==========================
195 COLOR 7:LOCATE 0,27
200 INPUT "CONTINUE?(Y/N)";R$
210 IF R$ = "Y" THEN GOTO 10
220 IF R$ = "N" THEN END
230 GOTO 190

これでいつものメッセージが1行あけに表示されました。
これはLOACTEで直接表示する位置を指定しているからです。

またループでまわっているので、いつも「何番の線を切りますか?」が同じ場所に表示されているのがわかりますか?

線に見える?

ではもっと臨場感を出すために線が切れる様子を表示しましょう

文字で表現しなくてはいけないのでちょっと想像力が必要です。
これ--->
縦線が見えますか?これをならべて線にします。

10本の線はこうなります。---> ||||||||||

いかがですか?短ければこうします。

||||||||||
||||||||||
||||||||||
||||||||||
||||||||||
||||||||||
||||||||||

線が10本並んでいるように見えませんか?
ちなみに出し方は[SHIFT]+[\]で出ます。
(参考:9800シリーズだと縦線が途中で切れて見えますが問題無しです)

ではリストに組み込んでみましょう。

おおっとその前に、もういい加減行番号がめちゃめちゃになってきましたね。
一回リナンバーをかけましょう。キーボードから直接RENUMでしたね

10 REM ========== 初期化 ============================
20 CLS:C=0
25 CONSOLE 0,25,0,1
26 COLOR 7
30 A=VAL(RIGHT$(TIME$,1))+1
40 PRINT" の家に爆弾が仕掛けられた!!!"
50 PRINT"それを知ったのはついさっきだ、やっとの思いで爆弾を発見したが"
60 PRINT"これを自分で処理しなくればいけない!!!!"
70 PRINT"おそるおそる爆弾の解体をはじめると、額に汗が流れてきた。"
80 PRINT"「これならうまくいけそうだ」そう思った瞬間、息をのんだ。"
90 PRINT"後は起爆装置へつながる線を切るだけなのだが、なんとダミーの線で囲まれている。"
100 PRINT"数は10本!!このうち1本が当たりだ。これを見つけだし切断に成功すれば"
110 PRINT"この危機を脱出することができる。しかし、爆弾には防衛策がとってあった"
120 PRINT"どうやら5本以上間違えて切ると即座に起爆装置が作動して、"
130 PRINT"我が家とともにこっぱみじんというわけだ。"
140 PRINT"しかしぐずぐずしているヒマはない!!!運を天に任せ切ることに決めた、、、、、、、"
150 PRINT" が切るのは、、、、、、この線だ!!!!!!!!!!!!!!!!!!!"
151 LOCATE 30,14:PRINT"||||||||||"
152 LOCATE 30,15:PRINT"||||||||||"
153 LOCATE 30,16:PRINT"||||||||||"
154 LOCATE 30,17:PRINT"||||||||||"
155 LOCATE 30,18:PRINT"||||||||||"
156 LOCATE 30,19:PRINT"||||||||||"
157 LOCATE 30,20:PRINT"12345678910"
160 REM ========== 入力 ==============================
170 LOCATE 0,13:INPUT "何番の線を切りますか?(1-10)";B
180 C=C+1
190 REM ========== 判断 ==============================
200 IF B=A THEN GOTO 230
210 IF B<>A THEN GOSUB 270
220 GOTO 160
230 REM ========= 当たり処理 ========================
240 FOR T=0 TO 300:FOR I=0 TO 300:BEEP 1:BEEP 0:NEXT I:NEXT T
250 LOCATE 0,15:COLOR 5:PRINT "よかった助かった!!":COLOR 7
260 GOTO 400
270 REM ========= はずれ処理 =======================
280 BEEP
290 LOCATE 0,15:COLOR 2:PRINT "間違いだ!!":COLOR 7
300 IF C>=5 THEN GOTO 320
310 RETURN
320 REM ========= ゲームオーバー =====================
330 COLOR 6
340 LOCATE 0,17:PRINT "ドッカーン!!!"
350 FOR T=0 TO 500:FOR I=0 TO 100:BEEP 1:BEEP 0:NEXT I:NEXT T
360 PRINT "あなたは死にました"
370 FOR C=1 TO 7
380 COLOR C:PRINT "GAME OVER"
390 NEXT C
400 REM ========== もう1回 ==========================
410 COLOR 7:LOCATE 0,27
420 INPUT "CONTINUE?(Y/N)";R$
430 IF R$ = "Y" THEN GOTO 10
440 IF R$ = "N" THEN END
450 GOTO 400

これでRUNすると画面に左(中央かな)に10本の線と数字が並びました

実行例
の家に爆弾が仕掛けられた!!!
それを知ったのはついさっきだ、やっとの思いで爆弾を発見したが
これを自分で処理しなくればいけない!!!!
おそるおそる爆弾の解体をはじめると、額に汗が流れてきた。
「これならうまくいけそうだ」そう思った瞬間、息をのんだ。
後は起爆装置へつながる線を切るだけなのだが、なんとダミーの線で囲まれている。
数は10本!!このうち1本が当たりだ。これを見つけだし切断に成功すれば
この危機を脱出することができる。しかし、爆弾には防衛策がとってあった
どうやら5本以上間違えて切ると即座に起爆装置が作動して、
我が家とともにこっぱみじんというわけだ。
しかしぐずぐずしているヒマはない!!!運を天に任せ切ることに決めた、、、、、、、
が切るのは、、、、、、この線だ!!!!!!!!!!!!!!!!!!!

何番の線を切りますか?(Y/N)?5               
                              ||||||||||
間違いだ!!                        ||||||||||
                              ||||||||||
ドッカーン!!!                      ||||||||||
あなたは死にました                     ||||||||||
                              ||||||||||
GAME OVER                     12345678910
GAME OVER
GAME OVER
GAME OVER
GAME OVER
GAME OVER
GAME OVER

CONTINUE?(Y/N)?N
OK

(全部手で打った しんどかった(^^;)
 

チョッキンはどうする? IF文?

いかがかな?ちょっとおもしろくなってきたでしょう?
では1をいれたら1番を入れたら1番が切れて、2番なら2番というように
入力したものに対応いして切れたように見てたい。

まず切れると言うことはどうするか、切れたようなキャラクタを表示したらよいのだ
||||||||||
||||||||||
||||||||||これが

||||||||||
|||X||||||
||||||||||こうすれば切れたように見える。

では簡単だ今LOCATEを覚えたばかりだから、 は好きな位置に表示ができる。
ならば線を表示している座標をLOCATEで指定して、、、、、
あれ?でもいったい何番を入力するかわからないのに座標が決まるはずがない
いったいどうしたらいいんだ。

はい、では順番に行きましょう。おっしゃるとおり好きな位置には表示ができる。
では問題は座標がいくつになるかをみつければよいのですね。

まずはどこでその処理をするかですが、プレーヤーが線を切ったとき、つまり
どこを切るか指示したとき、170ぎょうのあとということになる。

ここにLOCATE ?,17:PRINT"X"

と、入れればいいのはわかりますよね。
?の部分はどうやってみつけるか、、、、、、、、、

もしプレーヤーが1を入れたら座標はいくつだろうか?
当然30ですね。では2なら31、3なら32・・・・・・・・・

そうか!いくつか判断するんだからIF文を使えばいいんだ
入力された値つまりBをみて判断して?を決めるここでは
仮にXという変数にするか。リストを作ると

IF B=1 THEN X=30
IF B=2 THEN X=31
IF     ・
   ・
   ・
   ・
IF B=10 THEN X=39

たしかにうまくいきそうですね。でももし10じゃなくて100だったら?
1000だったら?10000だったら?
とてもIF文じゃきれいに作れそうにないですね。

このへんまでくるとみなさんよく勘を働かせてプログラムするんですが
IF文の大群になってしまうんですね。
IF文をふやすということは判断する回数が増えるわけですから
パソコンの処理スピードが極端に遅くなるんです。
ですから不必要に増やしたくないんですね。
 (昔と違って高速マシンですからあまり感じないかもしれませんが
 CPUが486なら化け物見たいに速い計算をします。486といえばペンティアムより古いCPUですよ
 昔の8ビットのパソコンなら目に見えてその違いを体感できます。
 またWINDOS98上で動くN88互換BASICもやたら遅いようです。CPUがPentium2でも。
 WINDOWSの上に同じ環境を作るんですから当然といえば当然ですけどね)

方程式を作る

話戻って

ですからどうしたらいいかというとできる限り計算で出せるように作るということです。

今回の場合ならわざわざ変数Xなんか用意しなくてもいいんです。
よく考えてください。
1のときに30
2のときに31・・・・・・・・・・・
でしたね。
ならばLOCATE?,17の?というのはどうやったら計算で出せますか?
B=1のとき?=30ですね。B=2のとき?=31・・・・・・・・・
ではこうしたらどうですか?

LOCATE B+29,17

今手を打ちましたね?(^^;)
「なるほど!!」

わかっていた人にはなんてことないですが、わからなかった人にはなるほどです。
まさにコロンブスのたまご状態です。言われてみれば簡単なことなんです。

と、いうことでプログラムはこうなります。

160 REM ========== 入力 ==============================
170 LOCATE 0,13:INPUT "何番の線を切りますか?(1-10)";B
175 LOCATE B+29,17:PRINT"X";
180 C=C+1

RUNしてみてください。
たった1行付け足しただけで、何番を入れてもその番号の線が切れます。
感動でしょ。

この辺がプログラムのおもしろいところです。
すべての動作の面倒は見なくてもいいんです
計算させれば勝手にやってくれるんです

以上でLOCATEをつかった演出を終わります。

完成

これで爆弾ゲームは完成です。
もっともっとアイディアはありますが、このへんで止めておきましょう。
のオリジナルに改造してもかまいません。
アイディア次第でどんどんおもしろくすることができます。
またおもしろいものを作ったら、会議室でも発表してください。
送っていただけばこちらに掲載します。

後半駆け足になりましたが、分からない点は会議室で聞いてください。
おつかれさまでした。

次回からはまた新しいことをします。

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

もどる



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