%variable declaration
 
View.Set ("graphics:500;400,title:Uncle Worm           Score: 0,nocursor")
 
var foodx, foody, foodSize : int %food variables
 
var makeFood : boolean := true %when food boolean is true, food is drawn
 
var boxx : int := 0 %variable for box surrounding the screen
 
var boxy : int := 0 %variable for box surrounding the screen
 
var countdown : int := 5
 
var snakesize : int := 5
 
var move, move2, move3, move4 := false
 
var key : array char of boolean
 
var ring : int := 0
 
var answer : string
 
move3 := true %starting direction of snake
 
var newMaxX : int := 500 %innitial screen dimensions (x co-ords)
 
var newMaxY : int := 400 %innitial screen dimensions (y co-ords)
 
var levelUpX : int := 50 %decrease in screen dimensions (x co-ords) upon completion of level
 
var levelUpY : int := 40 %decrease in screen dimensions (y co-ords) upon completion of level
 
var scoreLevel : int := 50
 
var score : int := 0 %score
 
var exitFont : int
 
exitFont := Font.New ("arial:14")
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
type snakeDat :
 
    record
 
        x : int
 
        y : int
 
    end record
 
 
var snake : flexible array 1 .. 2 of snakeDat
 
 
 
snake (1).x := maxx div 2
 
snake (1).y := maxy div 2
 
snake (2).x := (maxx div 2) - 10
 
snake (2).y := maxy div 2
 
%%%%%%%%%
 
% START %
 
%%%%%%%%%
 
colour (0)
 
colourback (7)
 
cls
 
 
 
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
%gives time for user to get ready
 
loop
 
    locate (12, 25) %locates the count down test
 
    put "Starting in...", countdown  %starts the countdown
 
    delay (300) %delay between each consecutive decreasing number
 
    countdown := countdown - 1 %decreasing increments
 
    cls %erases the countdown text when countdown reaches 0
 
    exit when countdown = 0 %game begins when countdown hits 0
 
end loop
 
 
 
%creates food in random locations
 
procedure food
 
    if makeFood then %makeFood:=true
 
        randint (foodx, 1, newMaxX - 10) %random food location (but not in the walls)
 
        randint (foody, 1, newMaxY - 10) %random food location (but not in the walls)
 
        randint (foodSize, 2, 10) %random food size
 
        drawfilloval (foodx, foody, foodSize, foodSize, 2) %draws the food
 
    end if
 
end food
 
 
%point of contact upon death
 
procedure ringEnd
 
    loop
 
        drawoval (snake (1).x, snake (1).y, snakesize + ring, snakesize + ring, ring)  %ring expands around the ball at the point of collision
 
        ring += 2 %increments of the rings
 
        delay (10) %delay between each ring increment
 
        exit when ring = 100 %game ends when ring incremeent hits 100
 
    end loop
 
end ringEnd
 
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
 
 
 
%draws food
 
food
 
 
 
%snake movement
 
loop
 
 
    drawbox (boxx, newMaxY - 1, newMaxX - 1, boxy, 14)
 
    drawfilloval (snake (1).x, snake (1).y, snakesize, snakesize, 12)
 
        if move then
 
        snake (1).y += 10
 
    elsif move2 then
 
        snake (1).y -= 10
 
    elsif move3 then
 
        snake (1).x += 10
 
    elsif move4 then
 
        snake (1).x -= 10
 
    end if
 
    
 
    for decreasing i : upper (snake) .. 2 %set each of the snake's sections to equal the one before it
 
            snake (i) := snake (i - 1)
 
        end for
 
        
 
        delay (100)
 
        
 
    Input.KeyDown (key)
 
    if key (KEY_UP_ARROW) and move2 = false then %Two Conditions: 1. up arrow is pressed 2. move2 = false
 
        move2 := false
 
        move3 := false
 
        move4 := false
 
        move := true
 
    elsif key (KEY_DOWN_ARROW) and move = false then  %Two Conditions: 1. down arrow is pressed 2. move = false
 
        move := false
 
        move3 := false
 
        move4 := false
 
        move2 := true
 
    elsif key (KEY_RIGHT_ARROW) and move4 = false then %Two Conditions: 1. right arrow is pressed 2. move4 = false
 
        move := false
 
        move2 := false
 
        move4 := false
 
        move3 := true
 
    elsif key (KEY_LEFT_ARROW) and move3 = false then   %Two Conditions: 1. left arrow is pressed 2. move3 = false
 
        move := false
 
        move2 := false
 
        move3 := false
 
        move4 := true
 
    end if
 
