13 Piece::Colour SetupGame(int argc, char ** argv);
15 void PrintResults(const MovementResult & result, string & buffer);
17 int main(int argc, char ** argv)
24 fprintf(stderr, "Usage: stratego [options] red blue\n");
25 fprintf(stderr, " stratego --help\n");
31 Piece::Colour setupError = SetupGame(argc, argv);
32 MovementResult result = MovementResult::OK;
33 if (setupError == Piece::NONE)
35 result = Game::theGame->Play();
39 result = MovementResult::BAD_SETUP;
40 Game::theGame->ForceTurn(setupError);
43 Game::theGame->PrintEndMessage(result);
46 PrintResults(result, buffer);
48 //Message the AI's the quit message
49 Game::theGame->red->Message("QUIT " + buffer);
50 Game::theGame->blue->Message("QUIT " + buffer);
53 if (Game::theGame->GetLogFile() != stdout)
54 Game::theGame->logMessage("%s\n", buffer.c_str());
56 fprintf(stdout, "%s\n", buffer.c_str());
62 Piece::Colour SetupGame(int argc, char ** argv)
64 char * red = NULL; char * blue = NULL; double timeout = 0.00001; bool graphics = false; bool allowIllegal = false; FILE * log = NULL;
65 Piece::Colour reveal = Piece::BOTH; char * inputFile = NULL; int maxTurns = 5000; bool printBoard = false;
66 for (int ii=1; ii < argc; ++ii)
68 if (argv[ii][0] == '-')
75 fprintf(stderr, "ARGUMENT_ERROR - Expected timeout value after -t switch!\n");
78 timeout = atof(argv[ii+1]);
85 printBoard = !printBoard;
88 allowIllegal = !allowIllegal;
94 fprintf(stderr, "ARGUMENT_ERROR - Expected filename or \"stdout\" after -o switch!\n");
99 fprintf(stderr, "ARGUMENT_ERROR - Expected at most ONE -o switch!\n");
102 if (strcmp(argv[ii+1], "stdout") == 0)
105 log = fopen(argv[ii+1], "w");
112 if (reveal == Piece::BOTH)
113 reveal = Piece::BLUE;
115 reveal = Piece::NONE;
118 if (reveal == Piece::BOTH)
121 reveal = Piece::NONE;
126 fprintf(stderr, "ARGUMENT_ERROR - Expected max_turns value after -m switch!\n");
129 if (strcmp(argv[ii+1], "inf") == 0)
132 maxTurns = atoi(argv[ii+1]);
138 fprintf(stderr, "ARGUMENT_ERROR - Expected filename after -f switch!\n");
143 fprintf(stderr, "ARGUMENT_ERROR - Expected at most ONE -f switch!\n");
146 red = (char*)("file");
147 blue = (char*)("file");
148 inputFile = argv[ii+1];
153 system("less manual.txt");
157 if (strcmp(argv[ii]+2, "help") == 0)
160 system("less manual.txt");
165 fprintf(stderr, "ARGUMENT_ERROR - Unrecognised switch \"%s\"...\n", argv[ii]);
175 else if (blue == NULL)
179 fprintf(stderr, "ARGUMENT_ERROR - Unexpected argument \"%s\"...\n", argv[ii]);
187 if (inputFile == NULL)
189 if (red == NULL || blue == NULL) //Not enough arguments
191 fprintf(stderr, "ARGUMENT_ERROR - Did not recieve enough players (did you mean to use the -f switch?)\n");
194 Game::theGame = new Game(red,blue, graphics, timeout, allowIllegal,log, reveal,maxTurns, printBoard);
198 Game::theGame = new Game(inputFile, graphics, timeout, allowIllegal,log, reveal,maxTurns, printBoard);
201 if (Game::theGame == NULL)
203 fprintf(stderr,"INTERNAL_ERROR - Error creating Game!\n");
208 return Game::theGame->Setup(red, blue);
213 void PrintResults(const MovementResult & result, string & buffer)
216 switch (Game::theGame->Turn())
219 s << Game::theGame->red->name << " RED ";
222 s << Game::theGame->blue->name << " BLUE ";
225 s << "neither BOTH ";
228 s << "neither NONE ";
232 if (!Board::LegalResult(result) && result != MovementResult::BAD_SETUP)
234 else if (!Board::HaltResult(result))
235 s << "INTERNAL_ERROR ";
240 case MovementResult::VICTORY:
243 case MovementResult::SURRENDER:
246 case MovementResult::DRAW:
249 case MovementResult::DRAW_DEFAULT:
250 s << "DRAW_DEFAULT ";
252 case MovementResult::BAD_SETUP:
253 s << "BOTH_ILLEGAL ";
256 s << "INTERNAL_ERROR ";
261 s << Game::theGame->TurnCount() << " " << Game::theGame->theBoard.TotalPieceValue(Piece::RED) << " " << Game::theGame->theBoard.TotalPieceValue(Piece::BLUE);
270 delete Game::theGame;
271 Game::theGame = NULL;