From 8d12489acb3e60ba16ac77f98af40ee968f8b689 Mon Sep 17 00:00:00 2001 From: nihilazo Date: Thu, 7 Apr 2022 21:03:18 +0100 Subject: [PATCH] make gui even hackier but now I can load game logs in it. This is intended to be the limit to GUI functions. It's just a viewer. I hope it stays that way, I'm going to work on players now. --- gui.rkt | 142 +++++++++++++++++++++++++++++++++---------------------- main.rkt | 6 +++ 2 files changed, 92 insertions(+), 56 deletions(-) diff --git a/gui.rkt b/gui.rkt index d33a0bc..b14be1e 100644 --- a/gui.rkt +++ b/gui.rkt @@ -1,5 +1,11 @@ #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 @@ -12,61 +18,85 @@ (point-x (line-to l)) (point-y (line-to l)))) -; GameState -; opens a window to analyse game. -(define (analysis-gui game) - - ; Make a frame by instantiating the frame% class - (define g (grid-lines (GameState-grid game))) - (define w (grid-width (GameState-grid game))) - (define h (grid-height (GameState-grid game))) - (define t 0) - (define frame (new frame% - [label "Game Analysis"] - [width 300] - [height 300])) - - (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 (format "Final Score: R: ~a, B: ~a" (first (GameState-scores game)) (last (GameState-scores game)))])) - (send frame show #t)) +(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)) -(define g (load-game! "/tmp/test.dbn")) -(analysis-gui g) \ No newline at end of file +(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" '() '(("*.dbn" "Dots and Boxes Notation")))]) + (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) diff --git a/main.rkt b/main.rkt index dec256c..df107cb 100644 --- a/main.rkt +++ b/main.rkt @@ -203,6 +203,12 @@ (if box p (abs (- p 1))) (if box (list-set scores p (+ boxes (list-ref scores p))) scores) (GameState-players s))))]))) +; player player Number Number -> GameState +; convenience function for play-game. +; numbers are grid dimensions +(define (start-game p1 p2 grid1 grid2) + (play-game (GameState (grid '() grid1 grid2) 0 '(0 0) (list p1 p2)))) + ; Grid -> Image ; renders grid to an image for showing humans the game. (define (render-grid-bitmap g)