Source Code


;; title: num-gusser
;; version: 1.0.0
;; summary: A simple number guessing game
;; description: Players guess a number between 1 and 100 with limited attempts.

;; constants
(define-constant ERR_GAME_OVER (err u100))
(define-constant ERR_INVALID_GUESS (err u101))
(define-constant MAX_ATTEMPTS u10)

;; data vars
(define-data-var secret-number uint u0)
(define-data-var attempts-left uint u0)

;; public functions

(define-public (start-game)
    (begin
        ;; Generate a pseudo-random number based on block height
        ;; (mod burn-block-height 100) returns 0-99, so we add 1 to get 1-100
        (var-set secret-number (+ (mod burn-block-height u100) u1))
        (var-set attempts-left MAX_ATTEMPTS)
        (ok "Game started! Guess a number between 1 and 100.")
    )
)

(define-public (guess (user-guess uint))
    (let 
        (
            (current-attempts (var-get attempts-left))
            (secret (var-get secret-number))
        )
        (if (> current-attempts u0)
            (begin
                (var-set attempts-left (- current-attempts u1))
                (if (is-eq user-guess secret)
                    (ok "Correct! You win!")
                    (if (> user-guess secret)
                        (ok "Too High")
                        (ok "Too Low")
                    )
                )
            )
            ERR_GAME_OVER
        )
    )
)

;; read only functions

(define-read-only (get-state)
    (ok {
        attempts-left: (var-get attempts-left),
        ;; intended for debug/demo purposes only, usually wouldn't expose secret
        secret-debug: (var-get secret-number) 
    })
)

Functions (3)

FunctionAccessArgs
start-gamepublic
guesspublicuser-guess: uint
get-stateread-only