Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Global sw = 800
- Global sh = 800
- Global w = sw/8
- Global h = sh/8
- Global mode = 0
- Global si = -1
- Global sj = -1
- Global turn = 1
- Graphics sw, sh
- Dim board(8,8)
- Dim pieces(8,8)
- Dim dests(8,8)
- Dim caps(8,8)
- reset_dests()
- reset_caps()
- For j = 0 To 7
- For i = 0 To 7
- board(i,j) = (i+j) Mod 2
- Next
- Next
- For x = 0 To 3
- ;pieces(2*x+1,0) = 1
- ;pieces(2*x ,1) = 1
- pieces(2*x+1,2) = 2
- pieces(2*x ,5) = -2
- ;pieces(2*x+1,6) = -1
- ;pieces(2*x ,7) = -1
- Next
- SetBuffer BackBuffer()
- While Not KeyHit(1)
- Cls
- drawboard()
- If check_win() Then
- Color 255,255,255
- Text sw/2, sh/2, "PLAYER " + (1+(turn+1)/2) + " WINS!", 300
- Else
- highlight() ; square border hover
- highlight_selection() ; men/kings border hover
- If mode <> 2 Then
- compute_dests() ; legal moves (1 distance)
- End If
- compute_caps()
- highlight_destinations() ; show them (differently for men and kings)
- click() ; game action
- End If
- Flip
- WaitEvent() ; avoid busylooping
- Wend
- Function drawboard()
- Local t = h/12
- For i = 0 To 7
- For j = 0 To 7
- ; draw square
- Color board(i,j)*255,0,0
- Rect i*w, j*h, w, h
- ; draw checker
- If pieces(i,j) <> 0 Then
- checker(i,j)
- End If
- Next
- Next
- End Function
- Function highlight()
- i = MouseX() / w
- j = MouseY() / h
- Color 255, 255, 0
- If pieces(i,j) <> 0 Then
- Oval i*w, j*h, w, h, 0
- Else
- Rect i*w, j*h, w, h, 0
- End If
- End Function
- Function highlight_selection()
- If si >= 0 And sj >= 0 Then
- Color 0,255,0
- Oval si*w, sj*h, w, h, 0
- End If
- End Function
- Function highlight_destinations()
- For j = 0 To 7
- For i = 0 To 7
- If dests(i,j) <> 0 Then
- Select Abs(dests(i,j))
- Case 2
- Color 110,110,210
- Oval i*w, j*h, w, h
- Color 140,140,240
- Oval i*w+(0.2*w), j*h+(0.2*h), w*0.6, h*0.6
- Case 1
- Color 110,110,210
- Oval i*w, j*h, w, h
- End Select
- End If
- If caps(i,j) <> 0 Then
- Select Abs(caps(i,j))
- Case 2
- Color 110,110,210
- Oval i*w, j*h, w, h
- Color 140,140,240
- Oval i*w+(0.2*w), j*h+(0.2*h), w*0.6, h*0.6
- Case 1
- Color 110,110,210
- Oval i*w, j*h, w, h
- End Select
- End If
- Next
- Next
- End Function
- Function has_dests(i,j)
- Local savei = si
- Local savej = sj
- si = i
- sj = j
- compute_dests()
- Local has = False
- For j = 0 To 7
- For i = 0 To 7
- has = has Or dests(i,j) <> 0
- Next
- Next
- si = savei
- sj = savej
- Return has
- End Function
- Function compute_dests()
- If si >= 0 And sj >= 0 Then
- Select Abs(pieces(si,sj))
- Case 2
- For i1 = si-1 To si+1 Step 2
- For j1 = sj-1 To sj+1 Step 2
- If i1 >= 0 And i1 <= 7 And j1 >= 0 And j1 <= 7 Then
- If pieces(i1,j1) = 0 Then
- dests(i1,j1) = pieces(si,sj)
- End If
- End If
- Next
- Next
- Case 1
- For i1 = si-1 To si+1 Step 2
- j1 = sj+pieces(si,sj)
- If i1 >= 0 And i1 <= 7 And j1 >= 0 And j1 <= 7 Then
- If pieces(i1,j1) = 0 Then
- dests(i1,j1) = pieces(si,sj)
- End If
- End If
- Next
- End Select
- End If
- End Function
- Function reset_dests()
- For j = 0 To 7
- For i = 0 To 7
- dests(i,j) = 0
- Next
- Next
- End Function
- Function has_caps(i,j)
- Local savei = si
- Local savej = sj
- si = i
- sj = j
- compute_caps()
- Local has = False
- For j = 0 To 7
- For i = 0 To 7
- has = has Or caps(i,j) <> 0
- Next
- Next
- si = savei
- sj = savej
- Return has
- End Function
- Function compute_caps()
- If si >= 0 And sj >= 0 Then
- reset_caps()
- Select Abs(pieces(si,sj))
- Case 2
- For i1 = si-1 To si+1 Step 2
- For j1 = sj-1 To sj+1 Step 2
- If i1 >= 0 And i1 <= 7 And j1 >= 0 And j1 <= 7 Then
- If Sgn(pieces(i1,j1)) = -Sgn(pieces(si,sj)) Then
- j2 = j1+(j1-sj)
- i2 = i1+(i1-si)
- Print "i1 j1"
- Print i1 + " " + j1
- If i2 >= 0 And i2 <= 7 And j2 >= 0 And j2 <= 7 Then
- If pieces(i2,j2) = 0 Then
- caps(i2,j2) = pieces(si,sj)
- End If
- End If
- End If
- End If
- Next
- Next
- Case 1
- For i1 = si-1 To si+1 Step 2
- j1 = sj+pieces(si,sj)
- If i1 >= 0 And i1 <= 7 And j1 >= 0 And j1 <= 7 Then
- If Sgn(pieces(i1,j1)) = -Sgn(pieces(si,sj)) Then
- j2 = j1+pieces(si,sj)
- i2 = i1+(i1-si)
- If i2 >= 0 And i2 <= 7 And j2 >= 0 And j2 <= 7 Then
- If pieces(i2,j2) = 0 Then
- caps(i2,j2) = pieces(si,sj)
- End If
- End If
- End If
- End If
- Next
- End Select
- End If
- End Function
- Function reset_caps()
- For j = 0 To 7
- For i = 0 To 7
- caps(i,j) = 0
- Next
- Next
- End Function
- Function checker(i,j)
- Select Sgn(pieces(i,j))
- Case 1
- Color 200,200,200
- Case -1
- Color 80,80,80
- End Select
- Oval i*w,j*h,w,h
- If Abs(pieces(i,j)) = 2 Then
- Color 150,150,150
- Oval i*w+(0.2*w), j*h+(0.2*h), w*0.6, h*0.6
- End If
- End Function
- Function click()
- If MouseDown(1) Then
- i = MouseX() / w
- j = MouseY() / h
- Select mode
- Case 0 ; normal
- If Sgn(pieces(i,j)) = turn Then ; turn
- If has_dests(i,j) Or has_caps(i,j) Then
- si = i
- sj = j
- mode = 1
- compute_dests()
- compute_caps()
- End If
- End If
- Case 1 ; element picked
- If i = si And j = sj Then
- ; de-selection
- reset_dests()
- reset_caps()
- si = -1
- sj = -1
- mode = 0
- Else If dests(i,j) = pieces(si,sj) Then ; simple move
- ; move piece
- pieces(i,j) = pieces(si,sj)
- pieces(si,sj) = 0
- reset_dests()
- reset_caps()
- si = -1
- sj = -1
- mode = 0
- turn = -turn
- ; make a king
- If Abs(pieces(i,j)) = 1 And j = (1 - turn)/2*7 Then
- pieces(i,j) = pieces(i,j)*2
- End If
- Else If caps(i,j) = pieces(si,sj) Then ; capture
- remove_cap(si,sj,i,j)
- pieces(i,j) = pieces(si,sj)
- pieces(si,sj) = 0
- If has_caps(i,j) Then
- reset_dests()
- si = i
- sj = j
- mode = 2
- Else
- si = -1
- sj = -1
- mode = 0
- turn = -turn
- End If
- End If
- Case 2 ; we did a capture, we must do more captures
- If caps(i,j) = pieces(si,sj) Then
- remove_cap(si,sj,i,j)
- pieces(i,j) = pieces(si,sj)
- pieces(si,sj) = 0
- If has_caps(i,j) Then
- si = i
- si = j
- Else
- reset_dests()
- reset_caps()
- si = -1
- sj = -1
- mode = 0
- turn = -turn
- End If
- End If
- End Select
- End If
- End Function
- Function remove_cap(si,sj,i,j)
- Local ci
- Local cj
- If i > si Then
- ci = si+1
- Else
- ci = si-1
- End If
- If j > sj Then
- cj = sj+1
- Else
- cj = sj-1
- End If
- pieces(ci,cj) = 0
- End Function
- Function check_win()
- Local lights = 0
- Local darks = 0
- For j = 0 To 7
- For i = 0 To 7
- If pieces(i,j) > 0 Then
- lights = lights + 1
- Else If pieces(i,j) < 0 Then
- darks = darks + 1
- End If
- Next
- Next
- Return (lights = 0) Or (darks = 0)
- End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement