Code Sketch
kojp
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("==============================================")