6 #include "controller.h"
13 #define theBoard Board::theBoard
16 bool CheckForQuitWhilstWaiting(int wait);
25 void BrokenPipe(int sig);
27 int main(int argc, char ** argv)
32 for (int y = 4; y < 6; ++y)
34 for (int x = 2; x < 4; ++x)
36 theBoard.AddPiece(x,y,Piece::BOULDER, Piece::NONE);
38 for (int x = 6; x < 8; ++x)
40 theBoard.AddPiece(x,y,Piece::BOULDER, Piece::NONE);
45 red = new Controller(Piece::RED, argv[1]);
46 blue = new Controller(Piece::BLUE, argv[2]);
48 signal(SIGPIPE, BrokenPipe);
50 MovementResult redSetup = red->Setup(argv[2]);
51 MovementResult blueSetup = blue->Setup(argv[1]);
52 if (redSetup != MovementResult::OK)
54 fprintf(stderr, "Blue wins by DEFAULT!\n");
55 red->SendMessage("ILLEGAL");
56 blue->SendMessage("DEFAULT");
59 if (blueSetup != MovementResult::OK)
61 fprintf(stderr, "Red wins by DEFAULT!\n");
62 red->SendMessage("DEFAULT");
63 blue->SendMessage("ILLEGAL");
67 MovementResult result(MovementResult::OK);
72 if (!Graphics::Initialised())
73 Graphics::Initialise("Stratego", theBoard.Width()*32, theBoard.Height()*32);
79 red->SendMessage("START");
81 while (Board::LegalResult(result))
86 fprintf(stderr, "%d RED: ", count);
87 result = red->MakeMove(buffer);
88 red->SendMessage(buffer);
89 blue->SendMessage(buffer);
90 fprintf(stderr, "%s\n", buffer.c_str());
91 if (!Board::LegalResult(result))
94 Board::theBoard.Draw();
95 if (CheckForQuitWhilstWaiting(0.5))
97 red->SendMessage("QUIT");
98 blue->SendMessage("QUIT");
104 fprintf(stderr, "%d BLU: ", count);
105 result = blue->MakeMove(buffer);
106 blue->SendMessage(buffer);
107 red->SendMessage(buffer);
108 fprintf(stderr, "%s\n", buffer.c_str());
110 if (!Board::LegalResult(result))
116 Board::theBoard.Draw();
117 if (CheckForQuitWhilstWaiting(0.5))
119 red->SendMessage("QUIT");
120 blue->SendMessage("QUIT");
124 Board::theBoard.Print(stderr);
132 printf("Final board state\n");
134 Board::theBoard.Draw();
136 if (CheckForQuitWhilstWaiting(4))
138 red->SendMessage("QUIT");
139 blue->SendMessage("QUIT");
144 Board::theBoard.Print(stderr);
149 if (turn == Piece::RED)
151 fprintf(stderr,"Game ends on RED's turn - REASON: ");
153 else if (turn == Piece::BLUE)
155 fprintf(stderr,"Game ends on BLUE's turn - REASON: ");
159 fprintf(stderr,"Game ends on ERROR's turn - REASON: ");
164 case MovementResult::NO_BOARD:
165 fprintf(stderr,"Board does not exit?!\n");
167 case MovementResult::INVALID_POSITION:
168 fprintf(stderr,"Coords outside board\n");
170 case MovementResult::NO_SELECTION:
171 fprintf(stderr,"Move does not select a piece\n");
173 case MovementResult::NOT_YOUR_UNIT:
174 fprintf(stderr,"Selected piece belongs to other player\n");
176 case MovementResult::IMMOBILE_UNIT:
177 fprintf(stderr,"Selected piece is not mobile (FLAG or BOMB)\n");
179 case MovementResult::INVALID_DIRECTION:
180 fprintf(stderr,"Selected unit cannot move that way\n");
182 case MovementResult::POSITION_FULL:
183 fprintf(stderr,"Attempted move into square occupied by allied piece\n");
185 case MovementResult::VICTORY:
186 fprintf(stderr,"Captured the flag\n");
188 case MovementResult::BAD_RESPONSE:
189 fprintf(stderr,"Unintelligable response\n");
191 case MovementResult::NO_MOVE:
192 fprintf(stderr,"Did not make a move (may have exited)\n");
205 bool CheckForQuitWhilstWaiting(int wait)
209 TimerThread timer(wait*1000000); //Wait in seconds
211 while (!timer.Finished())
214 while (SDL_PollEvent(&event))
235 void BrokenPipe(int sig)
237 if (turn == Piece::RED)
239 fprintf(stderr,"Game ends on RED's turn - REASON: Broken pipe\n");
240 blue->SendMessage("DEFAULT");
242 else if (turn == Piece::BLUE)
244 fprintf(stderr,"Game ends on BLUE's turn - REASON: Broken pipe\n");
245 red->SendMessage("DEFAULT");
249 fprintf(stderr,"Game ends on ERROR's turn - REASON: Broken pipe\n");
252 Board::theBoard.Draw();
255 if (CheckForQuitWhilstWaiting(4000))
257 red->SendMessage("QUIT");
258 blue->SendMessage("QUIT");