diff --git a/arena.rkt b/arena.rkt index 9b2c7c0..4e63218 100644 --- a/arena.rkt +++ b/arena.rkt @@ -4,12 +4,29 @@ (require "main.rkt" "players.rkt") -(define all-players (list player-random player-first player-last player-greedy player-nico player-generous)) +(define GAMES-PER-MATCH 100) + +(define results (make-hash)) + +(define all-players (list player-random player-first player-last player-greedy player-nico player-generous player-horizontal player-vertical)) (define matchups (append (combinations all-players 2) (map reverse (combinations all-players 2)) (for/list ([p all-players]) (list p p)))) -(define (arena) - (define matches (for/list ([m matchups]) - (start-game (first m) (second m) 6 6))) - (for ([m matches]) - (save-game! m (format "/tmp/games/~a Vs ~a.dbn" (player-name (first (GameState-players m))) (player-name (second (GameState-players m))))))) \ No newline at end of file +(for ([m matchups]) + (hash-set! results m 0) + (for ([i (in-range GAMES-PER-MATCH)]) + (define g (start-game (first m) (second m) 6 6)) + (define current (hash-ref results m)) + (hash-set! results m (if (> (first (GameState-scores g)) (second (GameState-scores g))) (+ current 1) current)) ; if p1 wins, increment the counter + (save-game! g (format "/tmp/games/~a vs ~a ~a.dbn" (player-name (first (GameState-players g))) (player-name (second (GameState-players g))) i)))) + +(print results) + +(define csv (open-output-file "/tmp/games/results.csv")) + +(display "Player 1,Player 2,P1 wins,P2 wins\n" csv) + +(for ([(k v) (in-hash results)]) + (display (format "~a,~a,~a,~a\n" (player-name (first k)) (player-name (last k)) v (- GAMES-PER-MATCH v)) csv)) + +(close-output-port csv) \ No newline at end of file diff --git a/players.rkt b/players.rkt index 10e36aa..c0eafa9 100644 --- a/players.rkt +++ b/players.rkt @@ -4,7 +4,7 @@ (require "main.rkt" racket/random) -(provide player-random player-first player-last player-greedy player-generous player-nico) +(provide player-random player-first player-last player-greedy player-generous player-nico player-horizontal player-vertical) ; a Player that plays random moves (define player-random @@ -87,6 +87,36 @@ [(not (empty? non-box-finishing-moves)) (let ([m (car (random-sample non-box-finishing-moves 1))]) (line (line-from m) (line-to m) n))] + [else + (let ([m (car (random-sample (valid-moves g) 1))]) + (line (line-from m) (line-to m) n))]))))) + +; prefers vertical moves. +(define player-vertical + (player + "Vertical" + (lambda (g n) + (let* ([moves (valid-moves g)] + [vertical-moves (filter (curry vertical?) moves)]) + (cond + [(not (empty? vertical-moves)) + (let ([m (car (random-sample vertical-moves 1))]) + (line (line-from m) (line-to m) n))] + [else + (let ([m (car (random-sample (valid-moves g) 1))]) + (line (line-from m) (line-to m) n))]))))) + +; prefers horizontal moves. +(define player-horizontal + (player + "Horizontal" + (lambda (g n) + (let* ([moves (valid-moves g)] + [horizontal-moves (filter (curry horizontal?) moves)]) + (cond + [(not (empty? horizontal-moves)) + (let ([m (car (random-sample horizontal-moves 1))]) + (line (line-from m) (line-to m) n))] [else (let ([m (car (random-sample (valid-moves g) 1))]) (line (line-from m) (line-to m) n))]))))) \ No newline at end of file