(*補足：画面の更新が速いため、スイッチの反応が悪いです。頑張って押してください^^*)
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)

(*針*)
n=1000; (*総数*)
l=0.1; (*長さ*)
b=0.001; (*太さ*)
(*線*)
d=0.2; (*太さ*)
(*start,stop,resetを押すと1に*)
start=0; 
stop=0; 
reset=0;


{x,y,theta,x1,x2,y1,y2,needle}=ConstantArray[0,{8,n}]; (*針に必要なリストを生成*)
(*n本の針にランダムな座標を指定*)
For[i=1,i<=n,i++,
{x[[i]],y[[i]],theta[[i]]}=RandomReal[#]&/@{{0,1},{0,1},{0,Pi}}; (*針の重心とx軸からの角度にランダムな値を代入*)
(*重心と角度から針の両端の座標を導出*)
{x1[[i]],x2[[i]]}={x[[i]]-(l/2) Cos[theta[[i]]],x[[i]]+(l/2) Cos[theta[[i]]]};
{y1[[i]],y2[[i]]}={y[[i]]-(l/2) Sin[theta[[i]]],y[[i]]+(l/2) Sin[theta[[i]]]};
color=If[Or@@Thread[(y1[[i]]<=d Range[0,5]<=y2[[i]])],Red,Blue]; (*線に重なるかどうかで赤と青に色付け*)
needle[[i]]=Graphics[{color,Thickness[b],Line[{{x1[[i]],y1[[i]]},{x2[[i]],y2[[i]]}}]}] (*針を生成*)
];

(*ここから動的*)
DynamicModule[{text1="",text2="",text3="",text4="",text5="",text6="",t=0},
Column[{Dynamic[
needlecount=Table[needle[[i]],{i,1,t+1}]; (*針をt本落としたときの針のリストを作成*)
If[start==1,t++,t]; (*startが押されているときtを増加*)
If[reset==1,t=0;reset=0; (*resetが押されたとき、tと針の座標を初期化*)
For[i=1,i<=n,i++,
{x[[i]],y[[i]],theta[[i]]}=RandomReal[#]&/@{{0,1},{0,1},{0,Pi}};
{x1[[i]],x2[[i]]}={x[[i]]-(l/2) Cos[theta[[i]]],x[[i]]+(l/2) Cos[theta[[i]]]};
{y1[[i]],y2[[i]]}={y[[i]]-(l/2) Sin[theta[[i]]],y[[i]]+(l/2) Sin[theta[[i]]]};
color=If[Or@@Thread[(y1[[i]]<=d Range[0,5]<=y2[[i]])],Red,Blue];
needle[[i]]=
Graphics[{color,Thickness[b],Line[{{x1[[i]],y1[[i]]},{x2[[i]],y2[[i]]}}]}];
]
];

If[t>n,Return[針の数が上限を超えました]]; (*エラー処理*)
redcount=Count[Cases[needlecount,_RGBColor,Infinity],Red]; (*線と重なった針の本数を計測*)
Buffon=If[redcount!=0,(2*t*l)/(redcount*d),0 ]; (*Buffonの針の計算式からπの値を導出*)

(*tにおける針やπの近似値のテクスト情報*)
text1=Style["針の合計数："<>If[t>0,ToString[t],""],Bold,50];
text2=Style["赤い針の数："<>If[t>0,ToString[redcount],""],Bold,50];
text3=Style["青い針の数："<>If[t>0,ToString[t-redcount],""],Bold,50];
text4=Style["πの近似値："<>If[t>0,ToString[NumberForm[Buffon,{6,5}]],""],Bold,50];
text5=Style["真値との差："<>If[t>0,If[Buffon-Pi>0,"+","-"]<>ToString[NumberForm[Abs[Buffon-Pi],{6,5}]],"\n"],Bold,50];

(*特に意味のない実況*)
text6=If[t>0,Which[
Abs[Buffon-Pi]<=0.01,Style["超近い！！！(^^)\n",Bold,50,Red],
Abs[Buffon-Pi]<=0.05&&Abs[Buffon-Pi]>0.01,Style["近い！！！\n",Bold,50,Pink],
Abs[Buffon-Pi]<=0.30,Style["やや遠い...\n",Bold,50,Green],
True,Style["遠い...(´;ω;｀)\n",Bold,50,Magenta]
],
"\n"
];

(*並べて表示*)
Grid[{{
Show[
Graphics[{},PlotRange->{{-0.1,1.1},{-0.1,1.1}},Background->Lighter[LightBlue],ImageSize->1000], (*台、あるいは床*)
Table[Graphics[{Black,Thickness[b],Line[{{-0.1,d*i},{1.1,d*i}}]}],{i,0,1/d}], (*線を等間隔に引く*)
If[t>0,needlecount,{}],ImageSize->800],
Column[{
(*テクストとボタンを配置*)
text1,text2,text3,text4,text5,text6,
Button[Dynamic[If[start==0,"START","STOP"]],
If[start==0,start=1;stop=0,start=0;stop=1], (*スタートとストップを切り替える*)
BaseStyle->{FontSize->50},ImageSize->{200,70}],
Button["RESET",reset=1,BaseStyle->{FontSize->50},ImageSize->{200,70}] (*リセットする*)
}]
}}]
]}]
]

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(*一番上に補足事項があります*)