(*by Nasser M. Abbasi, Nov 1, 2015. Bouncing ball of the floor with different coefficient of restituion*)
Manipulate[
tick;
h=1;
g=9.8;
If[(statex=="RUN"||statex=="STEP")&&statex2=="",
If[state=="down",
delS=currentV*delT+1/2 g delT^2;
currentV+= g *delT;
currentH-=delS
,
delS=currentV*delT-1/2 g delT^2;
currentV-= g *delT;
currentH+=delS
];
distantTravelled+=delS
];

gr=Graphics[
{
Line[{{-.3,-r/2},{.3,-r/2}}],
(*{LightGray,Dashed,Line[{{0,0},{0,1}}]},*)
{Red,Disk[{0,currentH},r]}
},
PlotRange->{{-.3,.3},{-4r,1+4r}},Axes->{False,True},ImageSize->{300,300}];
(*gr=Grid[{
{"current time ","current h","state","current V","max H","N","delS","distantTravelled"},
{ currentT,currentH,state,currentV,maxH,n,delS,distantTravelled},
{gr,SpanFromLeft}},Frame->All];*)

gr=Grid[{
{Grid[{
{"height","speed","cycle #","Δs","direction"},
{padIt2[currentH,{3,2}],padIt2[currentV,{4,3}],padIt2[n,{1}],padIt2[delS,{4,3}],state}
},Frame->All]
},
{Grid[
{
{Column[{"Theoretical","total time"}],Column[{"Current","time"}],Column[{"Theoretical",Column[{"total","distant"}]}],Column[{"current","distance"}]},
{padIt2[tTime,{6,3}],padIt2[currentT,{6,3}],
 padIt2[tDistance,{3,2}],padIt2[totalDist,{6,3}]
}
},Frame->All
]
},

{gr,SpanFromLeft}}];

If[statex2=="pass",
statex2=""
,
currentT+=delT;
totalDist+=delS;
If[Abs@distantTravelled≥maxH,
distantTravelled=0;

If[state=="down",
currentV=e*currentV;
state="up";
n=n+1;
maxH=e^(2*n)*h;
currentH=0
,
state="down";
currentV=0;
currentH=maxH
]
]
];

If[statex=="RUN"&&currentT<tTime,
tick=Not[tick]
];
gr,
{{tick,False},None},
Text@Grid[{
{Grid[{
{Button[Text@Style["run",12],{statex="RUN";tick=Not[tick]},ImageSize->{50,40}],
Button[Text@Style["step",12],{statex="STEP";tick=Not[tick]},ImageSize->{50,40}],
Button[Text@Style["stop",12],{statex="STOP";tick=Not[tick]},ImageSize->{50,40}],
Button[Text@Style["reset",12],{statex="STEP";currentH=1;currentT=0;n=0;
distantTravelled=0;currentV=0;maxH=1;state="down";totalDist=0;statex2="";
tDistance=If[e==1,Infinity,(1+e^2)/(1-e^2)];
tTime=If[e==1,Infinity,Sqrt[2/9.81]*((1+e)/(1-e))];
tick=Not[tick]},ImageSize->{50,40}]}
},Frame->True,FrameStyle->Gray
],SpanFromLeft},
{Grid[{

{"Coefficient of restitution",
Manipulator[Dynamic[e,{e=#;
statex="STEP";
currentH=1;
currentT=0;n=0;
distantTravelled=0;
currentV=0;
maxH=1;
state="down";
totalDist=0;
tDistance=If[e==1,Infinity,(1+e^2)/(1-e^2)];
tTime=If[e==1,Infinity,Sqrt[2/9.81]*((1+e)/(1-e))];
tick=Not[tick];
statex2="pass"}&],{0,1,.01},ImageSize->Tiny],Dynamic[padIt2[e,{2,2}]],
SpanFromLeft},

{"Animation speed",
Manipulator[Dynamic[delT,{delT=#}&],{0.001,0.03,0.001},ImageSize->Tiny],Dynamic[padIt2[delT,{3,3}]],
SpanFromLeft},

{"ball size",
Manipulator[Dynamic[r,{r=#;tick=Not[tick],statex2="pass"}&],{0.01,0.1,0.001},ImageSize->Tiny],Dynamic[padIt2[r,{3,3}]],
SpanFromLeft}

},Alignment->Left,Frame->True,FrameStyle->Gray]
}}],
{{n,0},None},
{{currentH,1},None},
{{currentT,0},None},
{{state,"down"},None},
{{statex,"STEP"},None},
{{statex2,""},None},
{{distantTravelled,0},None},
{{currentV,0},None},
{{maxH,1},None},
{{gr,0},None},
{{e,.9},None},
{{delT,0.02},None},
{{r,0.04},None},
{{totalDist,0},None},
{{tDistance,(1+(.9)^2)/(1-(.9)^2)},None},
{{tTime,Sqrt[2/9.81]*((1+.9)/(1-.9))},None},
TrackedSymbols:>{tick},
Alignment->Center,
SynchronousUpdating->True,
SynchronousInitialization->True,
FrameMargins->1,
ImageMargins->1,
ControlPlacement->Left,
Initialization:>
{
padIt1[v_,f_List]:=AccountingForm[Chop[v],f,NumberSigns->{"-","+"},NumberPadding->{"0","0"},SignPadding->True];
padIt2[v_,f_List]:=AccountingForm[Chop[v],f,NumberSigns->{"",""},NumberPadding->{"0","0"},SignPadding->True]
}
]