Code Sketch


kojp
By: Mhalsakant School
Category: Programming
// =====================================================
//        ? TURTLE EXTREME PUZZLE PRO
//        TIMER + SCORE + SOUND + WIN + RESET
// =====================================================

val fdStep = 50
val fdStep2 = 10
val rtStep = 90
val rtStep2 = 10

val bgColor = white

clear()
clearOutput()
beamsOn()

val width = canvasBounds.width
val height = canvasBounds.height

setBackground(bgColor)
setSpeed(fast)

// =====================================================
// SOUND
// =====================================================

val soundDir = "https://kojofiles.netlify.app/hunted7"

preloadMp3(s"$soundDir/DrumBeats.mp3")
preloadMp3(s"$soundDir/Cave.mp3")

// Background music
playMp3Loop(s"$soundDir/Cave.mp3")

// =====================================================
// GAME VARIABLES
// =====================================================

var moves = 0
var seconds = 0
var score = 1000

var started = false
var finished = false

// =====================================================
// PUZZLE PATH
// =====================================================

val path = Seq(
    "F","F","R","F","F","L",
    "F","R","F","F","R","F",
    "L","F","F","L","F","R",
    "F","F","R","F","L","F",
    "R","F","F","L","F","R",
    "F","F","L","F"
)

// =====================================================
// DRAW COMPLETE PUZZLE
// =====================================================

def drawPuzzle() {

    // BLUE CORRECT LINE
    setPenColor(blue)
    setPenThickness(8)

    setPosition(-400, -250)
    setHeading(0)

    // -------------------------------
    // BIG PUZZLE
    // -------------------------------

    forward(100)
    right(90)

    forward(100)
    left(90)

    forward(100)
    right(90)

    forward(100)
    forward(100)
    left(90)

    forward(100)
    right(90)

    forward(100)
    forward(100)
    right(90)

    forward(100)
    left(90)

    forward(100)
    forward(100)
    left(90)

    forward(100)
    right(90)

    forward(100)
    forward(100)
    right(90)

    forward(100)
    left(90)

    forward(100)
    right(90)

    forward(100)
    forward(100)
    left(90)

    forward(100)
    right(90)

    forward(100)

    // =================================================
    // GOAL
    // =================================================

    setPenColor(red)
    setPenThickness(16)

    forward(40)

    // =================================================
    // START
    // =================================================

    setPenColor(green)
    setPenThickness(16)

    setPosition(-400, -250)
    setHeading(0)

    forward(40)

    // =================================================
    // DEAD-END PATHS
    // =================================================

    setPenColor(gray)
    setPenThickness(5)

    // Dead end 1
    setPosition(-300, -250)
    setHeading(90)
    forward(60)

    // Dead end 2
    setPosition(-200, -150)
    setHeading(270)
    forward(60)

    // Dead end 3
    setPosition(-100, -150)
    setHeading(90)
    forward(60)

    // Dead end 4
    setPosition(100, -50)
    setHeading(270)
    forward(60)

    // Dead end 5
    setPosition(200, 50)
    setHeading(90)
    forward(60)

    // Dead end 6
    setPosition(300, 100)
    setHeading(270)
    forward(60)

    // =================================================
    // TURTLE BACK TO START
    // =================================================

    setPenColor(purple)
    setPenThickness(5)

    setPosition(-400, -250)
    setHeading(0)
}

// =====================================================
// SOUND EFFECT
// =====================================================

def soundEffect() {

    if (!isMp3Playing) {
        playMp3(s"$soundDir/DrumBeats.mp3")
    }
}

// =====================================================
// SCORE
// =====================================================

def updateScore() {

    score = 1000 -
            (moves * 10) -
            (seconds * 2)

    if (score < 0) {
        score = 0
    }
}

// =====================================================
// DISPLAY STATUS
// =====================================================

def showStatus() {

    updateScore()

    println(
        "? MOVES = " +
        moves +
        " | ? TIME = " +
        seconds +
        " | ? SCORE = " +
        score
    )
}

