/client.rkt

http://github.com/ekelly/Dice-Wars · Racket · 160 lines · 138 code · 16 blank · 6 comment · 11 complexity · ed2435df5798a7f6c6a3fa995003a28e MD5 · raw file

  1. #lang class5
  2. (require class5/universe)
  3. (require 2htdp/image)
  4. (require (only-in racket begin write))
  5. (define BOARD-SCALE 100)
  6. (define WIDTH 7)
  7. (define HEIGHT 5)
  8. (define colors (list "purple" "blue" "green" "red" "yellow"
  9. "pink" "orange" "teal" "lightblue" "violet"))
  10. (define sample-board
  11. '((1 ((0 2) (0 3) (1 2) (1 3)))
  12. (2 ((0 0) (0 1)))
  13. (2 ((1 4) (2 4) (2 3)))
  14. (1 ((2 0) (3 0) (4 0) (5 0) (5 1)))
  15. (1 ((1 1) (2 1) (2 2) (3 2)))
  16. (2 ((3 3) (4 3) (4 2) (5 2) (6 2)))
  17. (2 ((6 0) (6 1)))
  18. (1 ((4 4) (5 4) (5 3) (6 4) (6 3)))))
  19. (define sample-serial
  20. '(((0 "Eric") (1 "Francis"))
  21. (((1 2 4) (0 "Eric") 1)
  22. ((0 4) (1 "Francis") 1)
  23. ((0 4 5) (1 "Francis") 1)
  24. ((4 5 6) (0 "Eric") 3)
  25. ((0 1 2 3 5) (0 "Eric") 3)
  26. ((2 3 4 6 7) (1 "Francis") 2)
  27. ((3 5) (1 "Francis") 1)
  28. ((5) (0 "Eric") 1))))
  29. (define-class client%
  30. (fields name id serialboard boardrep aroll droll)
  31. (define/public (on-receive msg)
  32. ; s-expression message from the server
  33. (cond [(and (symbol? msg)
  34. (symbol=? msg 'turn)) empty ] ; stuff
  35. [(and (symbol? msg)
  36. (symbol=? msg 'illegal))
  37. this]
  38. [(and (symbol? msg)
  39. (symbol=? msg 'error))
  40. this]
  41. [(symbol=? (first msg) 'attack) empty ] ; stuff
  42. [(symbol=? (first msg) 'new-state)
  43. (client% (field name) (field id)
  44. (second msg) (field boardrep)
  45. empty empty)]
  46. [(symbol=? (first msg) 'start)
  47. (client% "" (second msg)
  48. (third msg) (fourth msg)
  49. empty empty)]))
  50. ; Number Number MouseEvent -> Package
  51. (define/public (on-mouse x y m)
  52. this)
  53. (define/public (grid->pixel g)
  54. (* BOARD-SCALE (+ 1/2 g)))
  55. (define/public (outline-top gridr lobp bpos)
  56. (if (ormap (λ (g) (= (sub1 (second bpos))
  57. (second g)))
  58. lobp)
  59. gridr
  60. (add-line gridr
  61. (* BOARD-SCALE (first bpos))
  62. (* BOARD-SCALE (second bpos))
  63. (+ BOARD-SCALE (* BOARD-SCALE (first bpos)))
  64. (* BOARD-SCALE (second bpos))
  65. "black")))
  66. (define/public (outline-left gridr lobp bpos)
  67. (if (ormap (λ (g) (= (sub1 (first bpos))
  68. (first g)))
  69. lobp)
  70. gridr
  71. (add-line gridr
  72. (* BOARD-SCALE (first bpos))
  73. (* BOARD-SCALE (second bpos))
  74. (* BOARD-SCALE (first bpos))
  75. (+ BOARD-SCALE (* BOARD-SCALE (second bpos)))
  76. "black")))
  77. (define/public (outline-right gridr lobp bpos)
  78. (if (ormap (λ (g) (= (add1 (first bpos))
  79. (first g)))
  80. lobp)
  81. gridr
  82. (add-line gridr
  83. (+ BOARD-SCALE (* BOARD-SCALE (first bpos)))
  84. (* BOARD-SCALE (second bpos))
  85. (+ BOARD-SCALE (* BOARD-SCALE (first bpos)))
  86. (+ BOARD-SCALE (* BOARD-SCALE (second bpos)))
  87. "black")))
  88. (define/public (outline-bottom gridr lobp bpos)
  89. (if (ormap (λ (g) (= (add1 (second bpos))
  90. (second g)))
  91. lobp)
  92. gridr
  93. (add-line gridr
  94. (* BOARD-SCALE (first bpos))
  95. (+ BOARD-SCALE (* BOARD-SCALE (second bpos)))
  96. (+ BOARD-SCALE (* BOARD-SCALE (first bpos)))
  97. (+ BOARD-SCALE (* BOARD-SCALE (second bpos)))
  98. "black")))
  99. ; Scene [Listof BPosn] BPosn
  100. ; Outlines the given BPosn given its neighbors
  101. (define/public (outline gridr lobp bpos)
  102. (outline-top
  103. (outline-bottom
  104. (outline-left
  105. (outline-right gridr lobp bpos)
  106. lobp bpos) lobp bpos) lobp bpos))
  107. (define/public (list-pos lst p)
  108. (local [(define (lp-helper lst p counter)
  109. (cond [(empty? lst) -1]
  110. [(equal? p (first lst)) counter]
  111. [else (lp-helper (rest lst) p (add1 counter))]))]
  112. (lp-helper lst p 0)))
  113. ; [Listof BPosn] Scene Color -> Scene
  114. ; Draws the region (listof bposn) onto the scene
  115. (define/public (draw-region lobp s color)
  116. (foldr
  117. (λ (r s)
  118. (outline
  119. (place-image
  120. (rectangle BOARD-SCALE
  121. BOARD-SCALE
  122. "solid" color)
  123. (grid->pixel (first r))
  124. (grid->pixel (second r)) s)
  125. lobp r))
  126. s lobp))
  127. (define/public (to-draw)
  128. (foldr (λ (i s) (overlay/xy
  129. (text (number->string
  130. (third
  131. (list-ref
  132. (second (field serialboard))
  133. (list-pos (field boardrep) i))))
  134. 24 "black")
  135. (* -1 (grid->pixel (first (first (second i)))))
  136. (* -1 (grid->pixel (second (first (second i)))))
  137. (place-image
  138. (draw-region (cadr i) s (list-ref colors (first i)))
  139. (/ (* BOARD-SCALE WIDTH) 2)
  140. (/ (* BOARD-SCALE HEIGHT) 2) s)))
  141. (empty-scene (* BOARD-SCALE WIDTH) (* BOARD-SCALE HEIGHT))
  142. (field boardrep))))
  143. (define base-client (client% "" empty sample-serial sample-board empty empty))
  144. (big-bang base-client)