Share via


Small Basic Sample: Snake

Code

Initialize()
While (GameState <> "")
    DoGameLoop()
EndWhile
Program.End()
 
Sub Initialize
    InitializeVariables()
    InitializeScreen()
EndSub
 
Sub InitializeVariables
    Array.SetValue("DeltaX","North",0)
    Array.SetValue("DeltaX","East",1)
    Array.SetValue("DeltaX","South",0)
    Array.SetValue("DeltaX","West",-1)
    Array.SetValue("DeltaY","North",-1)
    Array.SetValue("DeltaY","East",0)
    Array.SetValue("DeltaY","South",1)
    Array.SetValue("DeltaY","West",0)
    Array.SetValue("NorthFlag","North",1)
    Array.SetValue("NorthFlag","East",0)
    Array.SetValue("NorthFlag","South",0)
    Array.SetValue("NorthFlag","West",0)
    Array.SetValue("SouthFlag","North",0)
    Array.SetValue("SouthFlag","East",0)
    Array.SetValue("SouthFlag","South",1)
    Array.SetValue("SouthFlag","West",0)
    Array.SetValue("EastFlag","North",0)
    Array.SetValue("EastFlag","East",1)
    Array.SetValue("EastFlag","South",0)
    Array.SetValue("EastFlag","West",0)
    Array.SetValue("WestFlag","North",0)
    Array.SetValue("WestFlag","East",0)
    Array.SetValue("WestFlag","South",0)
    Array.SetValue("WestFlag","West",1)
    Array.SetValue("DirectionInput","N","North")
    Array.SetValue("DirectionInput","E","East")
    Array.SetValue("DirectionInput","S","South")
    Array.SetValue("DirectionInput","W","West")
    GameDelay = 100
    Score = 0
    HighScore = 0
    GameState = "TitleScreen"
    ScreenDirty = 1
    CurrentDirectory = Text.GetSubText(File.GetSettingsFilePath(),0,Text.GetLength(File.GetSettingsFilePath())-26)
EndSub
 
Sub InitializeScreen
    GraphicsWindow.Show()
    GraphicsWindow.Width = 640
    GraphicsWindow.Height = 480
    GraphicsWindow.KeyDown = HandleKeyPress
EndSub
 
Sub HandleTitleScreenKeyPress
  Key = GraphicsWindow.LastKey
    If (Key = "Escape") Then
        GameState=""
    Else
        If (Key="F2") Then
            GameState = "Play"
            ScreenDirty = 1
        Else
            If (Key="F1") Then
                GameState = "Instructions"
                ScreenDirty = 1
            EndIf
        EndIf
    EndIf
EndSub
 
Sub HandleInstructionsKeyPress
    Key = GraphicsWindow.LastKey
    If (Key = "Escape") Then
        GameState = "TitleScreen"
        ScreenDirty = 1
    EndIf
EndSub
 
Sub HandlePlayKeyPress
    Key = GraphicsWindow.LastKey
    If (Key = "Left") Then
        DirectionInput = DirectionInput + "W"
    Else
        If (Key = "Right") Then
            DirectionInput = DirectionInput + "E"
        Else
            If (Key = "Up") Then
                DirectionInput = DirectionInput + "N"
            Else
                If (Key = "Down") Then
                    DirectionInput = DirectionInput + "S"
                EndIf
            EndIf
        EndIf
    EndIf
EndSub
 
Sub HandleGameOverKeyPress
    Key = GraphicsWindow.LastKey
    If (Key = "Escape") Then
        GameState=""
    Else
        If (Key="F2") Then
            GameState = "Play"
            ScreenDirty = 1
        Else
            If (Key="F1") Then
                GameState = "Instructions"
                ScreenDirty = 1
            EndIf
        EndIf
    EndIf
EndSub
 
Sub HandleKeyPress
    If (GameState="TitleScreen") Then
      HandleTitleScreenKeyPress()
    Else
        If (GameState="Instructions") Then
            HandleInstructionsKeyPress()
        Else
            If (GameState="Play") Then
                HandlePlayKeyPress()
            Else
                If (GameState="GameOver") Then
                    HandleGameOverKeyPress()
                Else
                EndIf
            EndIf
        EndIf
    EndIf    
