RosettaCodeData/Task/Generate-random-chess-position/Nim/generate-random-chess-position.nim
2023-07-01 13:44:08 -04:00

105 lines
2.4 KiB
Nim

import random
type
Piece {.pure.} = enum
None
WhiteBishop = ('B', "")
WhiteKing = ('K', "")
WhiteKnight = ('N', "")
WhitePawn = ('P', "")
WhiteQueen = ('Q', "")
WhiteRook = ('R', "")
BlackBishop = ('b', "")
BlackKing = ('k', "")
BlackKnight = ('n', "")
BlackPawn = ('p', "")
BlackQueen = ('q', "")
BlackRook = ('r', "")
Color {.pure.} = enum White, Black
Grid = array[8, array[8, Piece]]
const
# White pieces except king and pawns.
WhitePieces = [WhiteQueen, WhiteRook, WhiteRook, WhiteBishop,
WhiteBishop, WhiteKnight, WhiteKnight]
# Black pieces except king and pawns.
BlackPieces = [BlackQueen, BlackRook, BlackRook, BlackBishop,
BlackBishop, BlackKnight, BlackKnight]
proc placeKings(grid: var Grid) =
while true:
let r1 = rand(7)
let c1 = rand(7)
let r2 = rand(7)
let c2 = rand(7)
if r1 != r2 and abs(r1 - r2) > 1 and abs(c1 - c2) > 1:
grid[r1][c1] = WhiteKing
grid[r2][c2] = BlackKing
break
proc placePawns(grid: var Grid; color: Color) =
let piece = if color == White: WhitePawn else: BlackPawn
let numToPlace = rand(8)
for n in 0..<numToPlace:
var r, c: int
while true:
r = rand(7)
c = rand(7)
if grid[r][c] == None and r notin {0, 7}: break
grid[r][c] = piece
proc placePieces(grid: var Grid; color: Color) =
var pieces = if color == White: WhitePieces else: BlackPieces
pieces.shuffle()
let numToPlace = rand(7)
for n in 0..<numToPlace:
var r, c: int
while true:
r = rand(7)
c = rand(7)
if grid[r][c] == None: break
grid[r][c] = pieces[n]
proc toFen(grid: Grid): string =
var countEmpty = 0
for r in 0..7:
for c in 0..7:
let piece = grid[r][c]
if piece == None:
stdout.write " . "
inc countEmpty
else:
stdout.write ' ' & $piece & ' '
if countEmpty > 0:
result.add $countEmpty
countEmpty = 0
result.add chr(ord(piece))
if countEmpty > 0:
result.add $countEmpty
countEmpty = 0
result.add '/'
echo ""
result.add " w - - 0 1"
proc createFen(): string =
var grid: Grid
grid.placeKings()
grid.placePawns(White)
grid.placePawns(Black)
grid.placePieces(White)
grid.placePieces(Black)
result = grid.toFen()
randomize()
echo createFen()