58 lines
1.6 KiB
Text
58 lines
1.6 KiB
Text
def hasNK(board, a, b)
|
|
(-1..1).each do |g|
|
|
(-1..1).each do |f|
|
|
aa = a + f; bb = b + g
|
|
if (0..7).includes?(aa) && (0..7).includes?(bb)
|
|
p = board[aa + 8 * bb]
|
|
return true if p == "K" || p == "k"
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
def generateBoard(board, pieces)
|
|
pieces.each_char do |p|
|
|
while true
|
|
a = rand(8); b = rand(8)
|
|
next if ( (b == 0 || b == 7) && (p == "P" || p == "p") ) ||
|
|
( (p == "k" || p == "K") && hasNK(board, a, b) )
|
|
break if board[a + b * 8] == '.'
|
|
end
|
|
board[a + b * 8] = p
|
|
end
|
|
end
|
|
|
|
pieces = "ppppppppkqrrbbnnPPPPPPPPKQRRBBNN"
|
|
11.times do
|
|
e = pieces.size - 1
|
|
while e > 0
|
|
p = rand(e); t = pieces[e]
|
|
#pieces[e] = pieces[p]; pieces[p] = t; e -= 1 # in Ruby
|
|
pieces = pieces.sub(e, pieces[p]) # in Crystal because
|
|
pieces = pieces.sub(p, t); e -= 1 # strings immutable
|
|
end
|
|
end
|
|
|
|
# No 'nil' for Crystal arrays; use '.' for blank value
|
|
board = Array.new(64, '.'); generateBoard(board, pieces)
|
|
puts
|
|
e = 0
|
|
8.times do |j| row_j = j * 8
|
|
8.times do |i|
|
|
board[row_j + i ] == '.' ? (e += 1) :
|
|
( (print(e); e = 0) if e > 0
|
|
print board[row_j + i] )
|
|
end
|
|
(print(e); e = 0) if e > 0
|
|
print("/") if j < 7
|
|
end
|
|
|
|
print(" w - - 0 1\n")
|
|
8.times do |j| row_j = j * 8
|
|
8.times { |i| board[row_j + i] == '.' ? print(".") : print(board[row_j + i]) }
|
|
puts
|
|
end
|
|
|
|
# Simpler for same output
|
|
8.times{ |row| puts board[row*8..row*8 + 7].join("") }
|