EndSub
 
Sub DoTitleScreenLoop
    If (ScreenDirty = 1) Then
        ScreenDirty = 0
        GraphicsWindow.Clear()
        GraphicsWindow.BrushColor = "#000000"
        GraphicsWindow.FontSize = 32
        GraphicsWindow.DrawText(0,0,"SBSnake!")
        GraphicsWindow.FontSize = 16
        GraphicsWindow.DrawText(0,64,"F1 for instructions")
        GraphicsWindow.DrawText(0,80,"F2 for a new game")
        GraphicsWindow.DrawText(0,96,"Escape to exit")
    EndIf
EndSub
 
Sub DoInstructionLoop
    If (ScreenDirty = 1) Then
        ScreenDirty = 0
        GraphicsWindow.Clear()
        GraphicsWindow.BrushColor = "#000000"
        GraphicsWindow.FontSize = 32
        GraphicsWindow.DrawText(0,0,"How To Play SBSnake!")
        GraphicsWindow.FontSize = 16
        GraphicsWindow.DrawText(0,64,"Arrows to move snake.")
        GraphicsWindow.DrawText(0,80,"Don't hit the walls; don't hit your tail.")
        GraphicsWindow.DrawText(0,96,"Eat pellets to increase score.")
        GraphicsWindow.DrawText(0,112,"Escape to return to main menu")
    EndIf
EndSub
 
Sub AddPellet
    PickPellet:
    PelletX = Math.GetRandomNumber(40)-1
    PelletY = Math.GetRandomNumber(30)-1
    Color = GraphicsWindow.GetPixel(PelletX * 16 + 8, PelletY * 16 + 8)
    If (Color = "#00FF00" Or Color="#FF0000") Then
        Goto PickPellet
    EndIf
    GraphicsWindow.PenWidth = 0
    GraphicsWindow.BrushColor = "#FF0000"
    GraphicsWindow.FillRectangle(PelletX* 16+3, PelletY * 16+3,10,10)
EndSub
 
Sub DrawHead
    GraphicsWindow.PenWidth = 0
    GraphicsWindow.BrushColor = "#00FF00"
    GraphicsWindow.FillRectangle(SnakeHeadX * 16+2, SnakeHeadY * 16+2,12,12)
    If (Direction="South") Then
        GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16,8,4)
    EndIf
    If (Direction="North") Then
        GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16+12,8,4)
    EndIf
    If (Direction="East") Then
        GraphicsWindow.FillRectangle(SnakeHeadX * 16, SnakeHeadY*16+4,4,8)
    EndIf
    If (Direction="West") Then
        GraphicsWindow.FillRectangle(SnakeHeadX * 16+12, SnakeHeadY*16+4,4,8)
    EndIf
EndSub
 
Sub EraseHead
    If (GraphicsWindow.GetPixel(SnakeHeadX*16+8,SnakeHeadY*16)="#00FF00") Then
        NorthFlag = 1
    Else
        NorthFlag = Array.GetValue("NorthFlag",Direction)
    EndIf
    If (GraphicsWindow.GetPixel(SnakeHeadX*16+8,SnakeHeadY*16+15)="#00FF00") Then
        SouthFlag = 1
    Else
        SouthFlag = Array.GetValue("SouthFlag",Direction)
    EndIf
    If (GraphicsWindow.GetPixel(SnakeHeadX*16,SnakeHeadY*16+8)="#00FF00") Then
        WestFlag = 1
    Else
        WestFlag = Array.GetValue("WestFlag",Direction)
    EndIf
    If (GraphicsWindow.GetPixel(SnakeHeadX*16+15,SnakeHeadY*16+8)="#00FF00") Then
        EastFlag = 1
    Else
        EastFlag = Array.GetValue("EastFlag",Direction)
    EndIf
    GraphicsWindow.BrushColor = "#FFFFFF"
    GraphicsWindow.FillRectangle(SnakeHeadX * 16, SnakeHeadY*16,16,16)
    GraphicsWindow.BrushColor = "#00FF00"
    If (AtePellet = 1) Then
        GraphicsWindow.FillRectangle(SnakeHeadX * 16+3, SnakeHeadY*16+3,10,10)
    Else
        GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16+4,8,8)
    EndIf
    If (NorthFlag = 1) Then
        GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16,8,4)
    EndIf
    If (SouthFlag = 1) Then
        GraphicsWindow.FillRectangle(SnakeHeadX * 16+4, SnakeHeadY*16+12,8,4)
    EndIf
    If (WestFlag = 1) Then
        GraphicsWindow.FillRectangle(SnakeHeadX * 16, SnakeHeadY*16+4,4,8)
    EndIf
    If (EastFlag = 1) Then
        GraphicsWindow.FillRectangle(SnakeHeadX * 16+12, SnakeHeadY*16+4,4,8)
    EndIf