// =====================================================
// FORWARD
// =====================================================

def moveForward() {

    if (!finished) {

        started = true

        forward(fdStep)

        moves = moves + 1

        soundEffect()

        showStatus()

        checkWin()
    }
}

// =====================================================
// RIGHT
// =====================================================

def moveRight() {

    if (!finished) {

        started = true

        right(rtStep)

        moves = moves + 1

        soundEffect()

        showStatus()

        checkWin()
    }
}

// =====================================================
// LEFT
// =====================================================

def moveLeft() {

    if (!finished) {

        started = true

        left(rtStep)

        moves = moves + 1

        soundEffect()

        showStatus()

        checkWin()
    }
}

// =====================================================
// WIN
// =====================================================

def checkWin() {

    // Puzzle completion
    if (moves >= path.length) {

        finished = true
        started = false

        stopMp3()

        println("")
        println("======================================")
        println("          ?? YOU WIN! ??")
        println("======================================")
        println("")
        println("? GOAL REACHED!")
        println("")
        println("? MOVES  = " + moves)
        println("? TIME   = " + seconds + " seconds")
        println("? SCORE  = " + score)
        println("")
        println("? AMAZING!")
        println("======================================")
    }
}

// =====================================================
// RESET
// =====================================================

def resetGame() {

    stopMp3()

    clear()
    clearOutput()
    beamsOn()

    setBackground(bgColor)
    setSpeed(fast)

    moves = 0
    seconds = 0
    score = 1000

    started = false
    finished = false

    drawPuzzle()

    draw(panel)

    playMp3Loop(s"$soundDir/Cave.mp3")

    println("")
    println("======================================")
    println("       ? PUZZLE READY!")
    println("======================================")
    println("")
    println("? GREEN = START")
    println("? BLUE  = CORRECT PATH")
    println("? GRAY  = DEAD END")
    println("? RED   = GOAL")
    println("")
    println("FORWARD ? ????")
    println("RIGHT   ? ???????")
    println("LEFT    ? ???????")
    println("")
    println("? TIMER STARTS WITH FIRST MOVE")
    println("? START SCORE = 1000")
    println("======================================")
}

// =====================================================
// BUTTONS
// =====================================================

val leftButton =
    Picture.button("? LEFT") {
        moveLeft()
    }

val forwardButton =
    Picture.button("? FORWARD") {
        moveForward()
    }

val rightButton =
    Picture.button("RIGHT ?") {
        moveRight()
    }

val resetButton =
    Picture.button("? RESET") {
        resetGame()
    }

// =====================================================
// CONTROL PANEL
// =====================================================

val panel =
    trans(-width / 2, -height / 2) *
    scale(1.35) ->
    VPics(

        HPics(
            leftButton,
            forwardButton,
            rightButton
        ),

        HPics(
            resetButton
        )
    )

// =====================================================
// TIMER
// =====================================================

timer(1000) {

    if (started && !finished) {

        seconds = seconds + 1

        updateScore()

        println(
            "? TIME = " +
            seconds +
            " sec | MOVES = " +
            moves +
            " | ? SCORE = " +
            score
        )
    }
}

// =====================================================
// INITIAL DRAW
// =====================================================

drawPuzzle()

draw(panel)

// =====================================================
// START MESSAGE
// =====================================================

println("")
println("==============================================")
println("       ? TURTLE EXTREME PUZZLE PRO")
println("==============================================")
println("")
println("? START")
println("? BLUE LINE = FOLLOW")
println("? GRAY = DEAD END")
println("? RED = GOAL")
println("")
println("CONTROLS")
println("----------------------------------------------")
println("? FORWARD = ???? ??")
println("? RIGHT   = 90� ??????? ??")
println("? LEFT    = 90� ??????? ??")
println("")
println("? TIMER")
println("? SCORE")
println("? SOUND")
println("? RESET")
println("? WINNER")
println("")
println("==============================================")