using namespace std;
-void CreateGame(int argc, char ** argv);
+Piece::Colour SetupGame(int argc, char ** argv);
void DestroyGame();
-void PrintResults(const MovementResult & result);
+void PrintResults(const MovementResult & result, string & buffer);
int main(int argc, char ** argv)
{
exit(EXIT_SUCCESS);
}
- CreateGame(argc, argv);
- if (Game::theGame == NULL)
+
+
+ Piece::Colour setupError = SetupGame(argc, argv);
+ MovementResult result = MovementResult::OK;
+ if (setupError == Piece::NONE)
{
- fprintf(stderr, "ERROR: Couldn't create a game!\n");
- exit(EXIT_FAILURE);
+ result = Game::theGame->Play();
}
-
- MovementResult result = Game::theGame->Play();
+ else
+ {
+ result = MovementResult::BAD_SETUP;
+ Game::theGame->ForceTurn(setupError);
+ }
+
Game::theGame->PrintEndMessage(result);
- PrintResults(result);
+
+ string buffer = "";
+ PrintResults(result, buffer);
+
+ //Message the AI's the quit message
+ Game::theGame->red->Message("QUIT " + buffer);
+ Game::theGame->blue->Message("QUIT " + buffer);
+
+ //Log the message
+ if (Game::theGame->GetLogFile() != stdout)
+ Game::theGame->logMessage("%s\n", buffer.c_str());
+
+ fprintf(stdout, "%s\n", buffer.c_str());
exit(EXIT_SUCCESS);
return 0;
}
-void CreateGame(int argc, char ** argv)
+Piece::Colour SetupGame(int argc, char ** argv)
{
char * red = NULL; char * blue = NULL; double timeout = 0.00001; bool graphics = false; bool allowIllegal = false; FILE * log = NULL;
Piece::Colour reveal = Piece::BOTH; char * inputFile = NULL; int maxTurns = 5000; bool printBoard = false;
case 't':
if (argc - ii <= 1)
{
- fprintf(stderr, "Expected timeout value after -t switch!\n");
+ fprintf(stderr, "ARGUMENT_ERROR - Expected timeout value after -t switch!\n");
exit(EXIT_FAILURE);
}
timeout = atof(argv[ii+1]);
case 'o':
if (argc - ii <= 1)
{
- fprintf(stderr, "Expected filename or \"stdout\" after -o switch!\n");
+ fprintf(stderr, "ARGUMENT_ERROR - Expected filename or \"stdout\" after -o switch!\n");
exit(EXIT_FAILURE);
}
if (log != NULL)
{
- fprintf(stderr, "Expected at most ONE -o switch!\n");
+ fprintf(stderr, "ARGUMENT_ERROR - Expected at most ONE -o switch!\n");
exit(EXIT_FAILURE);
}
if (strcmp(argv[ii+1], "stdout") == 0)
case 'm':
if (argc - ii <= 1)
{
- fprintf(stderr, "Expected max_turns value after -m switch!\n");
+ fprintf(stderr, "ARGUMENT_ERROR - Expected max_turns value after -m switch!\n");
exit(EXIT_FAILURE);
}
- if (strcmp(argv[ii+1], "inf"))
+ if (strcmp(argv[ii+1], "inf") == 0)
maxTurns = -1;
else
maxTurns = atoi(argv[ii+1]);
case 'f':
if (argc - ii <= 1)
{
- fprintf(stderr, "Expected filename after -f switch!\n");
+ fprintf(stderr, "ARGUMENT_ERROR - Expected filename after -f switch!\n");
exit(EXIT_FAILURE);
}
if (log != NULL)
{
- fprintf(stderr, "Expected at most ONE -f switch!\n");
+ fprintf(stderr, "ARGUMENT_ERROR - Expected at most ONE -f switch!\n");
exit(EXIT_FAILURE);
}
red = (char*)("file");
}
else
{
- fprintf(stderr, "Unrecognised switch \"%s\"...\n", argv[ii]);
+ fprintf(stderr, "ARGUMENT_ERROR - Unrecognised switch \"%s\"...\n", argv[ii]);
exit(EXIT_FAILURE);
}
}
blue = argv[ii];
else
{
- fprintf(stderr, "Unexpected argument \"%s\"...\n", argv[ii]);
+ fprintf(stderr, "ARGUMENT_ERROR - Unexpected argument \"%s\"...\n", argv[ii]);
exit(EXIT_FAILURE);
}
}
}
+
+
if (inputFile == NULL)
{
+ if (red == NULL || blue == NULL) //Not enough arguments
+ {
+ fprintf(stderr, "ARGUMENT_ERROR - Did not recieve enough players (did you mean to use the -f switch?)\n");
+ exit(EXIT_FAILURE);
+ }
Game::theGame = new Game(red,blue, graphics, timeout, allowIllegal,log, reveal,maxTurns, printBoard);
}
else
{
Game::theGame = new Game(inputFile, graphics, timeout, allowIllegal,log, reveal,maxTurns, printBoard);
}
- if (!Game::theGame->Setup(red, blue))
+
+ if (Game::theGame == NULL)
{
- fprintf(stdout, "NONE %d\n",Game::theGame->TurnCount());
- exit(EXIT_SUCCESS);
+ fprintf(stderr,"INTERNAL_ERROR - Error creating Game!\n");
+ exit(EXIT_FAILURE);
}
-
atexit(DestroyGame);
+
+ return Game::theGame->Setup(red, blue);
+
}
-void PrintResults(const MovementResult & result)
+void PrintResults(const MovementResult & result, string & buffer)
{
- Piece::Colour winner = Game::theGame->Turn();
- if (Board::LegalResult(result))
- {
- if (winner == Piece::BOTH)
- winner = Piece::NONE;
- else
- {
- if (winner == Piece::RED)
- winner = Piece::BLUE;
- else
- winner = Piece::RED;
- }
- }
-
-
- switch (winner)
+ stringstream s("");
+ switch (Game::theGame->Turn())
{
case Piece::RED:
- fprintf(stdout, "%s RED %d\n", Game::theGame->red->name.c_str(),Game::theGame->TurnCount());
- Game::theGame->logMessage("%s RED %d\n", Game::theGame->red->name.c_str(),Game::theGame->TurnCount());
+ s << Game::theGame->red->name << " RED ";
break;
case Piece::BLUE:
- fprintf(stdout, "%s BLUE %d\n", Game::theGame->blue->name.c_str(),Game::theGame->TurnCount());
- Game::theGame->logMessage("%s BLUE %d\n", Game::theGame->blue->name.c_str(),Game::theGame->TurnCount());
+ s << Game::theGame->blue->name << " BLUE ";
break;
case Piece::BOTH:
- fprintf(stdout, "DRAW %d\n",Game::theGame->TurnCount());
- Game::theGame->logMessage("DRAW %d\n",Game::theGame->TurnCount());
+ s << "neither BOTH ";
break;
case Piece::NONE:
- fprintf(stdout, "NONE %d\n",Game::theGame->TurnCount());
- Game::theGame->logMessage("NONE %d\n",Game::theGame->TurnCount());
+ s << "neither NONE ";
break;
+ }
+ if (!Board::LegalResult(result) && result != MovementResult::BAD_SETUP)
+ s << "ILLEGAL ";
+ else if (!Board::HaltResult(result))
+ s << "INTERNAL_ERROR ";
+ else
+ {
+ switch (result.type)
+ {
+ case MovementResult::VICTORY:
+ s << "VICTORY ";
+ break;
+ case MovementResult::SURRENDER:
+ s << "SURRENDER ";
+ break;
+ case MovementResult::DRAW:
+ s << "DRAW ";
+ break;
+ case MovementResult::DRAW_DEFAULT:
+ s << "DRAW_DEFAULT ";
+ break;
+ case MovementResult::BAD_SETUP:
+ s << "BOTH_ILLEGAL ";
+ break;
+ default:
+ s << "INTERNAL_ERROR ";
+ break;
+ }
}
+
+ s << Game::theGame->TurnCount() << " " << Game::theGame->theBoard.TotalPieceValue(Piece::RED) << " " << Game::theGame->theBoard.TotalPieceValue(Piece::BLUE);
+
+ buffer = s.str();
+
+
}
void DestroyGame()