Implement a simple tic-tac-toe sample #16

Merged
BirDt merged 4 commits from feature/tic-tac-toe into master 2026-04-22 21:29:20 +08:00
2 changed files with 89 additions and 25 deletions
Showing only changes of commit 918f3ec873 - Show all commits

View file

@ -258,13 +258,19 @@
(assert ((conjoin integer? positive?) thickness)) (assert ((conjoin integer? positive?) thickness))
(assert (boolean? filled)) (assert (boolean? filled))
(assert (color? color)) (assert (color? color))
(when filled (if filled
(draw-rectangle (draw-rectangle
(number->integer (v-x pos-vec)) (number->integer (v-x pos-vec))
(number->integer (v-y pos-vec)) (number->integer (v-y pos-vec))
width width
height height
(use-color color)))) (use-color color))
(draw-rectangle-lines
(number->integer (v-x pos-vec))
(number->integer (v-y pos-vec))
width
height
(use-color color))))
(define (draw-text-2d pos-vec text size tint) (define (draw-text-2d pos-vec text size tint)
(assert (vec2? pos-vec)) (assert (vec2? pos-vec))
@ -276,4 +282,4 @@
(number->integer (v-y pos-vec)) (number->integer (v-y pos-vec))
size size
(use-color tint))) (use-color tint)))
) )

View file

@ -85,25 +85,83 @@
((button-on-click btn))))) ((button-on-click btn)))))
buttons))))) buttons)))))
(define grid '((0 0 0)
(0 0 0)
(0 0 0)))
(define turn 'player) ;; Either 'player or 'bot
(define grid-square-size (vec 150 150))
(define padding (vec 50 50))
(define draw-grid-squares
(make-system
'draw-grid-squares
0
'entity
'(<screen-transform> <grid-square>)
(lambda (_ transform sq)
(let ((check (list-ref (list-ref grid (g-y sq)) (g-x sq))))
(push-render-object 'screen
0
(lambda ()
(draw-text-2d
(v+ (v/ grid-square-size 4) (position transform))
(cond
((= check 1) "X")
((= check 2) "O")
(else ""))
64
(make-color 0 0 0 1))))))))
(define-record-type <grid-square>
(make-g-s x y)
grid-square?
(x g-x)
(y g-y))
(define (make-grid-square x y)
(entity
(make-g-s x y)
(make-screen-transform
(v+ padding (v* (vec x y) grid-square-size))
(vec 0 0)
0
(vec 1 1)
'center
'())
(make-visual-2d
(make-rectangle-2d
(vec 0 0)
(v-x grid-square-size)
(v-y grid-square-size)
#f
10)
(make-color 0 0 0 1)
0)
(make-button-region
(vec 0 0)
grid-square-size
(lambda ()
(set! (list-ref (list-ref grid y) x) (+ 1 (list-ref (list-ref grid y) x)))))))
(define (game) (define (game)
(scene (scene
draw-text-entities draw-rectangles
draw-grid-squares
(entity click-buttons
(make-screen-transform push-actions
(vec 350 250)
(vec 0 0) (make-grid-square 0 0)
0 (make-grid-square 1 0)
(vec 1 1) (make-grid-square 2 0)
'center (make-grid-square 0 1)
'()) (make-grid-square 1 1)
(make-visual-2d (make-grid-square 2 1)
(make-text-2d (make-grid-square 0 2)
(vec 0 0) (make-grid-square 1 2)
"You lost the game!" (make-grid-square 2 2)))
12)
(make-color 0 0 0 1)
0))))
(define (main-menu) (define (main-menu)
(scene (scene