Code Sketch


yadnesh shahare made ai
By: Mhalsakant School
Category: Programming
// === MULTI-BAILGADA RACING WITH UNIQUE SPEEDS & WINNER LINE ===

cleari()
originBottomLeft()

class BailGada(val id: Int, val name: String, var x: Double, var y: Double, val isPlayer: Boolean, val aiSpeed: Double) {
    var velocity = 0.0
    var finished = false
    var finishRank = 0
}

var gameState = "COUNTDOWN"
var countdownTimer = 3.0
var nextRank = 1
var winnerName = ""
val finishLineX = 1150.0

// Pratyeka bailgadala veglivigli speed dili ahe (AI speed unique)
val racers = Array(
    new BailGada(1, "Tumcha Gada (Player)", 80.0, 100.0, true, 0.0),
    new BailGada(2, "Toofan Express", 80.0, 200.0, false, 1.8),
    new BailGada(3, "Bijlee Raja", 80.0, 300.0, false, 1.4),
    new BailGada(4, "Badshah", 80.0, 400.0, false, 1.6)
)

class RacingHost() {
    def drawRobot(canvas: CanvasDraw, x: Double, y: Double) {
        canvas.fill(220, 180, 100)
        canvas.stroke(80, 50, 20)
        canvas.strokeWeight(2)
        canvas.rect(x - 20, y - 40, 40, 30)

        canvas.fill(255, 100, 0)
        canvas.rect(x - 15, y - 52, 30, 12)

        canvas.fill(255, 255, 255)
        canvas.ellipse(x - 8, y - 25, 8, 8)
        canvas.ellipse(x + 8, y - 25, 8, 8)
        canvas.fill(0, 0, 0)
        canvas.ellipse(x - 8, y - 25, 3, 3)
        canvas.ellipse(x + 8, y - 25, 3, 3)

        canvas.fill(100, 70, 40)
        canvas.rect(x - 25, y - 10, 50, 45)

        canvas.fill(255, 255, 255, 240)
        canvas.stroke(0, 0, 0)
        canvas.rect(x + 35, y - 50, 330, 42)
        canvas.fill(0, 100, 0)
        canvas.text("Fast click kara ani tumcha gada vegne samor nya!", x + 42, y - 26)
    }
}

val racingHost = new RacingHost()

onMouseClick { (x, y) =>
    if (gameState == "RACING") {
        repeatFor(racers) { racer =>
            if (racer.isPlayer && !racer.finished) {
                racer.velocity += 4.5
                if (racer.velocity > 9.0) racer.velocity = 9.0
            }
        }
    }
}

def updateGame() {
    if (gameState == "COUNTDOWN") {
        countdownTimer -= 0.03
        if (countdownTimer <= 0) {
            gameState = "RACING"
        }
    } else if (gameState == "RACING") {
        var allFinished = true

        repeatFor(racers) { racer =>
            if (!racer.finished) {
                allFinished = false

                if (racer.isPlayer) {
                    racer.x += racer.velocity
                    if (racer.velocity > 0.5) {
                        racer.velocity *= 0.92
                    } else {
                        racer.velocity = 0.5
                    }
                } else {
                    // Pratyek AI gadachi speed vegli asnar
                    racer.x += racer.aiSpeed + (random(0, 1).toDouble * 0.4)
                }

                if (racer.x >= finishLineX) {
                    racer.finished = true
                    racer.finishRank = nextRank
                    if (nextRank == 1) {
                        winnerName = racer.name
                    }
                    nextRank += 1
                }
            }
        }

        if (allFinished) {
            gameState = "FINISHED"
        }
    }
}