EndSub
 
Sub EraseTail
    If (GraphicsWindow.GetPixel(SnakeTailX*16+8,SnakeTailY*16)="#00FF00") Then
        NorthFlag = 1
    Else
        NorthFlag = 0
    EndIf
    If (GraphicsWindow.GetPixel(SnakeTailX*16+8,SnakeTailY*16+15)="#00FF00") Then
        SouthFlag = 1
    Else
        SouthFlag = 0
    EndIf
    If (GraphicsWindow.GetPixel(SnakeTailX*16,SnakeTailY*16+8)="#00FF00") Then
        WestFlag = 1
    Else
        WestFlag = 0
    EndIf
    If (GraphicsWindow.GetPixel(SnakeTailX*16+15,SnakeTailY*16+8)="#00FF00") Then
        EastFlag = 1
    Else
        EastFlag = 0
    EndIf
    GraphicsWindow.BrushColor = "#FFFFFF"
    GraphicsWindow.FillRectangle(SnakeTailX * 16, SnakeTailY*16,16,16)
     
    If (NorthFlag = 1) Then
        TailDirection = "North"
    EndIf
    If (SouthFlag = 1) Then
        TailDirection = "South"
    EndIf
    If (EastFlag = 1) Then
        TailDirection = "East"
    EndIf
    If (WestFlag = 1) Then
        TailDirection = "West"
    EndIf
    SnakeTailX = SnakeTailX + Array.GetValue("DeltaX",TailDirection)
    SnakeTailY = SnakeTailY + Array.GetValue("DeltaY",TailDirection)
    If (GraphicsWindow.GetPixel(SnakeTailX*16+3,SnakeTailY*16+3)="#00FF00") Then
        TailPellet = 1
    Else
        TailPellet = 0
    EndIf 
    If (GraphicsWindow.GetPixel(SnakeTailX*16+8,SnakeTailY*16)="#00FF00") Then
        NorthFlag = 1
    Else
        NorthFlag = 0
    EndIf
    If (GraphicsWindow.GetPixel(SnakeTailX*16+8,SnakeTailY*16+15)="#00FF00") Then
        SouthFlag = 1
    Else
        SouthFlag = 0
    EndIf
    If (GraphicsWindow.GetPixel(SnakeTailX*16,SnakeTailY*16+8)="#00FF00") Then
        WestFlag = 1
    Else
        WestFlag = 0
    EndIf
    If (GraphicsWindow.GetPixel(SnakeTailX*16+15,SnakeTailY*16+8)="#00FF00") Then
        EastFlag = 1
    Else
        EastFlag = 0
    EndIf
    If (TailDirection="North") Then
        SouthFlag = 0
    EndIf
    If (TailDirection="South") Then
        NorthFlag = 0
    EndIf
    If (TailDirection="East") Then
        WestFlag = 0
    EndIf
    If (TailDirection="West") Then
        EastFlag = 0
    EndIf
    GraphicsWindow.FillRectangle(SnakeTailX * 16, SnakeTailY*16,16,16)
    GraphicsWindow.BrushColor = "#00FF00"
    If (TailPellet = 1) Then
        GraphicsWindow.FillRectangle(SnakeTailX * 16+3, SnakeTailY*16+3,10,10)
    Else
        GraphicsWindow.FillRectangle(SnakeTailX * 16+4, SnakeTailY*16+4,8,8)
    EndIf
    If (NorthFlag = 1) Then
        GraphicsWindow.FillRectangle(SnakeTailX * 16+4, SnakeTailY*16,8,4)
    EndIf
    If (SouthFlag = 1) Then
        GraphicsWindow.FillRectangle(SnakeTailX * 16+4, SnakeTailY*16+12,8,4)
    EndIf
    If (WestFlag = 1) Then
        GraphicsWindow.FillRectangle(SnakeTailX * 16, SnakeTailY*16+4,4,8)
    EndIf
    If (EastFlag = 1) Then
        GraphicsWindow.FillRectangle(SnakeTailX * 16+12, SnakeTailY*16+4,4,8)
    EndIf
