Code Sketch


alok
By: Mhalsakant School
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