def drawUltraDetailedBailGada(canvas: CanvasDraw, x: Double, y: Double, name: String, rank: Int, finished: Boolean) {
    canvas.fill(30, 15, 5, 120)
    canvas.noStroke()
    canvas.ellipse(x + 22, y - 18, 55, 18)
    canvas.ellipse(x + 22, y + 18, 55, 18)

    // Bulls
    canvas.fill(165, 105, 55)
    canvas.stroke(70, 40, 15)
    canvas.strokeWeight(1)
    canvas.ellipse(x + 42, y - 18, 40, 18)
    canvas.ellipse(x + 60, y - 25, 15, 14)
    canvas.stroke(30, 15, 5)
    canvas.strokeWeight(2)
    canvas.line(x + 63, y - 30, x + 70, y - 40)

    canvas.fill(165, 105, 55)
    canvas.stroke(70, 40, 15)
    canvas.strokeWeight(1)
    canvas.ellipse(x + 42, y + 18, 40, 18)
    canvas.ellipse(x + 60, y + 25, 15, 14)
    canvas.stroke(30, 15, 5)
    canvas.strokeWeight(2)
    canvas.line(x + 63, y + 30, x + 70, y + 40)

    // Cart & Driver
    canvas.fill(139, 69, 19)
    canvas.stroke(80, 40, 10)
    canvas.strokeWeight(2)
    canvas.rect(x - 22, y - 15, 32, 30)

    canvas.fill(90, 50, 20)
    canvas.stroke(40, 20, 10)
    canvas.strokeWeight(2)
    canvas.ellipse(x - 8, y, 34, 34)

    canvas.fill(240, 200, 140)
    canvas.noStroke()
    canvas.ellipse(x - 10, y, 13, 13)
    canvas.fill(255, 140, 0)
    canvas.rect(x - 16, y - 8, 12, 6)

    canvas.fill(255, 255, 255)
    canvas.text(name, x - 28, y - 35)

    if (finished) {
        val rankText = rank match {
            case 1 => "? 1st WINNER ?"
            case 2 => "2nd RUNNER-UP ?"
            case 3 => "3rd PLACE ?"
            case _ => s"${rank}th Rank"
        }
        canvas.fill(255, 215, 0)
        canvas.text(rankText, x - 28, y + 40)
    }
}

def viewState(canvas: CanvasDraw) {
    canvas.fill(150, 100, 50)
    canvas.noStroke()
    canvas.rect(0, 0, cwidth, cheight)

    canvas.stroke(120, 75, 30)
    canvas.strokeWeight(2)
    canvas.line(0, 150, cwidth, 150)
    canvas.line(0, 250, cwidth, 250)
    canvas.line(0, 350, cwidth, 350)

    // --- WINNING LINE / FINISH ARCH ---
    canvas.noStroke()
    canvas.fill(255, 255, 255)
    canvas.rect(finishLineX, 30, 22, cheight - 60)
    
    var cy = 35.0
    while (cy < cheight - 30) {
        canvas.fill(0, 0, 0)
        canvas.rect(finishLineX + 2, cy, 18, 10)
        cy += 20.0
    }

    canvas.fill(255, 215, 0)
    canvas.text("? FINAL WINNING LINE ?", finishLineX - 70, cheight - 30)

    repeatFor(racers) { racer =>
        drawUltraDetailedBailGada(canvas, racer.x, racer.y, racer.name, racer.finishRank, racer.finished)
    }

    racingHost.drawRobot(canvas, 80.0, cheight - 70.0)

    canvas.fill(255, 255, 255)
    canvas.text("BAILGADA RACING | Fast Click anywhere to race!", 20, cheight - 20)

    if (gameState == "COUNTDOWN") {
        canvas.fill(0, 0, 0, 190)
        canvas.rect(0, 0, cwidth, cheight)
        canvas.fill(255, 215, 0)
        val secNum = countdownTimer.toInt + 1
        canvas.text(s"SHRAYAT SURU HOTEY: $secNum", cwidth / 2.0 - 130, cheight / 2.0)
    }

    // --- WINNER ANNOUNCEMENT SCREEN ---
    if (gameState == "FINISHED") {
        canvas.fill(0, 100, 0, 235)
        canvas.rect(100, 80, cwidth - 200, cheight - 160)
        
        canvas.fill(255, 215, 0)
        canvas.text("? SHRAYAT PURN ZALI! ?", cwidth / 2.0 - 120, cheight - 130)
        
        canvas.fill(255, 255, 255)
        canvas.text(s"WINNING LINE WINNER: $winnerName", cwidth / 2.0 - 160, cheight / 2.0)
    }
}

animateWithCanvasDraw { canvas =>
    updateGame()
    viewState(canvas)
}