RosettaCodeData/Task/Generate-Chess960-starting-position/C++/generate-chess960-starting-position.cpp

58 lines
1,012 B
C++
Raw Permalink Normal View History

2015-02-20 09:02:09 -05:00
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
2015-11-18 06:14:39 +00:00
namespace
2015-02-20 09:02:09 -05:00
{
2015-11-18 06:14:39 +00:00
void placeRandomly(char* p, char c)
2015-02-20 09:02:09 -05:00
{
2015-11-18 06:14:39 +00:00
int loc = rand() % 8;
if (!p[loc])
p[loc] = c;
else
placeRandomly(p, c); // try again
}
int placeFirst(char* p, char c, int loc = 0)
{
while (p[loc]) ++loc;
p[loc] = c;
return loc;
2015-02-20 09:02:09 -05:00
}
string startPos()
{
char p[8]; memset( p, 0, 8 );
2015-11-18 06:14:39 +00:00
// bishops on opposite color
p[2 * (rand() % 4)] = 'B';
p[2 * (rand() % 4) + 1] = 'B';
2015-02-20 09:02:09 -05:00
2015-11-18 06:14:39 +00:00
// queen knight knight, anywhere
for (char c : "QNN")
placeRandomly(p, c);
2015-02-20 09:02:09 -05:00
2015-11-18 06:14:39 +00:00
// rook king rook, in that order
placeFirst(p, 'R', placeFirst(p, 'K', placeFirst(p, 'R')));
2015-02-20 09:02:09 -05:00
2015-11-18 06:14:39 +00:00
return string(p, 8);
}
} // leave local
2015-02-20 09:02:09 -05:00
2015-11-18 06:14:39 +00:00
namespace chess960
{
void generate( int c )
{
for( int x = 0; x < c; x++ )
cout << startPos() << "\n";
2015-02-20 09:02:09 -05:00
}
2015-11-18 06:14:39 +00:00
}
2015-02-20 09:02:09 -05:00
int main( int argc, char* argv[] )
{
srand( time( NULL ) );
2015-11-18 06:14:39 +00:00
chess960::generate( 10 );
2015-02-20 09:02:09 -05:00
cout << "\n\n";
return system( "pause" );
}