#lang racket (define game (GameState (grid '() 6 6) 0 '(0 0) (list (player "None" 0) (player "None" 0)))) (define g 0) (define w 6) (define h 6) (define t 0) (require "main.rkt" racket/gui) ; Line -> String ; Converts a line to a string for the list (define (line->string l) (format "~a : ~a,~a-~a,~a" (if (= (line-player l) 0) "R" "B") (point-x (line-from l)) (point-y (line-from l)) (point-x (line-to l)) (point-y (line-to l)))) (define (load-game-gui! ng) (set! game ng) (set! g (grid-lines (GameState-grid ng))) (set! w (grid-width (GameState-grid ng))) (set! h (grid-height (GameState-grid ng))) (set! t 0)) (load-game-gui! game) (define (status-label game) (format "~a vs ~a, ~a:~a" (player-name (first (GameState-players game))) (player-name (last (GameState-players game))) (first (GameState-scores game)) (last (GameState-scores game)))) (define frame (new frame% [label "DBN Viewer"] [width 300] [height 300])) (define menu-bar (new menu-bar% [parent frame])) (define file-menu (new menu% (label "&File") (parent menu-bar))) (new menu-item% [label "&Load"] [parent file-menu] [callback (lambda (m event) (let ([f (get-file "Load Game" #f #f #f ".dbn" '() '(("Dots and Boxes Notation" "*.dbn")))]) (if (eq? #f f) 0 (load-game-gui! (load-game! f))) (send grid-canvas refresh) (send log set (map line->string g)) (send score set-label (status-label game)) (set! t 0)))]) (define displaypanel (new horizontal-panel% [parent frame])) (define grid-canvas (new canvas% [parent displaypanel] [paint-callback (lambda (canvas dc) (send dc clear) (render-grid (grid (take g t) w h) dc))])) (define log (new list-box% [label ""] [parent displaypanel] [choices (map line->string g)] [callback (lambda (box event) (set! t (car (send box get-selections))) (send grid-canvas refresh))])) (define buttonpanel (new horizontal-panel% [parent frame] ; [alignment '(center center)] [stretchable-height #f] )) (define backbutton (new button% [parent buttonpanel] [label "back"] [callback (lambda (button state) (if (not (= t 0)) (set! t (sub1 t)) 0) (send log select (- t 1)) (send grid-canvas refresh))])) (define forwardbutton (new button% [parent buttonpanel] [label "forward"] [callback (lambda (button state) (if (not (= t (length g))) (set! t (add1 t)) 0) (send log select (- t 1)) (send grid-canvas refresh))])) (define score (new message% [parent buttonpanel] [label (status-label game)])) (send frame show #t)