#author("2017-12-14T13:23:43+09:00","","") **INKEY$でリアルタイム入力する [#j341288f] さて、ボールと壁のことはひとまず置いておいて、ボールが壁に当たって跳ね回る無限ループの中に、"==="イコールを3つ並べたラケットを画面下部に表示する。そして、ボールの移動と同じ要領で左右に動かせるようにする。 #author("2023-01-31T10:39:43+09:00","default:maa","maa") ところが今度はボールの時と違い、プレーヤーの指示に従って動かす必要がある。そこで今回は、"<"キーを押している間は左に、">"キーを押している間は右に動かすようにすることを考える。("<",">"は視覚的に左右と直感しやすいが、入力には"Shift"キーと一緒に押す必要があるので、実際には"Shift"を押さない状態で入力される"<"→","と">"→"."を使うことにする。) #ref(racket.png,center) ここでは簡単のために、これまでに作った「壁の中をボールが跳ね回る」プログラムとは別に、まずは、ラケットを左右に動かすプログラムをだけを作ろう。 これまで、キーボードからの入力はINPUT文を使うことを学んだが、INPUT文だとその場で入力待ちとなり、その間、ボールも止まってしまってゲームにならない。すなわち、プログラムを止めずにリアルタイムにキー入力を得る必要がある。これにはINKEY$を使うと良い。 INKEY$は最後に"$"が付いているので文字列変数と同じである。ただ違うのは、その瞬間に押されていたキーの文字が、リアルタイムに代入されている特殊な文字列変数ということである。 - まず、WHILE〜WEND で無限ループを作って、その中で INKEY$ の値を参照しよう。 - INKEY$の値が","の時、ラケットを左に1つ動かすには? - INKEY$の値が"."の時、ラケットを右に1つ動かすには? - ラケットが左右の壁を突き破ってしまわないようにするには? 100 CLS 110 '--- ラケットの座標 BX,BY 移動方向 BM 持ち玉数 BALL 120 BX=38:BY=22:BM=0:BALL=3 130 '--- 最初のラケットの表示 140 LOCATE BX,BY:PRINT "===" 150 '--- メインループ 持ち球がある間はゲームが続く 160 WHILE BALL>0 170 '--- 押されているキーを読み取る 180 K$=INKEY$ 190 '--- 左右(,.)のキーが押されていたら移動方向をセットして *MOVE へ 200 IF K$="," AND BX>20 THEN BM=-1:GOSUB *MOVE 210 IF K$="." AND BX<56 THEN BM= 1:GOSUB *MOVE 220 WEND 230 END 240 '--- ラケットを表示するサブルーチン 250 *MOVE 260 '--- ラケットを消す 270 LOCATE BX,BY:PRINT " " 280 '--- ラケットの座標を計算して表示 290 BX=BX+BM:BM=0 300 LOCATE BX,BY:PRINT "===" 310 RETURN