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)
31 for (int y = 5; y < 9; ++y)
33 for (int x = 3; x < 5; ++x)
35 theBoard.AddPiece(x,y,Piece::BOULDER, Piece::NONE);
37 for (int x = 9; x < 11; ++x)
39 theBoard.AddPiece(x,y,Piece::BOULDER, Piece::NONE);
43 red = new Controller(Piece::RED, argv[1]);
44 blue = new Controller(Piece::BLUE, argv[2]);
46 signal(SIGPIPE, BrokenPipe);
48 MovementResult redSetup = red->Setup(argv[2]);
49 MovementResult blueSetup = blue->Setup(argv[1]);
50 if (redSetup != MovementResult::OK)
52 fprintf(stderr, "Blue wins by DEFAULT!\n");
53 red->SendMessage("ILLEGAL");
54 blue->SendMessage("DEFAULT");
57 if (blueSetup != MovementResult::OK)
59 fprintf(stderr, "Red wins by DEFAULT!\n");
60 red->SendMessage("DEFAULT");
61 blue->SendMessage("ILLEGAL");
65 MovementResult result(MovementResult::OK);
70 if (!Graphics::Initialised())
71 Graphics::Initialise("Stratego", theBoard.Width()*32, theBoard.Height()*32);
77 red->SendMessage("START");
79 while (Board::LegalResult(result))
84 fprintf(stderr, "%d RED: ", count);
85 result = red->MakeMove(buffer);
86 red->SendMessage(buffer);
87 blue->SendMessage(buffer);
88 fprintf(stderr, "%s\n", buffer.c_str());
89 if (!Board::LegalResult(result))
92 Board::theBoard.Draw();
93 if (CheckForQuitWhilstWaiting(0.2))
95 red->SendMessage("QUIT");
96 blue->SendMessage("QUIT");
102 fprintf(stderr, "%d BLU: ", count);
103 result = blue->MakeMove(buffer);
104 blue->SendMessage(buffer);
105 red->SendMessage(buffer);
106 fprintf(stderr, "%s\n", buffer.c_str());
108 if (!Board::LegalResult(result))
114 Board::theBoard.Draw();
115 if (CheckForQuitWhilstWaiting(0.2))
117 red->SendMessage("QUIT");
118 blue->SendMessage("QUIT");
122 Board::theBoard.Print(stderr);
130 printf("Final board state\n");
132 Board::theBoard.Draw();
133 if (CheckForQuitWhilstWaiting(4))
135 red->SendMessage("QUIT");
136 blue->SendMessage("QUIT");
140 Board::theBoard.Print(stderr);
145 if (turn == Piece::RED)
147 fprintf(stderr,"Game ends on RED's turn - REASON: ");
149 else if (turn == Piece::BLUE)
151 fprintf(stderr,"Game ends on BLUE's turn - REASON: ");
155 fprintf(stderr,"Game ends on ERROR's turn - REASON: ");
160 case MovementResult::NO_BOARD:
161 fprintf(stderr,"Board does not exit?!\n");
163 case MovementResult::INVALID_POSITION:
164 fprintf(stderr,"Coords outside board\n");
166 case MovementResult::NO_SELECTION:
167 fprintf(stderr,"Move does not select a piece\n");
169 case MovementResult::NOT_YOUR_UNIT:
170 fprintf(stderr,"Selected piece belongs to other player\n");
172 case MovementResult::IMMOBILE_UNIT:
173 fprintf(stderr,"Selected piece is not mobile (FLAG or BOMB)\n");
175 case MovementResult::INVALID_DIRECTION:
176 fprintf(stderr,"Selected unit cannot move that way\n");
178 case MovementResult::POSITION_FULL:
179 fprintf(stderr,"Attempted move into square occupied by allied piece\n");
181 case MovementResult::VICTORY:
182 fprintf(stderr,"Captured the flag\n");
184 case MovementResult::BAD_RESPONSE:
185 fprintf(stderr,"Unintelligable response\n");
187 case MovementResult::NO_MOVE:
188 fprintf(stderr,"Did not make a move (may have exited)\n");
201 bool CheckForQuitWhilstWaiting(int wait)
205 TimerThread timer(wait*1000000); //Wait in seconds
207 while (!timer.Finished())
210 while (SDL_PollEvent(&event))
231 void BrokenPipe(int sig)
233 if (turn == Piece::RED)
235 fprintf(stderr,"Game ends on RED's turn - REASON: Broken pipe\n");
236 blue->SendMessage("DEFAULT");
238 else if (turn == Piece::BLUE)
240 fprintf(stderr,"Game ends on BLUE's turn - REASON: Broken pipe\n");
241 red->SendMessage("DEFAULT");
245 fprintf(stderr,"Game ends on ERROR's turn - REASON: Broken pipe\n");