Jump to content

Generate random chess position: Difference between revisions

m
→‎{{header|REXX}}: changed/added comments and whitespace, changed indentations.
m (→‎{{header|REXX}}: fixed a typo.)
m (→‎{{header|REXX}}: changed/added comments and whitespace, changed indentations.)
Line 213:
 
This version also allows any number of chessboards to be displayed.
<lang rexx>/*REXX pgmprogram gensgenerates a chess position (random pieces & positions) in a FEN format.*/
parse arg seed CBs . /*obtain optional arguments from the CL*/
if datatype(seed\==,'W' & seed\=",") then call random ,,seed /*SEED given for /*RANDOM repeatability? */
if CBs =='' | CBs ='=",'" then CBs=1 /*CBs: number of generated chessboardsChessBoards*/
/* [↓] maybe display any # of boards. */
do boards=1 for abs(CBs) /* [↓] maybe display separator & title*/
if abssign(CBs)\==1CBs then do; say; say center(' board' boards" ", 79, '▒'); end
@.=. /*initialize the chessboard to be empty*/
do p=1 for random(2, 32) /*generate a random number of chessmen.*/
if p<3 then call piece 'k' /*a king of each color. */
else call piece substr('bnpqr', random(1, 5), 1)
end /*p*/ /* [↑] place a piece. on the chessboard*/
call cb /*display the ChessBoard and its FEN.*/
end /*boards*/ /* [↑] CB ≡ ─ ─ */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
/*────────────────────────────────────────────────────────────────────────────*/
cb: fen=; do r=8 for 8 by -1; $= /*the board rank (so far).*/
do f=8 for 8 by -1; $=$ || @.r.f; end /*f*/ /*append the board file. */
say $ /*display the board rank. */
do e=8 for 8 by -1; $=changestr(copies(., e), $, e); end /*e*/ /*.≡filler*/
fen=fen || $ || left('/', r\==1) /*append / if not the 1st rank.*/
end /*r*/ /* [↑] append $ str to FEN*/
say /*display a blank line (after the board)sep. line*/
say 'FEN='fen "w - - 0 1" /*show Forsyth-Edwards /*Forsyth─Edwards Notation.*/
return /* [↑] build/display chessboard.*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
/*────────────────────────────────────────────────────────────────────────────*/
piece: parse arg x; if p//2 then upper x; arg ux /*use white if odd P.*/
if CBs<0 & p>2 then if random(1) then upper x /*CBs>0? Use balanced.*/
/*[↓] # isn't changed.*/
 
do #=0 by 0; r=random(1, 8); f=random(1, 8) /*random rank &and file.*/
if @.r.f\==. then iterate /*is position occupied? */
if (x=='p' & r==1) | (x=='P' & r==8) then iterate /*any promoting pawn? */
/*[↑] skip these pawns*/
 
if ux=='K' then do rr=r-1 for 3 /*[↓] neighbor≡kingneighbor ≡ king?*/
do ff=f-1 for 3; z=@.rr.ff; upper z /*obtainan theuppercase neighbor*/
upper z; if z=='K' then iterate # /*if a king, then skip.*/
end /*rr*/ /*[↑] neighbor≡kingneighbor ≡ king?*/
end /*ff*/ /*[↑] we're all done. */
@.r.f=x; return /*place random piece. */
end /*#*/ /*#: not incremented. */</lang>
Some older REXXes don't have a &nbsp; '''changestr''' &nbsp; BIF, &nbsp; so one is included here: &nbsp; ───► &nbsp; [[CHANGESTR.REX]]. <br><br>
'''output''' &nbsp; showing five chess positions (starting with a specific position by seeding the &nbsp; '''random''' &nbsp; BIF with &nbsp; '''96'''),
Cookies help us deliver our services. By using our services, you agree to our use of cookies.