X-Git-Url: https://git.ucc.asn.au/?p=progcomp2012.git;a=blobdiff_plain;f=manager%2Fmain.cpp;h=44f8fd3de574e939aee6c8b77fd25d045e4a9a18;hp=01a7fab0a2a82a5a4d00ca431dcb843fb760e56e;hb=2120cc40abf9e3fd763c84a1e09b61064bb40be6;hpb=fe470c015d73d07c44f0e951a2bb205d95763f22 diff --git a/manager/main.cpp b/manager/main.cpp index 01a7fab..44f8fd3 100644 --- a/manager/main.cpp +++ b/manager/main.cpp @@ -10,9 +10,9 @@ 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) { @@ -26,22 +26,40 @@ 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; @@ -54,7 +72,7 @@ void CreateGame(int argc, char ** argv) 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]); @@ -73,12 +91,12 @@ void CreateGame(int argc, char ** argv) 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) @@ -105,10 +123,10 @@ void CreateGame(int argc, char ** argv) 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]); @@ -117,12 +135,12 @@ void CreateGame(int argc, char ** argv) 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"); @@ -144,7 +162,7 @@ void CreateGame(int argc, char ** argv) } else { - fprintf(stderr, "Unrecognised switch \"%s\"...\n", argv[ii]); + fprintf(stderr, "ARGUMENT_ERROR - Unrecognised switch \"%s\"...\n", argv[ii]); exit(EXIT_FAILURE); } } @@ -158,67 +176,93 @@ void CreateGame(int argc, char ** argv) 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()