下のプログラムは、ウィンドウの端でバウンドしながらボールが動くものです。 これを参考にして、 下端からある角度で放り上げたボールが重力により放物線を描いて落下し、 ウィンドウの各端でバウンドを繰り返すプログラムを作成してください。 その際、ウィンドウの上端にはぶつからないように初期条件を適切に 設定してください。反発係数は1としてかまいません。
ヒント:
・XOR_PUTモードで描いた図形は、そこへ
もう一度全く同じモード・色で描くと消えてしまいます。
・動く速さを調節できるように、時間待ちループを
入れてください。
-----------------------/* "ex5.c" --- ボールのバウンドをグラフィック表示する */ #include <stdio.h> #include <Xtc.h> void waitloop(void) { int n; xflush(); for( n = 0; n < 10000; n++ ) ; /* 被制御文は空文(何もしない) */ return; } void main(void) { int x, y, dx, dy; int r, vx, vy; int times; initgraph(); /* グラフィック環境の初期化 */ x = 200; y = 200; /* ボールの中心位置 */ vx = vy = 1; /* ボールの移動速度 */ r = 10; /* ボールの半径 */ setcolor( CYAN ); setwritemode( XOR_PUT ); /* 描画モードの設定 */ circle( x, y, r ); for( times = 0; times < 2000; times++ ){ dx = x + vx; dy = y + vy; circle( x, y, r ); /* 前に描いたボールを消す */ circle( dx, dy, r ); /* 移動後のボールを描く */ x = dx; y = dy; if( x <= r || x >= 640 - r ) /* バウンド処理 */ vx *= -1; if( y <= r || y >= 400 - r ) vy *= -1; waitloop(); /* 時間待ちループ関数を呼ぶ */ } xtcmainloop(3); closegraph(); /* ウィンドウを閉じる(終了) */ }-----------------------