Advertisement
Guest User

Untitled

a guest
Jan 12th, 2019
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Global sw = 800
  2. Global sh = 800
  3. Global w = sw/8
  4. Global h = sh/8
  5. Global mode = 0
  6. Global si = -1
  7. Global sj = -1
  8. Global turn = 1
  9. Graphics sw, sh
  10.  
  11. Dim board(8,8)
  12. Dim pieces(8,8)
  13.  
  14. Dim dests(8,8)
  15. Dim caps(8,8)
  16.  
  17. reset_dests()
  18. reset_caps()
  19.  
  20. For j = 0 To 7
  21.     For i = 0 To 7
  22.         board(i,j) = (i+j) Mod 2
  23.     Next
  24. Next
  25.  
  26. For x = 0 To 3
  27.     ;pieces(2*x+1,0) =  1
  28.     ;pieces(2*x  ,1) =  1
  29.     pieces(2*x+1,2) =  2
  30.     pieces(2*x  ,5) = -2
  31.     ;pieces(2*x+1,6) = -1
  32.     ;pieces(2*x  ,7) = -1
  33. Next
  34.  
  35. SetBuffer BackBuffer()
  36. While Not KeyHit(1)
  37. Cls
  38.  
  39. drawboard()
  40.  
  41. If check_win() Then
  42.  
  43.     Color 255,255,255
  44.  
  45.     Text sw/2, sh/2, "PLAYER " + (1+(turn+1)/2) + " WINS!", 300
  46.  
  47. Else
  48.  
  49. highlight()              ; square border hover
  50. highlight_selection()    ; men/kings border hover
  51.  
  52. If mode <> 2 Then
  53.     compute_dests()     ; legal moves (1 distance)
  54. End If
  55. compute_caps()
  56. highlight_destinations() ; show them (differently for men and kings)
  57.  
  58. click()                  ; game action
  59.  
  60. End If
  61.  
  62. Flip
  63. WaitEvent() ; avoid busylooping
  64. Wend
  65.  
  66. Function drawboard()
  67. Local t = h/12
  68. For i = 0 To 7
  69.     For j = 0 To 7
  70.         ; draw square
  71.         Color board(i,j)*255,0,0
  72.         Rect i*w, j*h, w, h
  73.         ; draw checker
  74.         If pieces(i,j) <> 0 Then
  75.             checker(i,j)
  76.         End If
  77.     Next
  78. Next
  79. End Function
  80.  
  81. Function highlight()
  82. i = MouseX() / w
  83. j = MouseY() / h
  84. Color 255, 255, 0
  85. If pieces(i,j) <> 0 Then
  86.     Oval i*w, j*h, w, h, 0
  87. Else
  88.     Rect i*w, j*h, w, h, 0
  89. End If
  90. End Function
  91.  
  92. Function highlight_selection()
  93. If si >= 0 And sj >= 0 Then
  94.     Color 0,255,0
  95.     Oval si*w, sj*h, w, h, 0
  96. End If
  97. End Function
  98.  
  99. Function highlight_destinations()
  100. For j = 0 To 7
  101. For i = 0 To 7
  102. If dests(i,j) <> 0 Then
  103.     Select Abs(dests(i,j))
  104.     Case 2
  105.         Color 110,110,210
  106.         Oval i*w, j*h, w, h
  107.         Color 140,140,240
  108.         Oval i*w+(0.2*w), j*h+(0.2*h), w*0.6, h*0.6
  109.     Case 1
  110.         Color 110,110,210
  111.         Oval i*w, j*h, w, h
  112.     End Select
  113. End If
  114. If caps(i,j) <> 0 Then
  115.     Select Abs(caps(i,j))
  116.     Case 2
  117.         Color 110,110,210
  118.         Oval i*w, j*h, w, h
  119.         Color 140,140,240
  120.         Oval i*w+(0.2*w), j*h+(0.2*h), w*0.6, h*0.6
  121.     Case 1
  122.         Color 110,110,210
  123.         Oval i*w, j*h, w, h
  124.     End Select
  125. End If
  126. Next
  127. Next
  128. End Function
  129.  
  130. Function has_dests(i,j)
  131. Local savei = si
  132. Local savej = sj
  133. si = i
  134. sj = j
  135. compute_dests()
  136. Local has = False
  137. For j = 0 To 7
  138. For i = 0 To 7
  139.     has = has Or dests(i,j) <> 0
  140. Next
  141. Next
  142. si = savei
  143. sj = savej
  144. Return has
  145. End Function
  146.  
  147. Function compute_dests()
  148. If si >= 0 And sj >= 0 Then
  149.     Select Abs(pieces(si,sj))
  150.     Case 2
  151.         For i1 = si-1 To si+1 Step 2
  152.         For j1 = sj-1 To sj+1 Step 2
  153.             If i1 >= 0 And i1 <= 7 And j1 >= 0 And j1 <= 7 Then
  154.             If pieces(i1,j1) = 0 Then
  155.                 dests(i1,j1) = pieces(si,sj)
  156.             End If
  157.             End If
  158.         Next
  159.         Next
  160.     Case 1
  161.         For i1 = si-1 To si+1 Step 2
  162.             j1 = sj+pieces(si,sj)
  163.             If i1 >= 0 And i1 <= 7 And j1 >= 0 And j1 <= 7 Then
  164.             If pieces(i1,j1) = 0 Then
  165.                 dests(i1,j1) = pieces(si,sj)
  166.             End If
  167.             End If
  168.         Next
  169.     End Select
  170. End If
  171. End Function
  172.  
  173. Function reset_dests()
  174. For j = 0 To 7
  175. For i = 0 To 7
  176. dests(i,j) = 0
  177. Next
  178. Next
  179. End Function
  180.  
  181. Function has_caps(i,j)
  182. Local savei = si
  183. Local savej = sj
  184. si = i
  185. sj = j
  186. compute_caps()
  187. Local has = False
  188. For j = 0 To 7
  189. For i = 0 To 7
  190.     has = has Or caps(i,j) <> 0
  191. Next
  192. Next
  193. si = savei
  194. sj = savej
  195. Return has
  196. End Function
  197.  
  198. Function compute_caps()
  199. If si >= 0 And sj >= 0 Then
  200.     reset_caps()
  201.     Select Abs(pieces(si,sj))
  202.     Case 2
  203.         For i1 = si-1 To si+1 Step 2
  204.         For j1 = sj-1 To sj+1 Step 2
  205.             If i1 >= 0 And i1 <= 7 And j1 >= 0 And j1 <= 7 Then
  206.             If Sgn(pieces(i1,j1)) = -Sgn(pieces(si,sj)) Then
  207.                 j2 = j1+(j1-sj)
  208.                 i2 = i1+(i1-si)
  209.                 Print "i1 j1"
  210.                 Print i1 + " " + j1
  211.                 If i2 >= 0 And i2 <= 7 And j2 >= 0 And j2 <= 7 Then
  212.                     If pieces(i2,j2) = 0 Then
  213.                         caps(i2,j2) = pieces(si,sj)
  214.                     End If
  215.                 End If
  216.             End If
  217.             End If
  218.         Next
  219.         Next
  220.     Case 1
  221.         For i1 = si-1 To si+1 Step 2
  222.             j1 = sj+pieces(si,sj)
  223.             If i1 >= 0 And i1 <= 7 And j1 >= 0 And j1 <= 7 Then
  224.             If Sgn(pieces(i1,j1)) = -Sgn(pieces(si,sj)) Then
  225.                 j2 = j1+pieces(si,sj)
  226.                 i2 = i1+(i1-si)
  227.                 If i2 >= 0 And i2 <= 7 And j2 >= 0 And j2 <= 7 Then
  228.                     If pieces(i2,j2) = 0 Then
  229.                         caps(i2,j2) = pieces(si,sj)
  230.                     End If
  231.                 End If
  232.             End If
  233.             End If
  234.         Next
  235.     End Select
  236. End If
  237. End Function
  238.  
  239. Function reset_caps()
  240. For j = 0 To 7
  241. For i = 0 To 7
  242. caps(i,j) = 0
  243. Next
  244. Next
  245. End Function
  246.  
  247.  
  248. Function checker(i,j)
  249. Select Sgn(pieces(i,j))
  250. Case 1
  251.     Color 200,200,200
  252. Case -1
  253.     Color 80,80,80
  254. End Select
  255. Oval i*w,j*h,w,h
  256. If Abs(pieces(i,j)) = 2 Then
  257.     Color 150,150,150
  258.     Oval i*w+(0.2*w), j*h+(0.2*h), w*0.6, h*0.6
  259. End If
  260. End Function
  261.  
  262. Function click()
  263. If MouseDown(1) Then
  264.     i = MouseX() / w
  265.     j = MouseY() / h
  266.     Select mode
  267.     Case 0 ; normal
  268.     If Sgn(pieces(i,j)) = turn Then ; turn
  269.         If has_dests(i,j) Or has_caps(i,j) Then
  270.             si = i
  271.             sj = j
  272.             mode = 1
  273.             compute_dests()
  274.             compute_caps()
  275.         End If
  276.     End If
  277.     Case 1 ; element picked
  278.     If i = si And j = sj Then
  279.         ; de-selection
  280.         reset_dests()
  281.         reset_caps()
  282.         si = -1
  283.         sj = -1
  284.         mode = 0
  285.     Else If dests(i,j) = pieces(si,sj) Then ; simple move
  286.         ; move piece
  287.         pieces(i,j) = pieces(si,sj)
  288.         pieces(si,sj) = 0
  289.         reset_dests()
  290.         reset_caps()
  291.         si = -1
  292.         sj = -1
  293.         mode = 0
  294.         turn = -turn
  295.         ; make a king
  296.         If Abs(pieces(i,j)) = 1 And j = (1 - turn)/2*7 Then
  297.             pieces(i,j) = pieces(i,j)*2
  298.         End If
  299.     Else If caps(i,j) = pieces(si,sj) Then ; capture
  300.         remove_cap(si,sj,i,j)
  301.         pieces(i,j) = pieces(si,sj)
  302.         pieces(si,sj) = 0
  303.         If has_caps(i,j) Then
  304.             reset_dests()
  305.             si = i
  306.             sj = j
  307.             mode = 2
  308.         Else
  309.             si = -1
  310.             sj = -1
  311.             mode = 0
  312.             turn = -turn
  313.         End If
  314.     End If
  315.     Case 2 ; we did a capture, we must do more captures
  316.     If caps(i,j) = pieces(si,sj) Then
  317.         remove_cap(si,sj,i,j)
  318.         pieces(i,j) = pieces(si,sj)
  319.         pieces(si,sj) = 0
  320.         If has_caps(i,j) Then
  321.             si = i
  322.             si = j
  323.         Else
  324.             reset_dests()
  325.             reset_caps()
  326.             si = -1
  327.             sj = -1
  328.             mode = 0
  329.             turn = -turn
  330.         End If
  331.     End If
  332.     End Select
  333. End If
  334. End Function
  335.  
  336. Function remove_cap(si,sj,i,j)
  337. Local ci
  338. Local cj
  339. If i > si Then
  340. ci = si+1
  341. Else
  342. ci = si-1
  343. End If
  344. If j > sj Then
  345. cj = sj+1
  346. Else
  347. cj = sj-1
  348. End If
  349. pieces(ci,cj) = 0
  350. End Function
  351.  
  352. Function check_win()
  353. Local lights = 0
  354. Local darks = 0
  355. For j = 0 To 7
  356. For i = 0 To 7
  357. If pieces(i,j) > 0 Then
  358.     lights = lights + 1
  359. Else If pieces(i,j) < 0 Then
  360.     darks = darks + 1
  361. End If
  362. Next
  363. Next
  364. Return (lights = 0) Or (darks = 0)
  365. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement