Code Sketch
alok
Category: Programming
import scala.collection.mutable.ArrayBuffer
clear()
originBottomLeft()
// ============================================================
// STOP THE SECONDS - MULTI-TARGET & LEADERBOARD EDITION
// ============================================================
case class PlayerRecord(id: String, var score: Int, var lastTime: Double, var targetUsed: Double)
val allPlayers = ArrayBuffer.empty[PlayerRecord]
var currentPlayerId: String = ""
var activePlayerIndex: Int = -1
var currentStage = 0 // 0: ID Create, 1: Target Selection, 2: Game Play, 3: Leaderboard
// ????????? ????? ??????? (????????????)
val targetOptions = ArrayBuffer(3.0, 5.0, 7.0, 10.0, 15.0)
var selectedTargetIndex: Int = 1 // ??????? 5.0 ?????
var targetTime: Double = targetOptions(selectedTargetIndex)
// ??? ???????????
var startTime: Long = 0L
var elapsedTime: Double = 0.0
var isTimerRunning: Boolean = false
// ????? ??????? ??? ????? ???
animateWithState(0.0) { angle =>
erasePictures()
// ?????????? ???
setBackground(Color(15, 25, 45))
if (currentStage == 0) {
// --- ????? 0: ???? ???? (???) ???? ???? ---
val title = Picture.text("ENTER YOUR PLAYER ID / NAME", 22)
title.setPenColor(Color(255, 215, 0))
title.setPosition(cwidth / 2.0 - 180, cheight - 100)
draw(title)
val nameBox = Picture.text(if (currentPlayerId.isEmpty) "_ (Type & Press Enter)" else s"ID: $currentPlayerId", 20)
nameBox.setPenColor(Color(0, 255, 127))
nameBox.setPosition(cwidth / 2.0 - 150, cheight - 160)
draw(nameBox)
val hint = Picture.text("Type your name using keyboard, then press ENTER", 14)
hint.setPenColor(Color(200, 230, 255))
hint.setPosition(cwidth / 2.0 - 180, 80)
draw(hint)
} else if (currentStage == 1) {
// --- ????? 1: ??????? ??????? ??????? (Target Selection) ---
val heading = Picture.text(s"SELECT YOUR TARGET TIME, $currentPlayerId", 18)
heading.setPenColor(Color(255, 220, 100))
heading.setPosition(cwidth / 2.0 - 180, cheight - 60)
draw(heading)
var yPos = cheight - 120
var idx = 0
targetOptions.foreach { t =>
val prefix = if (idx == selectedTargetIndex) "--> [ " else " "
val suffix = if (idx == selectedTargetIndex) " ] <--" else " "
val tText = Picture.text(s"$prefix Target: $t.00 Seconds $suffix", 16)
tText.setPenColor(if (idx == selectedTargetIndex) Color(0, 255, 127) else Color(255, 255, 255))
tText.setPosition(cwidth / 2.0 - 160, yPos)
draw(tText)
yPos -= 35
idx += 1
}
val guide = Picture.text("Use W / S (or Arrow keys) to change target, ENTER to Start Game!", 14)
guide.setPenColor(Color(255, 180, 50))
guide.setPosition(cwidth / 2.0 - 220, 50)
draw(guide)
} else if (currentStage == 2) {
// --- ????? 2: ????? ??? ???? ---
if (isTimerRunning) {
val currentMillis = System.currentTimeMillis()
elapsedTime = (currentMillis - startTime) / 1000.0
}
val timeDisplay = Picture.text(f"$elapsedTime%2.2f s", 36)
timeDisplay.setPenColor(if (isTimerRunning) Color(0, 255, 127) else Color(255, 100, 100))
timeDisplay.setPosition(cwidth / 2.0 - 65, cheight / 2.0 + 10)
draw(timeDisplay)
val infoText = Picture.text(s"Player: $currentPlayerId | Target: $targetTime s", 16)
infoText.setPenColor(Color(255, 220, 100))
infoText.setPosition(50, cheight - 50)
draw(infoText)
val hintText = Picture.text("Press SPACEBAR to Start/Stop | T: Change Target | L: Leaderboard", 14)
hintText.setPenColor(Color(200, 230, 255))
hintText.setPosition(50, cheight - 80)
draw(hintText)
} else {
// --- ????? 3: ????????? (???? ????, ????? ??? ??????? ??????) ---
val lbTitle = Picture.text("=== ALL PLAYERS LEADERBOARD ===", 20)
lbTitle.setPenColor(Color(255, 215, 0))
lbTitle.setPosition(cwidth / 2.0 - 170, cheight - 60)
draw(lbTitle)
var yOffset = cheight - 120
var rank = 1
allPlayers.foreach { p =>
val pInfo = Picture.text(s"$rank. ID: ${p.id} | Score: ${p.score} | Time: ${p.lastTime}%2.2f s (Target: ${p.targetUsed}s)", 13)
pInfo.setPenColor(Color(255, 255, 255))
pInfo.setPosition(40, yOffset)
draw(pInfo)
yOffset -= 28
rank += 1
}
val backHint = Picture.text("Press N: New ID | R: Back to Game", 14)
backHint.setPenColor(Color(100, 255, 200))
backHint.setPosition(cwidth / 2.0 - 150, 40)
draw(backHint)
}
angle + 1.0
}
// ??????? ?????????
onKeyPress { k =>
if (currentStage == 0) {
// ??? ???? ????
if (k == '\n' || k == '\r') {
if (currentPlayerId.nonEmpty) {
val newPlayer = PlayerRecord(currentPlayerId, 0, 0.0, targetTime)
allPlayers.append(newPlayer)
activePlayerIndex = allPlayers.length - 1
currentStage = 1 // ??????? ????????? ????????? ????
}
} else if (k == '\b' || k == 127) {
if (currentPlayerId.nonEmpty) currentPlayerId = currentPlayerId.dropRight(1)
} else if (k >= ' ' && k <= '~') {
currentPlayerId += k
}
} else if (currentStage == 1) {
// ??????? ?????? (W ?? ??????????, S ???? ??????????)
if (k == 'w' || k == 'W') {
if (selectedTargetIndex > 0) selectedTargetIndex -= 1
targetTime = targetOptions(selectedTargetIndex)
} else if (k == 's' || k == 'S') {
if (selectedTargetIndex < targetOptions.length - 1) selectedTargetIndex += 1
targetTime = targetOptions(selectedTargetIndex)
} else if (k == '\n' || k == '\r') {
// ??????? ??????? ???? ??? ???? ????
if (activePlayerIndex >= 0) {
allPlayers(activePlayerIndex).targetUsed = targetTime
}
currentStage = 2
}
} else if (currentStage == 2) {
// ??? ???? ?????????
if (k == ' ') {
if (!isTimerRunning) {
startTime = System.currentTimeMillis()
isTimerRunning = true
} else {
isTimerRunning = false
val diff = Math.abs(elapsedTime - targetTime)
// ???? ????????? ?????? ??????
if (diff <= 0.20 && activePlayerIndex >= 0) {
allPlayers(activePlayerIndex).score += 15
}
if (activePlayerIndex >= 0) {
allPlayers(activePlayerIndex).lastTime = elapsedTime
allPlayers(activePlayerIndex).targetUsed = targetTime
}
}
} else if (k == 't' || k == 'T') {
currentStage = 1 // ??? ??????? ??????????? ????????? ??????????
} else if (k == 'l' || k == 'L') {
currentStage = 3 // ????????? ???????????
} else if (k == 'r' || k == 'R') {
isTimerRunning = false
elapsedTime = 0.0
}
} else if (currentStage == 3) {
if (k == 'n' || k == 'N') {
currentPlayerId = ""
currentStage = 0 // ???? ???? ???????????
} else if (k == 'r' || k == 'R') {
currentStage = 2 // ??? ????????? ??? ??????????
}
}
}
println("=== MULTI-TARGET SECONDS GAME LOADED SUCCESSFULLY ===")aa