Generate random chess position: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: added/changed whitespace and comments.) |
No edit summary |
||
Line 10: | Line 10: | ||
No requirement is made regarding the probability distribution of your method, but your program should be able to span a reasonably representative sample of all possible positions. For instance, programs that would always generate positions with say five pieces on the board, or with kings on a corner, would not be considered truly random. |
No requirement is made regarding the probability distribution of your method, but your program should be able to span a reasonably representative sample of all possible positions. For instance, programs that would always generate positions with say five pieces on the board, or with kings on a corner, would not be considered truly random. |
||
=={{header|C++}}== |
|||
<lang cpp> |
|||
#include <ctime> |
|||
#include <iostream> |
|||
#include <string> |
|||
#include <algorithm> |
|||
class chessBoard { |
|||
public: |
|||
void generateRNDBoard( int brds ) { |
|||
int a, b, i; char c; |
|||
for( int cc = 0; cc < brds; cc++ ) { |
|||
memset( brd, 0, 64 ); |
|||
std::string pieces = "PPPPPPPPNNBBRRQKppppppppnnbbrrqk"; |
|||
random_shuffle( pieces.begin(), pieces.end() ); |
|||
while( pieces.length() ) { |
|||
i = rand() % pieces.length(); c = pieces.at( i ); |
|||
while( true ) { |
|||
a = rand() % 8; b = rand() % 8; |
|||
if( brd[a][b] == 0 ) { |
|||
if( c == 'P' && !b || c == 'p' && b == 7 || |
|||
( ( c == 'K' || c == 'k' ) && search( c == 'k' ? 'K' : 'k', a, b ) ) ) continue; |
|||
break; |
|||
} |
|||
} |
|||
brd[a][b] = c; |
|||
pieces = pieces.substr( 0, i ) + pieces.substr( i + 1 ); |
|||
} |
|||
print(); |
|||
} |
|||
} |
|||
private: |
|||
bool search( char c, int a, int b ) { |
|||
for( int y = -1; y < 2; y++ ) { |
|||
for( int x = -1; x < 2; x++ ) { |
|||
if( !x && !y ) continue; |
|||
if( a + x > -1 && a + x < 8 && b + y >-1 && b + y < 8 ) { |
|||
if( brd[a + x][b + y] == c ) return true; |
|||
} |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
void print() { |
|||
int e = 0; |
|||
for( int y = 0; y < 8; y++ ) { |
|||
for( int x = 0; x < 8; x++ ) { |
|||
if( brd[x][y] == 0 ) e++; |
|||
else { |
|||
if( e > 0 ) { std::cout << e; e = 0; } |
|||
std::cout << brd[x][y]; |
|||
} |
|||
} |
|||
if( e > 0 ) { std::cout << e; e = 0; } |
|||
if( y < 7 ) std::cout << "/"; |
|||
} |
|||
std::cout << " w - - 0 1\n\n"; |
|||
for( int y = 0; y < 8; y++ ) { |
|||
for( int x = 0; x < 8; x++ ) { |
|||
if( brd[x][y] == 0 ) std::cout << "."; |
|||
else std::cout << brd[x][y]; |
|||
} |
|||
std::cout << "\n"; |
|||
} |
|||
std::cout << "\n\n"; |
|||
} |
|||
char brd[8][8]; |
|||
}; |
|||
int main( int argc, char* argv[] ) { |
|||
srand( ( unsigned )time( 0 ) ); |
|||
chessBoard c; |
|||
c.generateRNDBoard( 2 ); |
|||
return 0; |
|||
} |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
1R6/2bnQP1K/br1N1BP1/nPkp1P2/2p1P1P1/4Ppqp/p1r1ppp1/1PNR3B w - - 0 1 |
|||
.R...... |
|||
..bnQP.K |
|||
br.N.BP. |
|||
nPkp.P.. |
|||
..p.P.P. |
|||
....Ppqp |
|||
p.r.ppp. |
|||
.PNR...B |
|||
1n1k2bp/1PppQpb1/N1p4p/1B2P1K1/1RB2P2/pPR1Np2/P1r1rP1P/P2q3n w - - 0 1 |
|||
.n.k..bp |
|||
.PppQpb. |
|||
N.p....p |
|||
.B..P.K. |
|||
.RB..P.. |
|||
pPR.Np.. |
|||
P.r.rP.P |
|||
P..q...n |
|||
</pre> |
|||
=={{header|J}}== |
=={{header|J}}== |