#author("2018-01-11T11:12:33+09:00","","") **ラケットでボールを跳ね返す [#gf7f9c6a] ラケットがプレーヤーの指示通りに左右に動かせるようになったならば、「壁の中をボールが跳ね回る」プログラムと、「ラケットを左右に動かす」プログラムを合体させよう。 #author("2023-01-31T10:33:09+09:00","default:maa","maa") そして次に、ラケットにボールが当たったときに跳ね返すようにしよう。その時に大事になるのは、やはり、ラケットとボールの位置だろう。 #ref(hitball.png,center) - ボールは右下に向かって来たときは右上に跳ね返す。左下に向かって来たときは左上に跳ね返す。進行方向が変わるのは左右方向は変わらず上下方向だけ! - 跳ね返す方法が分かって余裕ができたら、ボールが左右どちらから来ても、ラケットの左角に当てたら左上に、右角なら右上に跳ね返してはどうか? 100 CLS 110 '--- 壁を描く 120 LOCATE 19,1 130 PRINT "#########################################" 140 LOCATE 19,23 150 PRINT "#########################################" 160 FOR I=2 to 22 170 LOCATE 19,I 180 PRINT "# #" 190 NEXT I 200 '--- ボール座標 X,Y 移動方向 XM,YM 持ち玉数 BALL 210 X=40:Y=10:XM=1:YM=1:BALL=3 220 '--- ラケットの座標 BX,BY 移動方向 BM 230 BX=38:BY=22:BM=0:BALL=3 240 '--- 最初のラケットの表示 250 LOCATE BX,BY:PRINT "===" 260 '--- メインループ 持ち球がある間はゲームが続く 270 WHILE BALL>0 280 '--- ボールを表示 290 LOCATE X,Y:PRINT "o" 300 '--- ボールとラケットの速度の調整 310 FOR I=0 TO 100 320 '--- 押されているキーを読み取る 330 K$=INKEY$ 340 '--- 左右(,.)のキーが押されていたら移動方向をセットして *MOVE へ 350 IF K$="," AND BX>20 THEN BM=-1:GOSUB *MOVE 360 IF K$="." AND BX<56 THEN BM= 1:GOSUB *MOVE 370 NEXT I 380 '--- ラケットに当たったらボールの移動方向を反転 390 IF Y=BY-1 AND X=>BX-1 AND X<=BX+3 THEN YM=-YM 400 IF Y=BY-1 AND (X=BX-1 OR X=BK+3) THEN XM=-XM 410 '--- 上下左右の壁に当たったら移動方向を反転 420 IF Y= 2 OR Y=22 THEN YM=-YM 430 IF X=20 OR X=58 THEN XM=-XM 440 '--- ボールを消して、次のボール座標を計算 450 LOCATE X,Y:PRINT " " 460 X=X+XM:Y=Y+YM 470 WEND 480 END 490 '--- ラケットを表示するサブルーチン 500 *MOVE 510 '--- ラケットを消す 520 LOCATE BX,BY:PRINT " " 530 '--- ラケットの座標を計算して表示 540 BX=BX+BM:BM=0 550 LOCATE BX,BY:PRINT "===" 560 RETURN