Challenge
Community Forums/Showcase/Challenge
| ||
| I got bored again and inspired by the comic antics in the warthog and warthog revisited halo movies I decided to look into a simple real-time physics engine. This little proggy simulates a point mass (m) being accelerated upwards by force (f) for time (t) the resultant force on the object is show on the screen by R, I am sure you will work the rest of the data out. Somewhere along the way I turned it into a very simple game whereby you select the launch parameters and then try to land the thing again with a velocity of less than 1 meter per second. Then I thought well what's the perfect case scenario? so I had a quick attempt at crowbaring in an Auto Pilot. It works for the default settings and any coefficient of friction less than zero. However it fails if the friction is zero or the thrust time is greater than 2 seconds. Now here's the challenge: Can someone write an autopilot (lines 56 - 62) such that it can land succesfully for all combinations of uF thrust, burn time and mass. A positive value of uF may be ignored as that would accelerate the craft in the direction its going :) No cheating by changing any of the parameters set at launch time. You may however record the ships state (velocity height etc at any time for use in the auto pilot later - I already check the height at which the primary burn finished) and you may attenuate the ships thrust to any value between the set launch parameter and zero. now here's the code: I included the keyconstants so the code was cut'n'paste friendly but at home here I include it as a seperate file.
;Include "key_constants.bb"
Const G#=-9.81 ;m/s/s
Const LANDED=1
Const BURNING=2
Const FLYING=3
Const CRASHED=4
friction#=-0.7
thrust#=1000 ;N
mass=25 ;Kg
thrust_time#=2 ;seconds
start_time=MilliSecs()
last_time=start_time
this_time=start_time
v#=0
u#=0
s#=0
Local df[5]
Local dft#[3]
df[0]=1
df[1]=5
df[2]=10
df[3]=50
df[4]=100
df[5]=1000
dft[0]=0.01
dft[1]=0.1
dft[2]=1
dft[3]=10
fi=4
ti=2
height#=0
f#=0
edit_m=0
auto = 0
thrust_height=0
Local status=LANDED
Graphics 800,600,32,2
SetBuffer BackBuffer()
SetFont LoadFont("verdana",15,1)
While Not KeyHit(k_escape)
Cls
last_time=this_time
this_time=MilliSecs()-start_time
u#=v#
If KeyHit(k_a) auto=1-auto
period#=Float(this_time-last_time)/1000
If (launch_time>0)
If (this_time>launch_time+(thrust_time*1000)And status=BURNING)f#=0:status=FLYING
If (Not auto) And (status=FLYING)
f=0
If KeyDown(k_z) f=thrust
If KeyDown(k_x) f=thrust/2
If KeyDown(k_c) f=thrust/4
End If
If auto And status=FLYING And height<=thrust_height
If v<-height And v<-1 Then
f=thrust
Else
f=-mass*g
End If
End If
a#=(f#+v*friction+mass*g)/mass
v#=u#+a#*period
s#=u*period+0.5*a*period*period
height#=height#+(s)
If height#>max# Then max=height#
If v>max_v# Then
max_v=v
If height>thrust_height thrust_height=height
End If
flight_time#=Float(this_time-launch_time)/1000
If (height#<=0) And (status=flying)
height=0
s=0
launch_time=0
f=0
If Abs(v)<1 Then status=LANDED
If Abs(v)>1 Then status=CRASHED
auto=0;
thrust_height=0
End If
End If
Color 70,190,80
Rect 0,590,800,10,1
Color 220,90,80
Rect 398,584-height,5,6,1
Rect 399,581-height,3,3,1
Rect 400,579-height,1,2,1
If f>0
Color 250,250,0
Rect 399,588-height+2,3,3
Color 400,200,0
Rect 400,590-height+3,1,4
End If
Color 255,255,255
If KeyHit(K_L) And launch_time=0
v=0:u=0
launch_time=MilliSecs()-start_time
f#=thrust
max#=0
max_v=0
flight_time#=0
status=BURNING
End If
Text 10,40,"a = "+((f/mass)+g)+"m/s/s"
Text 10,60,"s = "+height#+"m"
Text 10,80,"R = "+(f+(v*friction)+(mass*g))+"N"
Text 300,80,"("+(v*friction)+"N friction)"
If Abs(v)>1 Then
Color 255,0,0
Else
Color 0,255,0
End If
Text 10,100,"v = "+v+"m/s"
Color 255,255,255
Text 10,120,"Launched ="+((launch_time)/1000)
Text 10,140,"Time = "+((this_time)/1000)
Text 10,160,"Period = "+period
Color 200,90,80
Text 10,180,"Max s = "+max+"m"
Text 10,200,"Max v = "+max_v+"m/s"
Text 10,220,"Flight t = "+flight_time+"s"
Color 255,255,255
If edit_m=0
Color 70,190,80
Text 10,0,"uf = "+friction
Color 255,255,255
Text 10,240,"Thrust ="+thrust+"N ("+df[fi]+" Newton adjust)"
Text 10,260,"Burn ="+thrust_time +"s ("+dft[ti]+" second adjust)"
Text 10,20,"m = "+mass+"kg ("+df[fi]+" Kg adjust)"
End If
If edit_m=2
Text 10,0,"uf = "+friction
Color 70,190,80
Text 10,240,"Thrust ="+thrust+"N ("+df[fi]+" Newton adjust)"
Color 255,255,255
Text 10,260,"Burn ="+thrust_time +"s ("+dft[ti]+" second adjust)"
Text 10,20,"m = "+mass+"kg ("+df[fi]+" Kg adjust)"
End If
If edit_m=3
Text 10,0,"uf = "+friction
Text 10,240,"Thrust ="+thrust+"N ("+df[fi]+" Newton adjust)"
Color 70,190,80
Text 10,260,"Burn ="+thrust_time +"s ("+dft[ti]+" second adjust)"
Color 255,255,255
Text 10,20,"m = "+mass+"kg ("+df[fi]+" Kg adjust)"
End If
If edit_m=1
Text 10,0,"uf = "+friction
Text 10,240,"Thrust ="+thrust+"N ("+df[fi]+" Newton adjust)"
Text 10,260,"Burn ="+thrust_time +"s ("+dft[ti]+" second adjust)"
Color 70,190,80
Text 10,20,"m = "+mass+"kg ("+df[fi]+" Kg adjust)"
Color 255,255,255
End If
If KeyHit(k_r) height=0:v=0:f=Int (0):auto=0
If KeyHit(K_SPACE) edit_m= edit_m+1 :If edit_m>3 edit_m=0
If edit_m=1
If KeyHit(K_Up) mass=mass+df[fi]
If KeyHit(k_down)mass=mass-df[fi]
If KeyHit(k_right) fi=fi+1 :If fi>5 fi=5
If KeyHit(k_left) fi=fi-1 :If fi<0 fi=0
End If
If edit_m=2
If KeyHit(K_Up) thrust=thrust+df[fi]
If KeyHit(k_down)thrust=thrust-df[fi]
If KeyHit(k_right) fi=fi+1 :If fi>5 fi=5
If KeyHit(k_left) fi=fi-1 :If fi<0 fi=0
End If
If edit_m=3
If KeyHit(K_Up) thrust_time=thrust_time+dft[ti]
If KeyHit(k_down)thrust_time=thrust_time-dft[ti]
If KeyHit(k_right) ti=ti+1 :If ti>3 ti=3
If KeyHit(k_left) ti=ti-1 :If ti<0 ti=0
End If
If edit_m=0
If KeyHit(K_Up) friction=friction+0.1
If KeyHit(k_down)friction=friction-0.1
If Abs(friction)<0.1 friction=0
End If
Color 100,255,90
Text 10,400,"Z Thrust"
Text 10,420,"X Thrust/2"
Text 10,440,"C Thrust/4"
Text 10,460,"L to launch, Space And arrow "
Text 10,480,"keys to change parameters"
Text 10,500,"R to reset A to engage Autopilot"
Text 10,520, "Esc to quit."
If auto Then Text 10,300,"Auto pilot on"
If status=LANDED Color 0,255,0:Text 280,400,"Landed, well done!!"
If status=CRASHED Color 255,0,0:Text 280,400,"Crashed, bad luck!!"
Color 255,255,255
Flip(1)
Wend
End
;******************** COSNTANTS *************************
Const K_ESCAPE= 1
Const K_1= 2
Const K_2= 3
Const K_3= 4
Const K_4= 5
Const K_5= 6
Const K_6= 7
Const K_7= 8
Const K_8= 9
Const K_9= 10
Const K_0= 11
Const K_Minus= 12; On Main Keyboard
Const K_Equals= 13
Const K_Backspace= 14; Backspace key
Const K_Tab= 15
Const K_Q= 16
Const K_W= 17
Const K_E= 18
Const K_R= 19
Const K_T= 20
Const K_Y= 21
Const K_U= 22
Const K_I= 23
Const K_O= 24
Const K_P= 25
Const K_Left_Bracket= 26
Const K_Right_Bracket= 27
Const K_Enter= 28; Return/Enter on Main Keyboard
Const K_Left_Control= 29
Const K_A= 30
Const K_S= 31
Const K_D= 32
Const K_F= 33
Const K_G= 34
Const K_H= 35
Const K_J= 36
Const K_K= 37
Const K_L= 38
Const K_Semi_Colon= 39
Const K_Apostrophe=40;'
Const K_Grave= 41; Accent Grave `
Const K_Left_Shift= 42
Const K_Backslash=43
Const K_Z= 44
Const K_X= 45
Const K_C= 46
Const K_V= 47
Const K_B= 48
Const K_N= 49
Const K_M= 50
Const K_Comma= 51
Const K_Period= 52; On Main keyboard
Const K_Slash= 53; On Main Keyboard
Const K_Right_Shift= 54
Const K_Multiply= 55; On Numeric Keypad
Const K_Left_Alt= 56
Const K_Space=57
Const K_Capslock=58
Const K_F1= 59
Const K_F2 =60
Const K_F3= 61
Const K_F4= 62
Const K_F5= 63
Const K_F6= 64
Const K_F7= 65
Const K_F8= 66
Const K_F9= 67
Const K_F10= 68
Const K_NumLock= 69
Const K_ScrollLock= 70
Const K_NumPad_7= 71
Const K_NumPad_8= 72
Const K_NumPad_9= 73
Const K_Subtract= 74; On Numeric Keypad
Const K_NumPad_4= 75
Const K_NumPad_5= 76
Const K_NumPad_6= 77
Const K_Add=78; On Numeric Keypad
Const K_NumPad_1= 79
Const K_NumPad_2= 80
Const K_NumPad_3= 81
Const K_NumPad_0= 82
Const K_Decimal= 83; On Numeric Keypad
Const K_OEM_102= 86; On UK/Germany Keyboards
Const K_F11= 87
Const K_F12= 88
Const K_F13= 100; (NEC PC98)
Const K_F14= 101; (NEC PC98)
Const K_F15= 102; (NEC PC98)
Const K_Kana= 112; Japanese Keyboard
Const K_ABNT_C1= 115; /? on Portugese (Brazilian) keyboards
Const K_Convert= 121; Japanese Keyboard
Const K_NoConvert= 123; Japanese Keyboard
Const K_Yen= 125; Japanese Keyboard
Const K_ABNT_C2= 126; Numpad . on Portugese (Brazilian) keyboards
Const K_NUMPAD_Equals= 141; = on numeric keypad (NEC PC98)
Const K_PrevTrack= 144; Previous Track (DIK_CIRCUMFLEX on Japanese keyboard)
Const K_AT= 145; (NEC PC98)
Const K_Colon= 146; (NEC PC98)
Const K_Underline= 147; (NEC PC98)
Const K_Kanji= 148; Japanese Keyboard
Const K_Stop= 149; (NEC PC98)
Const K_AX= 150; Japan AX
Const K_Unlabeled= 151; (J3100)
Const K_Next_Track= 153; Next Track
Const K_NUMPAD_Enter= 156; ENTER on Numeric Keypad
Const K_Right_Control= 157
Const K_Mute= 160; Mute
Const K_Calculator= 161; Calculator
Const K_Play_Pause= 162; Play/Pause
Const K_Media_Stop= 164; Media Stop
Const K_Volume_Down= 174; Volume -
Const K_Volume_Up =176; Volume +
Const K_Web_Home =178; Web Home
Const K_NUMPAD_Comma= 179; On Numeric Keypad (NEX PC98)
Const K_Divide= 181; / On Numeric Keypad
Const K_SysReq =183;
Const K_Right_alt= 184; Right Alt
Const K_Pause= 197; Pause
Const K_Home= 199; Home on Arrow Pad
Const K_Up= 200; Up Arrow on Arrow Keypad
Const K_Page_Up= 201; Page Up on Arrow Keypad
Const K_Left= 203; Left Arrow on Arrow Keypad
Const K_Right= 205; Right Arrow on Arrow Keypad
Const K_End =207; End Key on Arrow Keypad
Const K_Down= 208; Down Key on Arrow Keypad
Const K_Next= 209; Next Key on Arrow Keypad
Const K_Insert= 210; Insert Key on Arrow Keypad
Const K_Delete= 211; Delete Key on Arrow Keypad
Const K_Left_Windows= 219; Left Windows Key
Const K_Right_Windows= 220; Right Windows Key
Const K_Apps= 221; Apps Menu Key
Const K_Power= 222; System Power
Const K_Sleep= 223; System Sleep
Const K_Wake= 227 ;System Wake
Const K_Web_Search= 229
Const K_Web_Favorites= 230
Const K_Web_Refresh= 231
Const K_Web_Stop= 232
Const K_Web_Forward= 233
Const K_Web_Back= 234
Const K_My_Computer= 235
Const K_Mail= 236
|
| ||
| well that produced a fantastic response.. for those of you who are even slightly interested the solution I found was: [code] If auto And status=FLYING then If (height<2*thrust_height) And (v<-1) f#=(((v*v)/(2*height))*mass)-mass*g End If [code] play it safe works the best it seems. - Luke |