cls
 
   for i : 1 .. upper (snake) %redraw snake
 
            Draw.FillOval (snake (i).x, snake (i).y, 5,  5, 12)
 
            
 
        end for
 
       
 
        
 
    
 
 
    %wall collision detection
 
    if snake (1).x = 4 or snake (1).x = maxx - 4 or snake (1).y = 4 or snake (1).y = maxy - 4 then   %collision detection to detect whether the ball has hit the walls
 
        View.Set ("graphics:" + intstr (newMaxX) + ";" + intstr (newMaxY) + ",title:Uncle Worm           Score: " + intstr (score) + "             You Lose!") %if balls hits the wall, you lose!
 
        ringEnd %fancy death
 
        exit %game ends
 
    end if
 
    
 
 
 
    
 
 %food collision detection
 
    if score < scoreLevel   %additional check to make sure the level isnt completed
 
        and whatdotcolour (foodx + foodSize, foody + foodSize) = 12 or whatdotcolour (foodx - foodSize, foody - foodSize) = 12
 
                then 
 
                new snake, upper (snake)+1
 
            score += 10 %when food collision detected points are added to score
 
            View.Set ("graphics:" + intstr (newMaxX) + ";" + intstr (newMaxY) + ",title:Uncle Worm           Score: " + intstr (score)) %if food eaten, score added to total at the top of the screen
 
            snake (upper (snake)) := snake (upper (snake) - 1) %set new element's coordinates
 
            drawfilloval (foodx, foody, foodSize, foodSize, 7)  %so that no chunk of food is left behind
 
            food %continue to make food if its still the same level
 
            exit when whatdotcolour (foodx, foody) = 7 %make sure food is not drawn on the snake
 
            for i : 1 .. upper (snake) %redraw snake
 
            Draw.FillOval (snake (i).x, snake (i).y, 5,  5, 12)
 
        end for
 
                end if
 
        
 
  
 
 
 
 
    %NEXT LEVEL
 
    if score >= scoreLevel %ready to enter next level
 
        /*then drawfillbox ((maxx div 2) - 10, maxy, (maxx div 2) + 10, maxy - 5, 0)*/
 
            then
 
        Font.Draw ("EXIT", (maxx div 2) - 25, maxy - 20, exitFont, 0)    %level's exit point
 
        makeFood := false   %once exit appears, no more food is drawn
 
    end if
 
 
    
 
    if whatdotcolour (snake (1).x + snakesize, snake (1).y + snakesize) = 0 %if the snake reaches the exit (detects the WHITE(whatdotcolour) exit point)
 
            then
 
        cls      %clears the screen for the scoring updates
 
 
        %scoring system (after each completed level)
 
        put "Your score is: ", score %score with out additional time bonus
 
        var bonus : int := 60000 div 1000 %1 min to get bonus (bonus = 60000 milliseconds = 60 seconds =1 min)
 
        var timeBonus : int := bonus - Time.Elapsed div 1000 %1 min timer (Time.Elapsed = 1000 milliseconds = 1 min)
 
        put "Your time bonus is: ", timeBonus %time bonus
 
        score := score + timeBonus %updated score = score as of to that point + time bonus
 
        put "Your overall score is: ", score %score as of to that point + time bonus
 
        put "[press enter to continue to next round]" %gives the user time to read the score
 
        Input.Pause %waits for a button to be pressed before entering the next level
 
              /*getch (ch)
 
         if ch =(KEY_ENTER)
 
         then*/
 
 
        %variable reset
 
        newMaxX := newMaxX - levelUpX %updated screen dimensions = screen dimensions - 50
 
        newMaxY := newMaxY - levelUpY %updated screen dimensions = screen dimensions - 40
 
        View.Set ("graphics:" + intstr (newMaxX) + ";" + intstr (newMaxY) + ",title:Uncle Worm           Score: " + intstr (score)) %displaying new screen dimensions and score
 
        new snake, 2 %set snake's length to 2
 
        snake (1).x := newMaxX div 2 %new x co-ords for the start of a new level
 
        snake (1).y := newMaxY div 2 %new y co-ords for the start of a new level
 
        colour (0) %reset the colour of any writing
 
        colourback (7) %reset the colour of the background
 
        cls %paints the background specified colour
 
        makeFood := true %makign it possible to draw food
 
        food %start redrawing food
 
          scoreLevel := score + 50 %next level will be completed after an additional 50 points
 
 
        
 
    end if
 
 
 
 
end loop
 
 
View.Update
 
  |