EndSub
 
Sub ProcessDirectionInput
    If (Text.GetLength(DirectionInput)>0) Then
        Temp = Text.GetSubText(DirectionInput,1,1)
        DirectionInput = Text.GetSubText(DirectionInput,1,Text.GetLength(DirectionInput)-1)
        Direction = Array.GetValue("DirectionInput",Temp)
    EndIf
EndSub
 
Sub StartGame
    Direction=""
    DirectionInput=""
    SnakeLength = 1
    SnakeMaximumLength = 4
    SnakeHeadX = 20
    SnakeHeadY = 15
    SnakeTailX = 20
    SnakeTailY = 15
    AtePellet = 0
    Score = 0
    GraphicsWindow.Clear()
    DrawHead()
    AddPellet()
    UpdateScore()
EndSub
 
Sub UpdateScore
    GraphicsWindow.Title = "SBSnake - "+Score
EndSub
 
Sub DoPlayLoop
    If (ScreenDirty = 1) Then
        ScreenDirty = 0
        StartGame()
    Else
        If (Direction <> "" Or DirectionInput<>"") Then
            ProcessDirectionInput()
            EraseHead()
            SnakeHeadX = SnakeHeadX + Array.GetValue("DeltaX",Direction)
            SnakeHeadY = SnakeHeadY + Array.GetValue("DeltaY",Direction)
            If (SnakeHeadX<0 Or SnakeHeadX>39 Or SnakeHeadY < 0 Or SnakeHeadY > 29) Then
                GameState = "GameOver"
                ScreenDirty = 1
            Else
                If (GraphicsWindow.GetPixel(SnakeHeadX*16+8,SnakeHeadY*16+8)="#FF0000") Then
                    Score = Score + 1
                    UpdateScore()
                    AtePellet = 1
                    SnakeMaximumLength = SnakeMaximumLength + 2
                    AddPellet()
                Else
                    AtePellet = 0
                EndIf
                If (GraphicsWindow.GetPixel(SnakeHeadX*16+8,SnakeHeadY*16+8)="#00FF00") Then
                    GameState = "GameOver"
                    DrawHead()
                    ScreenDirty = 1
                Else
                    SnakeLength = SnakeLength + 1
                    DrawHead()
                    While (SnakeLength>SnakeMaximumLength)
                        EraseTail()
                        SnakeLength = SnakeLength - 1
                    EndWhile
                    Program.Delay(GameDelay)
                EndIf
            EndIf
        EndIf
    EndIf
EndSub
 
Sub DoGameOverLoop
    If (ScreenDirty = 1) Then
        ScreenDirty = 0
        GraphicsWindow.BrushColor = "#000000"
        GraphicsWindow.FontSize = 32
        GraphicsWindow.DrawText(0,0,"Game Over!")
        GraphicsWindow.FontSize = 16
        GraphicsWindow.DrawText(0,64,"F1 for instructions")
        GraphicsWindow.DrawText(0,80,"F2 for a new game")
        GraphicsWindow.DrawText(0,96,"Escape to exit")
    EndIf
EndSub
 
Sub DoGameLoop
  If (GameState = "TitleScreen") Then
      DoTitleScreenLoop()
  Else
      If (GameState = "Instructions") Then
          DoInstructionLoop()
      Else
          If (GameState = "Play") Then
              DoPlayLoop()
          Else
              If (GameState = "GameOver") Then
                  DoGameOverLoop()
              EndIf
          EndIf
      EndIf
  EndIf
EndSub

See Also

Other Languages