Post Reply 
Rocket Game - from 101 BASIC Computer Games
08-18-2015, 08:34 AM (This post was last modified: 08-18-2015 08:41 AM by Martin Hepperle.)
Post: #2
RE: Rocket Game - from 101 BASIC Computer Games
In case you would also consider another implementation: Here is one I have written in VBA.
For testing, you can copy it into the VBA environment of a MS-Office application like Word, Excel, Powerpoint and run it there.
I think the code is pretty well structured and easy to understand.
You could more easily translate it to the Prime than your original BASIC code.

Note that the code contains a hardwired "autopilot", which must of course be removed for an interactive game.
The numeric values are arbitrary - I did not bother to look up realistic values e.g. for ther "Eagle".

Code:

Sub lander()

    '
    ' Simulation of a vertical descent to the moon
    '
    ' Based on analytical integration of equations
    ' of motion for variable mass
    '
    ' Martin Hepperle
    ' 2015
    
    ' all in metric units
    ' no resistance of air
    
    ' current time and time step
    Dim t, dt
    ' current altitude
    Dim h
    ' current speed
    Dim v
    ' current total mass
    Dim m
    ' fuel mass
    Dim mf
    ' specific fuel consumption of engine
    Dim SFC
    ' gravity acceleration
    Dim g
    ' engine thrust (commanded by pilots input)
    Dim Thrust
    ' count
    Dim i
    
    ' ===== set initial conditions
    ' time
    t = 0
    ' time step [s]
    dt = 0.25
    ' thrust (commanded by pilot)
    Thrust = 0#
    ' initial altitude (+=up)
    h = 100
    ' initial velocity of vehicle [kg] (+=up)
    v = 0
    ' initial mass of vehicle [kg]
    m = 1000
    ' fuel mass (part of m)
    mf = 46
    ' specific fuel consumption of propulsion unit [kg/N/s]
    ' SFC is the fuel mass per second burnt for one Newton of thrust
    SFC = 10 / 3600
    ' gravity acceleration [m/s^2]
    g = 1.225
    
    ' output initial state
    Debug.Print "t [s]" + vbTab + "H [m]" + vbTab + "m [kg]" + vbTab + "v [m/s]"
    Debug.Print FormatNumber(t, 2) + vbTab + FormatNumber(h, 2) + vbTab + FormatNumber(m, 2) + vbTab + FormatNumber(v, 1) + vbTab + FormatNumber(Thrust, 1)
    
    For i = 1 To 10000
        ' handle one time step with constant thrust
        
        ' here we could implement a control law (autopilot)
        If h < 0.5 Then
            ' feet are touching the ground
            Thrust = 0
        ElseIf h < 25 Then
            ' sort of toggle switch auto pilot
            ' floor it - if any fuel left
            If mf > 0 Then
                Thrust = 5400
            End If
        Else
            ' no thrust 
            Thrust = 0
        End If

        '
        ' what happens during this time step dt?
        '
        
        ' change of mass (negative: burning fuel)
        dm = -SFC * Thrust * dt
        
        ' change of velocity (momentum equation for variable mass analytically integrated over time)
        dv = -(g * dt) - 1 / SFC * Log(1 - Thrust * SFC * dt / m)
        
        ' change of height (momentum equation for variable mass analytically integrated over time)
        If Thrust < 0.000000000001 Then
            ' limit case of Thrust=0
            dh = (v - g * dt / 2) * dt
        Else
            ' general case id Thrust>0
            xx = Log(1 - SFC * Thrust * dt / m)
            dh = (((1 - xx) + (v - g / 2 * dt) * SFC) * dt + xx * m / (Thrust * SFC)) / SFC
        End If
    
        ' check height
        If -dh > h Then
            ' this step would lead below the surface
            ' reduce time step to refine approach
            dt = dt / 10#
            ' repeat this step with new dt
        Else
            ' update state
            m = m + dm
            mf = mf + dm
            v = v + dv
            h = h + dh
            t = t + dt
                   
            ' output current state
            Debug.Print FormatNumber(t, 4) + vbTab + FormatNumber(h, 2) + vbTab + FormatNumber(m, 2) + vbTab + FormatNumber(v, 1) + vbTab + FormatNumber(Thrust, 1)
            
            ' have a look at the fuel gauge
            If mf < 0.5 Then
                Debug.Print "Oh: running out of fuel"
                ' no more input allowed
            End If
            
            If h <= 0.0001 Then
                If v > -5 Then
                    Debug.Print "soft landing"
                Else
                    Debug.Print "Oops - your return ticket got lost somewhere"
                End If
                Debug.Print "fuel remaining: "; mf; " kg"
                Exit For
            End If
        End If
    Next i   

End Sub
Find all posts by this user
Quote this message in a reply
Post Reply 


Messages In This Thread
RE: Rocket Game - from 101 BASIC Computer Games - Martin Hepperle - 08-18-2015 08:34 AM



User(s) browsing this thread: 1 Guest(s)