DynamicModule[
{
Xa,(*ボール１のX座標*)
Xb,(*ボール２のX座標*)
Xc,(*ボール３のX座標*)
Ya,(*ボール１のY座標*)
Yb,(*ボール２のY座標*)
Yc,(*ボール３のY座標*)
Ra,(*ボール１の半径*)
Rb,(*ボール２の半径*)
Rc,(*ボール３の半径*)
STARTFLAG=0,(*スタートできる準備が出来ているか見るためのフラグ*)
ENDFLAG=0,(*終わる処理に移るためのフラグ*)
XaFLAG,(*ボール１のX座標がどの方向に動くか見るためのフラグ*)
XbFLAG,(*ボール２のX座標がどの方向に動くか見るためのフラグ*)
XcFLAG,(*ボール３のX座標がどの方向に動くか見るためのフラグ*)
YaFLAG,(*ボール１のY座標がどの方向に動くか見るためのフラグ*)
YbFLAG ,(*ボール２のY座標がどの方向に動くか見るためのフラグ*)
YcFLAG ,(*ボール３のY座標がどの方向に動くか見るためのフラグ*)
Myx,(*自分の位置のX座標*)
Myy,(*自分の位置のY座標*)
GSizeX,(*ゲームサイズX座標*)
GSizeY,(*ゲームサイズY座標*)
Speed,(*各ボールのスピード*)
MyPosition, (*自分の位置*)
Time,(*ゲーム開始からの時間*)
ADDTime,(*ゲーム開始後1０秒*)
Score(*点数*)
},
{
Button[Reset,STARTFLAG=0;ENDFLAG=0],(*リセットボタン*)
Animate[
(*初期設定*)
If[STARTFLAG ==0,{
Xa=156
,
Xb=100,
Xc=-100,
Ya=20,
Yb =-120,
Yc =150,
Ra = 10,
Rb= 10,
Rc = 10,
XaFLAG=0,
XbFLAG=0,
XcFLAG=0,
YaFLAG=0,
YbFLAG =0,
YcFLAG =0,
Myx =0,
Myy =0,
GSizeX=200,
GSizeY=300,
Speed=3,
STARTFLAG =1;
ADDTime =20;
Time =t;
Score =0;
gameover =Nothing(*前のゲームのGameoverという文字の削除*)
}];

(*ゲーム内処理*)
If[STARTFLAG ==1&&ENDFLAG==0,{
MyPosition=MousePosition["Graphics"];(*マウスの位置の代入*)
{Myx,Myy} =MyPosition;(*マウス位置をX，Y座標に分ける*)
My = Disk[{Myx,Myy},20];(*自機の定義*)
Score =Round[t-Time];(*点数を少数型から整数型にする*)
Scorepoint =Text[Style[Score,FontSize->30],{GSizeX-30,GSizeY-30}];(*点数の表示*)
If[t-Time>ADDTime,Speed=Speed+1;ADDTime =ADDTime +10 ];(*10点ごとに各ボールを加速*)


ball1 =Disk[{Xa,Ya},Ra];(*ボール１の表示*)
If[XaFLAG==1,Xa+=Speed,Xa-=Speed];(*ボール１のX軸に関する移動*)
If[Xa>GSizeX,XaFLAG=0];
If[Xa<-GSizeX,XaFLAG=1];
If[YaFLAG==1,Ya+=Speed,Ya-=Speed];(*ボール１のY軸に関する移動*)
If[Ya>GSizeY,YaFLAG=0];
If[Ya<-GSizeY,YaFLAG=1];
If[Myx-Xa<5+Ra&&Myx-Xa>-5-Ra&&Myy-Ya<5+Ra&&Myy-Ya>-5-Ra,ENDFLAG=1];(*ボール１の当たり判定*)
If[t-Time > 10,Ra =15];(*10点後にボール1の半径は15になる*)
If[t-Time > 40,Ra=30];(*40点後にボール1の半径は30になる*)

ball2 =Disk[{Xb,Yb},Rb];(*ボール2の表示*)
If[XbFLAG==1,Xb+=Speed,Xb-=Speed];(*ボール2のX軸に関する移動*)
If[Xb>GSizeX,XbFLAG=0];
If[Xb<-GSizeX,XbFLAG=1];
If[YbFLAG==1,Yb+=Speed,Yb-=Speed];(*ボール2のY軸に関する移動*)
If[Yb>GSizeY,YbFLAG=0];
If[Yb<-GSizeY,YbFLAG=1];
If[Myx-Xb<5+Rb&&Myx-Xb>-5-Rb&&Myy-Yb<5+Rb&&Myy-Yb>-5-Rb,ENDFLAG=1];(*ボール2の当たり判定*)
If[t-Time > 20,Rb=20];(*20点後にボール2の半径は20になる*)

ball3 =Disk[{Xc,Yc},Rc];(*ボール3の表示*)
If[XcFLAG==1,Xc+=Speed,Xc-=Speed];(*ボール3のX軸に関する移動*)
If[Xc>GSizeX,XcFLAG=0];
If[Xc<-GSizeX,XcFLAG=1];
If[YcFLAG==1,Yc+=Speed,Yc-=Speed];(*ボール3のY軸に関する移動*)
If[Yc>GSizeY,YcFLAG=0];
If[Yc<-GSizeY,YcFLAG=1];
If[Myx-Xc<5+Rc&&Myx-Xc>-5-Rc&&Myy-Yc<5+Rc&&Myy-Yc>-5-Rc,ENDFLAG=1];(*ボール3の当たり判定*)
If[t-Time > 30,Rc=25](*30点後にボール3の半径は25になる*)

}];

(*ゲーム終了処理*)
If[ENDFLAG==1,
 My =Nothing;(*自機の削除*)
ball1 = Nothing;(*最初のボールの削除*)
ball2=Nothing;(*ボール1の削除*)
ball3=Nothing;(*ボール2の削除*)
gameover = Text[Style["GameOver",FontSize->30]](*Gameoverという文字の表示*)
];

(*グラフィック処理*)
Graphics[{{Red,My},Scorepoint,ball1,ball2,ball3,gameover},PlotRange->{{-GSizeX,GSizeX},{-GSizeY,GSizeY}},Frame->True,FrameTicks->None],
(*アニメーションの時間設定*)
{t,0,Infinity}]}]