PR
カレンダー
カテゴリ
コメント新着
キーワードサーチ
「
Chapter 19 - Time & motion」時間と動作
。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
第19章 - 時間と動作
プログラムに指定した時間を費やしたいことがよくありますが、そのためには PAUSE ステートメントが便利です (特に高速モードの場合)。
PAUSE n
計算を停止し、テレビの n フレーム分の画像を表示します (
ブレークは、キーを押すことでいつでも短縮できます (スペースを使用してもブレークが発生することに注意してください)。
一時停止が始まったらキーを押す必要があります。
一時停止が終了すると、画面が点滅します。
FAST モードまたは新しい 8K ROM を搭載した古い ZX80 で実行されるプログラムで PAUSE ステートメントを使用する場合、PAUSE ステートメントの後に POKE 16437,355 を続ける必要があります。
これを行わなくても PAUSE は機能するように見えますが、プログラムが消去されてしまう可能性があります。
このプログラムは、時計の秒針 (ここでは端にある 1 つの点だけ) を動かします。
5 REM
FIRST WE DRAW THE CLOCK FACE
10 FOR
N=1 TO
12
20 PRINT AT
10-10* COS
(N/6* PI
),10+10* SIN
(N/6* PI
);N
30 NEXT
N
35 REM
NOW WE START THE CLOCK
40 FOR
T=0 TO
10000
45 REM
T IS THE TIME IN SECONDS
50 LET
A=T/30* PI
60 LET
SX=21+18* SIN
A
70 LET
SY=22+18* COS
A
200 PLOT
SX,SY
300 PAUSE
42
310 POKE
16437,255
320 UNPLOT
SX,SY
400 NEXT
T
(メモリ拡張ボードがない場合は、REM ステートメントを見逃してください。)
40 行目のため、このクロックは約 2 時間半で終了しますが、簡単にさらに長く実行することができます。
300 行目でタイミングがどのように制御されているかに注目してください。
PAUSE 50 を指定すると 1 秒に 1 回動作することを期待するかもしれませんが、他の処理に少し時間がかかるため、これは考慮する必要があります。 それには、実際のクロックにコンピュータのタイミングを合わせ、一致するまでライン 300 を調整するという試行錯誤によって行うのが最も効果的です。
(これを非常に正確に行うことはできません。1 秒間に 1 フレームの調整は 2%、つまり 1 日あたり 30 分になります。)
関数 INKEY$
(引数なし) はキーボードを読み取ります。 ちょうど 1 つのキー (または Shift キーと他の 1 つのキー) を押している場合、結果はそのキーがモードで与える文字になります。
制御文字には通常の効果はありませんが、改行の場合は CHR$ 118 のような結果が得られ、「?」として出力されます。
タイプライターのように動作するこのプログラムを試してください。
10 IF INKEY$
<>"" THEN GOTO
10
20 IF INKEY$
= "" THEN GOTO 20
30 PRINT INKEY$
;
40 GOTO
10
ここで、行 10 はキーボードから指が離れるのを待ち、行 20 は新しいキーが押されるのを待ちます。
INPUT
とは異なり、 INKEY$
は待機しないことに注意してください。 したがって、改行は入力しませんが、逆に何も入力しない場合はチャンスを逃したことになります。
演習
1. タイプライター プログラムの 10 行目を抜いたらどうなりますか?
2. タイプライター プログラムでスペースや £ を入力できないのはなぜですか?
これは、カーソルを右
(シフト 8)に入力するとスペースが表示されるように変更されたプログラムです 。
10 IF INKEY$
<>"" THEN GOTO
10
20 IF INKEY$
="" THEN GOTO
20
30 LET
A$= INKEY$
40 IF
A$= CHR$
115 THEN GOTO
110
90 PRINT
A$;
100 GOTO
10
110 PRINT
" ";
120 GOTO
10
30 行目で INKEY$
を A$ に読み込む方法に注目してください。これを抜いて、40 行目と 0 行目で A$ を INKEY$
に置き換えることも可能ですが、行間で INKEY$
が変わる可能性があります。
さらにプログラムをいくつか追加して 、NEWLINE
(CHR$ 118) と入力すると新しい行が表示されるようにしましょう。
3. INKEY$
を使用するもう 1 つの方法は、この代替タイプライター プログラムのように PAUSE
と組み合わせることです。
10 PAUSE
40000
20 POKE
16437,255
30 PRINT INKEY$
40 GOTO
10
これを機能させるには、PAUSEの開始時にすでにキーを押していることが判明した場合にPAUSEが終了しないことが不可欠となります。
この方法には画面が点滅するという欠点がありますが、高速モードではこれが唯一の方法です。
プログラムを高速モードで実行すると、コンピュータが一時停止の機会を利用してテレビ画像を表示することがわかります。
4. これはあなたを怒らせます。 コンピュータに番号が表示されるので、あなた (または無実の被害者) はその番号を再度入力する必要があります。
最初は 1 秒以内に行う必要がありますが、間違えると次の番号にかかる時間が長くなり、正解すると次の番号にかかる時間が短くなります。 1つのアイデアとして、できるだけ早くそれを進めてから、Q を押してスコアを確認することです。高ければ高いほど良いです。
10 LET
T=60
15 REM
T=NUMBER OF FRAMES PER GO-INITIALLY 50 FOR 1 SECOND
20 SCROLL
30 LET
A$=C HR$ INT
( RND
*10+CODE "0")
35 REM
A$ IS A RANDOM DIGIT
40 PRINT
A$
45 PAUSE
T
50 POKE
16437,255
60 LET
B$= INKEY$
70 IF
B$="Q" THEN GOTO
200
80 IF
A$=B$ THEN GOTO
150
90 PRINT
"NO GOOD"
100 LET
T=T*1.1
110 GOTO
20
150 PRINT
"OK"
160 LET
T=T*0.9
170 GOTO
20
200 SCROLL
210 PRINT
"YOUR SCORE IS "; INT
(600/T)
5. (RAM に余裕がある人のみ) 第 15 章の直線ルーチンを使用して、分針と時針も表示されるように秒針プログラムを変更し、毎分描画します。 (時針を短くしてください。) さらに望むなら、15 分ごとに何らかのショーを表示するようにしてください。
6. (おもしろ) これを試してください:
10 IF INKEY$
= "" THEN GOTO
10
20 PRINT AT
11,14; "OUCH"
30 IF INKEY$
<>"" THEN GOTO
30
40 PRINT AT
11,14; " "
50 GOTO
10
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ZX81におけるPAUSEとキー入力に関して記述しています。
PAUSEステートメントにパラメータを渡すのは知っていましたが、フレーム単位なんですね。今更知りました。
また、PAUSE中にキーを押すと次に進むのも知らなかったですね。
この機能はZX80から継承されたようで、FASTモードとの関わりが興味深いところです。
【18日 当店限定!全品ポイント5倍+合計最大P34倍】 電動自転車 シマノ製内装3段変速 26インチ |電動アシスト自転車 子ども乗せ 子供乗せ 折りたたみ 折り畳み チャイルドシート装着可能 シマノ 型式認定 ギフト 送料無料 【DA263】
価格:68,800円(税込、送料別)
(2024/1/16時点)
Appendix C の続き ベーシックその2 2024.02.26
Appendix C の続き ベーシック 2024.02.22
Appendix C - The ZX81 for those that un… 2024.02.14