#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


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS