GSizeX=120;
GSizeY=160;(*ウィンドウサイズ*)
speed=0.75;(*ゲームスピード*)

spider={};
Do[AppendTo[spider,RandomInteger[{-GSizeX,GSizeX}]],13];
spi={};
Do[AppendTo[spi,RandomInteger[]],13];
gameover=0;
gtime=0;
gtxt=Null;
gback=Null;
gline=Null;
gpt=Null;
DynamicModule[{
pt={0,GSizeY*3/4},
t=0,
spiderY1=GSizeY,
spiderY2=GSizeY*5/4,
spiderY3=GSizeY*7/4,
spiderY4=GSizeY*9/4},
Dynamic[Refresh[
If[gameover==1,(*被弾後の処理*)
gtime++;
If[gtime<70,
gback=Rectangle[{-GSizeX,-GSizeY},{GSizeX,GSizeY}]
];
If[gtime≥70&&gtime<350,
gback=Rectangle[{-GSizeX,-GSizeY},{GSizeX,GSizeY}];
gline=Line[{{pt[[1]],pt[[2]]-100},{pt[[1]],pt[[2]]+100}}];
];
If[gtime≥350&&gtime<450,
pt={gpt[[1]]+RandomInteger[{-2,2}],gpt[[2]]+RandomInteger[{-2,2}]};
gline=Line[{{pt[[1]],pt[[2]]-100},{pt[[1]],pt[[2]]+100}}];
];
If[gtime≥450&&gtime<600,
pt=gpt;
gline=Null
];
If[gtime≥600&&gtime<615,
gtxt=Text[Style["＊",Bold,20]]
];
If[gtime≥615&&gtime<630,
gtxt=Text[Style["＊そ",Bold,20]]
];
If[gtime≥630&&gtime<645,
gtxt=Text[Style["＊そん",Bold,20]]
];
If[gtime≥645&&gtime<660,
gtxt=Text[Style["＊そんな",Bold,20]]
];
If[gtime≥660&&gtime<675,
gtxt=Text[Style["＊そんなの",Bold,20]]
];
If[gtime≥675&&gtime<690,
gtxt=Text[Style["＊そんなのお",Bold,20]]
];
If[gtime≥690&&gtime<705,
gtxt=Text[Style["＊そんなのお断",Bold,20]]
];
If[gtime≥705&&gtime<720,
gtxt=Text[Style["＊そんなのお断り",Bold,20]]
];
If[gtime≥720&&gtime<735,
gtxt=Text[Style["＊そんなのお断りだ",Bold,20]]
];
If[gtime≥735&&gtime<900,
gtxt=Text[Style["＊そんなのお断りだ。",Bold,20]]
];
If[gtime≥900&&gtime<1000,
gtxt=Null;gback=Null;
t=0;
spiderY1=GSizeY;
spiderY2=GSizeY*5/4;
spiderY3=GSizeY*7/4;
spiderY4=GSizeY*9/4;
];
If[gtime≥1000,
gameover=0;gtime=0;
pt={0,GSizeY*3/4}
];
];


If[gameover==0,(*ゲーム中の処理*)
If[t>-GSizeY/4,(*敵とラインの移動*)
t-=speed;
spiderY1-=speed;
spiderY2-=speed;
spiderY3-=speed;
spiderY4-=speed;
Do[If[spi[[i]]==1,spider[[i]]+=speed,spider[[i]]-=speed],{i,1,13}];
Do[If[spider[[i]]>GSizeX,spi[[i]]=0,If[spider[[i]]<-GSizeX,spi[[i]]=1]],{i,1,13}];
,t+=GSizeY/4];


If[spiderY1<=-GSizeY,spiderY1+=2*GSizeY;(*敵が最下部に行った時の処理*)
spider[[1]]=RandomInteger[{-GSizeX,GSizeX}];spi[[1]]=RandomInteger[];
spider[[2]]=RandomInteger[{-GSizeX,GSizeX}];spi[[2]]=RandomInteger[];
spider[[3]]=RandomInteger[{-GSizeX,GSizeX}];spi[[3]]=RandomInteger[];
];
If[spiderY2<=-GSizeY,spiderY2+=2*GSizeY;
spider[[4]]=RandomInteger[{-GSizeX,GSizeX}];spi[[4]]=RandomInteger[];
spider[[5]]=RandomInteger[{-GSizeX,GSizeX}];spi[[5]]=RandomInteger[];
spider[[6]]=RandomInteger[{-GSizeX,GSizeX}];spi[[6]]=RandomInteger[];
];
If[spiderY3<=-GSizeY,spiderY3+=2*GSizeY;
spider[[7]]=RandomInteger[{-GSizeX,GSizeX}];spi[[7]]=RandomInteger[];
spider[[8]]=RandomInteger[{-GSizeX,GSizeX}];spi[[8]]=RandomInteger[];
spider[[9]]=RandomInteger[{-GSizeX,GSizeX}];spi[[9]]=RandomInteger[];
spider[[10]]=RandomInteger[{-GSizeX,GSizeX}];spi[[10]]=RandomInteger[];
];
If[spiderY4<=-GSizeY,spiderY4+=2*GSizeY;
spider[[11]]=RandomInteger[{-GSizeX,GSizeX}];spi[[11]]=RandomInteger[];
spider[[12]]=RandomInteger[{-GSizeX,GSizeX}];spi[[12]]=RandomInteger[];
spider[[13]]=RandomInteger[{-GSizeX,GSizeX}];spi[[13]]=RandomInteger[];
];


If[gameover==0,pt =MousePosition[{"Graphics",Graphics},pt]];(*自機の位置調整*)
If[Mod[pt[[2]],GSizeY/4]-t<GSizeY/4+t-Mod[pt[[2]],GSizeY/4],
pt[[2]]=(Quotient[pt[[2]],GSizeY/4])*GSizeY/4+t,
If[Mod[pt[[2]],GSizeY/4]-(GSizeY/4+t)<GSizeY*2/4+t-Mod[pt[[2]],GSizeY/4],
pt[[2]]=(Quotient[pt[[2]],GSizeY/4]+1)*GSizeY/4+t,
pt[[2]]=(Quotient[pt[[2]],GSizeY/4]+2)*GSizeY/4+t
];
];


Do[If[Abs[pt[[1]]-spider[[i]]]<18 &&Abs[pt[[2]]-spiderY1]<18 ,(*接触判定*)
gameover=1;gpt=pt
],{i,1,3}];
Do[If[Abs[pt[[1]]-spider[[i]]]<18 &&Abs[pt[[2]]-spiderY2]<18 ,
gameover=1;gpt=pt
],{i,4,6}];
Do[If[Abs[pt[[1]]-spider[[i]]]<18 &&Abs[pt[[2]]-spiderY3]<18 ,
gameover=1;gpt=pt
],{i,7,10}];
Do[If[Abs[pt[[1]]-spider[[i]]]<18 &&Abs[pt[[2]]-spiderY4]<18 ,
gameover=1;gpt=pt
],{i,11,13}];
If[pt[[2]]<-GSizeY,gameover=1;gpt=pt];(*画面外に出たとき*)
];


Graphics[{Rectangle[{-GSizeX,-GSizeY},{GSizeX,GSizeY}],(*画面への表示*)
Purple,
Line[{{-GSizeX,t+GSizeY},{GSizeX,t+GSizeY}}],(*行動可能ライン*)
Line[{{-GSizeX,t+GSizeY*3/4},{GSizeX,t+GSizeY*3/4}}],
Line[{{-GSizeX,t+GSizeY*2/4},{GSizeX,t+GSizeY*2/4}}],
Line[{{-GSizeX,t+GSizeY/4},{GSizeX,t+GSizeY/4}}],
Line[{{-GSizeX,t},{GSizeX,t}}],
Line[{{-GSizeX,t-GSizeY/4},{GSizeX,t-GSizeY/4}}],
Line[{{-GSizeX,t-GSizeY*2/4},{GSizeX,t-GSizeY*2/4}}],
Line[{{-GSizeX,t-GSizeY*3/4},{GSizeX,t-GSizeY*3/4}}],
Line[{{-GSizeX,t-GSizeY},{GSizeX,t-GSizeY}}],
White,
Disk[{spider[[1]],spiderY1},10],(*敵*)
Disk[{spider[[2]],spiderY1},10],
Disk[{spider[[3]],spiderY1},10],
Disk[{spider[[4]],spiderY2},10],
Disk[{spider[[5]],spiderY2},10],
Disk[{spider[[6]],spiderY2},10],
Disk[{spider[[7]],spiderY3},10],
Disk[{spider[[8]],spiderY3},10],
Disk[{spider[[9]],spiderY3},10],
Disk[{spider[[10]],spiderY3},10],
Disk[{spider[[11]],spiderY4},10],
Disk[{spider[[12]],spiderY4},10],
Disk[{spider[[13]],spiderY4},10],
Black,gback,(*被弾時背景*)
Purple,Disk[pt,10],(*自機*)
Black,Thick,gline,(*割れ表現*)
White,gtxt(*＊そんなのお断りだ。*)
},
PlotRange->{{-GSizeX,GSizeX},{-GSizeY,GSizeY}},
Frame->True,
FrameTicks->None],
UpdateInterval->5]]]