forked from vv/gib-gab-gob
Better but still slightly broken.
This commit is contained in:
parent
8ba7ea6a40
commit
03e2d615fc
|
@ -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)))]))
|
||||
|
|
Loading…
Reference in New Issue