1
0
Fork 0

Better but still slightly broken.

This commit is contained in:
Vivianne 2023-02-11 21:50:40 -08:00
parent 8ba7ea6a40
commit 03e2d615fc
1 changed files with 18 additions and 17 deletions

View File

@ -43,8 +43,10 @@
(define (^gib-gab-gobbler bcom initiator arg-peer)
(format #t "Creating gobbler\n")
(define my-board (selfish-spawn ^peer-board (if initiator "x" "o")))
(define peer-board (selfish-spawn ^peer-board (if initiator "o" "x")))
(define mark (if initiator "x" "o"))
(define peer-mark (if initiator "o" "x"))
(define board (selfish-spawn ^peer-board))
;; Move Receiver actor which receives moves from the peer.
(define (^move-receiver bcom)
@ -52,7 +54,7 @@
;; Receive the move from the peer.
[(exchange-move peer coords)
(format #t "exchange-move ~s\n" coords)
($ peer-board 'choose! coords)
($ board 'choose! coords peer-mark)
(move! peer)]))
(define receiver (spawn ^move-receiver))
@ -68,15 +70,13 @@
(format #t "begin move w ~s\n" peer)
(on (<- peer 'exchange-move receiver
(let ((move (prompt->move)))
($ my-board 'choose! move)
($ peer-board 'display)
($ board 'choose! move mark)
move))
;; get exchange
(lambda (peer-move)
;; Actually respond to the move
(format #t "Peer move ~s\n" peer-move)
($ my-board 'display)
($ peer-board 'choose! peer-move))))
($ board 'choose! peer-move peer-mark))))
;; Initial logic. If the peer is not set we wait until we receive it.
;; If we don't go first we also wait.
@ -92,23 +92,24 @@
;; Board logic
(define (^peer-board bcom self mark-char)
(define (^peer-board bcom self)
;; Define the array with unspecified values, then fill
(define arr (make-array *unspecified* ggg-size ggg-size))
(array-map! arr (lambda () (spawn ^mark)))
(methods
[(ref coords) (match coords ((x y) (array-ref arr x y)))]
[(chosen? coords) ($ ($ self 'ref coords) 'chosen?)]
[(choose! coords)
[(chosen? coords) (not (not ($ ($ self 'ref coords) 'get)))]
[(choose! coords mark-char)
(if ($ self 'chosen? coords)
(error "coords already chosen:" coords)
(begin
($ ($ self 'ref coords) 'choose!)
($ ($ self 'ref coords) 'choose! mark-char)
($ self 'display)))]
[(display)
(define (print-mark mark)
(if ($ mark 'chosen?) mark-char " "))
(let ((mark ($ mark 'get)))
(or mark " ")))
;; this is .. probably messy?
(array-slice-for-each-in-order
1
@ -117,10 +118,10 @@
(array->list x))
(format #t "\n")) arr)]))
(define* (^mark bcom #:optional [chosen #f])
(define* (^mark bcom #:optional [mark #f])
(methods
[(chosen?) chosen]
[(choose!)
(if chosen
[(get) mark]
[(choose! mark-char)
(if mark
(error "this mark is already chosen")
(bcom (^mark bcom #t)))]))
(bcom (^mark bcom mark-char)))]))