procedure main() turn := "red" square := list(8) every !square := list(8, " ") every row := 1 to 3 do every col := 1 + (row % 2) to 8 by 2 do square[row,col] := "white" every row := 6 to 8 do every col := 1 + (row % 2) to 8 by 2 do square[row,col] := "red" while find("red", !!square) & find("white", !!square) do { # draw the board write(" \\ 1 2 3 4 5 6 7 8 column") write("row -----------------") every i := 1 to 8 do { writes(" ",i," ") every j := 1 to 8 do writes("|",square[i,j,1]) write("|") write(" -----------------") } # read the player's move and change the board # read the player's move repeat { write("It is ", turn, "'s turn, move in row,col,...row,col format:") input := read() L := [ ] input ? while put(L, integer(tab(many(&digits)))) do ="," # if starting square did not hold our piece, re-do if not find(turn, square[L[1],L[2]]) then { write("Did not find a piece to move, try again.") next } every i := 3 to *L by 2 do { # if target square is not empty, re-do if not square[L[i], L[i+1]] == " " then next if find("queen", square[L[1],L[2]]) then { # queen rules if abs(L[1]-L[3]) = abs(L[4]-L[2]) = 1 then { square[L[1],L[2]] :=: square[L[3],L[4]] break break } else if abs(L[i]-L[i-2]) = abs(L[i+1]-L[i-1]) = 2 then { square[L[i],L[i+1]] :=: square[L[i-2],L[i-1]] square[(L[i]+L[i-2])/2, (L[i+1]+L[i-1])/2] := " " } else break next } else { # regular piece direction := (if turn=="red" then -1 else 1) if abs(L[2]-L[4]) = 1 & ((L[3]-L[1]) = direction) then { square[L[1],L[2]] :=: square[L[3],L[4]] break break } else if abs(L[i]-L[i-2]) = 2 & (L[i+1]-L[i-1]) = direction*2 then { square[L[i],L[i+1]] :=: square[L[i-2],L[i-1]] square[(L[i]+L[i-2])/2, (L[i+1]+L[i-1])/2] := " " if L[i] = (1 | 8) then square[L[i],L[i+1]] ||:= " queen" } else { write("Can't perform requested move.") break next } } } break } if turn == "red" then turn := "white" else turn := "red" } end