Generate random chess position: Difference between revisions

Added Julia language
(Scala contribution added.)
(Added Julia language)
Line 257:
. . . . . . B K
5B2/P1P5/2k1R3/p1Pp4/7Q/P7/1N2rNP1/6BK/ w - - 0 1</pre>
 
=={{header|Julia}}==
{{trans|Kotlin}}
 
'''Module''':
<lang julia>module Chess
 
using Printf
 
struct King end
struct Pawn end
 
struct Grid
M::Matrix{Char}
end
Grid(n::Integer) = Grid(fill(' ', n, n))
 
Base.size(g::Grid) = size(g.M)
Base.size(g::Grid, d) = size(g.M, d)
Base.axes(g::Grid) = axes(g.M)
Base.axes(g::Grid, d) = axes(g.M, d)
Base.getindex(g::Grid, I...) = getindex(g.M, I...)
Base.setindex!(g::Grid, v, I...) = setindex!(g.M, v, I...)
function Base.show(io::IO, g::Grid)
println(io, " ", join(@sprintf("%2d", d) for d in 1:size(g, 1)))
for r in 1:size(g, 2)
@printf(io, "%2d %s\n", r, join(g.M[r, :], ' '))
end
return nothing
end
 
function placepieces!(grid, ::King)
axis = axes(grid, 1)
while true
r1, c1, r2, c2 = rand(axis, 4)
if r1 != r2 && abs(r1 - r2) > 1 && abs(c1 - c2) > 1
grid[r1, c1] = '♚'
grid[r2, c2] = '♔'
return grid
end
end
end
 
function placepieces!(grid, ch)
axis = axes(grid, 1)
while true
r, c = rand(axis, 2)
if grid[r, c] == ' '
grid[r, c] = ch
return grid
end
end
end
 
function placepieces!(grid, ch, ::Pawn)
axis = axes(grid, 1)
while true
r, c = rand(axis, 2)
if grid[r, c] == ' ' && r ∉ extrema(axis)
grid[r, c] = ch
return grid
end
end
end
 
function randposition!(grid)
placepieces!(grid, King())
foreach("♙♙♙♙♙♙♙♙♙♟♟♟♟♟♟♟♟") do ch
placepieces!(grid, ch, Pawn())
end
foreach("♖♘♗♕♗♘♖♜♞♝♛♝♞♜") do ch
placepieces!(grid, ch)
end
return grid
end
 
end # module Chess</lang>
 
'''Main''':
<lang julia>grid = Chess.Grid(8)
Chess.randposition!(grid)
println(grid)</lang>
 
{{out}}
<pre> 1 2 3 4 5 6 7 8
1 ♖ ♝ ♛ ♝
2 ♟ ♙
3 ♚ ♙ ♖ ♙ ♟ ♟ ♟
4 ♟ ♙ ♙ ♞ ♙ ♙
5 ♙ ♟ ♔ ♜ ♟
6 ♘ ♙
7 ♟ ♕ ♜
8 ♘ ♗ ♞ ♗</pre>
 
=={{header|Kotlin}}==
Anonymous user