Mostly messing with "forfax" AI
[progcomp2012.git] / manager / main.cpp
index 96569eb..e3e435e 100644 (file)
@@ -18,38 +18,45 @@ using namespace std;
 
 Controller * red;
 Controller * blue;
+Colour turn;
 
 void cleanup();
+
+void BrokenPipe(int sig);
+
 int main(int argc, char ** argv)
 {
        assert(argc == 3);
        
-       for (int y = 5; y < 9; ++y)
+       
+       for (int y = 4; y < 6; ++y)
        {
-               for (int x = 3; x < 5; ++x)
+               for (int x = 2; x < 4; ++x)
                {
                        theBoard.AddPiece(x,y,Piece::BOULDER, Piece::NONE);
                }
-               for (int x = 9; x < 11; ++x)
+               for (int x = 6; x < 8; ++x)
                {
                        theBoard.AddPiece(x,y,Piece::BOULDER, Piece::NONE);
                }
        }
+       
 
        red = new Controller(Piece::RED, argv[1]);
        blue = new Controller(Piece::BLUE, argv[2]);
        atexit(cleanup);
+       signal(SIGPIPE, BrokenPipe);
 
-       Board::MovementResult redSetup = red->Setup(argv[2]);
-       Board::MovementResult blueSetup = blue->Setup(argv[1]);
-       if (redSetup != Board::OK)
+       MovementResult redSetup = red->Setup(argv[2]);
+       MovementResult blueSetup = blue->Setup(argv[1]);
+       if (redSetup != MovementResult::OK)
        {
                fprintf(stderr, "Blue wins by DEFAULT!\n");
                red->SendMessage("ILLEGAL");
                blue->SendMessage("DEFAULT");
                exit(EXIT_SUCCESS);
        }
-       if (blueSetup != Board::OK)
+       if (blueSetup != MovementResult::OK)
        {
                fprintf(stderr, "Red wins by DEFAULT!\n");
                red->SendMessage("DEFAULT");
@@ -57,7 +64,7 @@ int main(int argc, char ** argv)
                exit(EXIT_SUCCESS);
        }
 
-       Board::MovementResult result = Board::OK;
+       MovementResult result(MovementResult::OK);
        system("clear");
        int count = 1;
 
@@ -70,33 +77,35 @@ int main(int argc, char ** argv)
        string buffer;
 
        red->SendMessage("START");
-       Colour turn = Piece::RED;
+       turn = Piece::RED;
        while (Board::LegalResult(result))
        {
 
-               fprintf(stderr, "This is move %d...\n", count);
-               fprintf(stderr,"---RED's turn---\n");
+               
                turn = Piece::RED;
+               fprintf(stderr, "%d RED: ", count);
                result = red->MakeMove(buffer);
                red->SendMessage(buffer);
                blue->SendMessage(buffer);
-
+               fprintf(stderr, "%s\n", buffer.c_str());
                if (!Board::LegalResult(result))
                        break;
                #ifdef GRAPHICS
                        Board::theBoard.Draw();
-                       if (CheckForQuitWhilstWaiting(0.2))
+                       if (CheckForQuitWhilstWaiting(0.5))
                        {
                                red->SendMessage("QUIT");
                                blue->SendMessage("QUIT");
                                exit(EXIT_SUCCESS);
                        }
                #endif //GRAPHICS
-               fprintf(stderr,"---BLUE's turn---\n");
+               
                turn = Piece::BLUE;
+               fprintf(stderr, "%d BLU: ", count);
                result = blue->MakeMove(buffer);
                blue->SendMessage(buffer);
                red->SendMessage(buffer);
+               fprintf(stderr, "%s\n", buffer.c_str());
 
                if (!Board::LegalResult(result))
                        break;
@@ -105,7 +114,7 @@ int main(int argc, char ** argv)
 
                #ifdef GRAPHICS
                        Board::theBoard.Draw();
-                       if (CheckForQuitWhilstWaiting(0.2))
+                       if (CheckForQuitWhilstWaiting(0.5))
                        {
                                red->SendMessage("QUIT");
                                blue->SendMessage("QUIT");
@@ -123,12 +132,14 @@ int main(int argc, char ** argv)
        printf("Final board state\n");
        #ifdef GRAPHICS
                        Board::theBoard.Draw();
+
                        if (CheckForQuitWhilstWaiting(4))
                        {
                                red->SendMessage("QUIT");
                                blue->SendMessage("QUIT");
                                exit(EXIT_SUCCESS);
                        }
+
        #else
                Board::theBoard.Print(stderr);
        #endif //GRAPHICS
@@ -148,36 +159,36 @@ int main(int argc, char ** argv)
                fprintf(stderr,"Game ends on ERROR's turn - REASON: ");
                        
        }
-       switch (result)
+       switch (result.type)
        {
-               case Board::NO_BOARD:
+               case MovementResult::NO_BOARD:
                        fprintf(stderr,"Board does not exit?!\n");
                        break;
-               case Board::INVALID_POSITION:
+               case MovementResult::INVALID_POSITION:
                        fprintf(stderr,"Coords outside board\n");
                        break;
-               case Board::NO_SELECTION:
+               case MovementResult::NO_SELECTION:
                        fprintf(stderr,"Move does not select a piece\n");
                        break;
-               case Board::NOT_YOUR_UNIT:
+               case MovementResult::NOT_YOUR_UNIT:
                        fprintf(stderr,"Selected piece belongs to other player\n");
                        break;
-               case Board::IMMOBILE_UNIT:
+               case MovementResult::IMMOBILE_UNIT:
                        fprintf(stderr,"Selected piece is not mobile (FLAG or BOMB)\n");
                        break;
-               case Board::INVALID_DIRECTION:
+               case MovementResult::INVALID_DIRECTION:
                        fprintf(stderr,"Selected unit cannot move that way\n");
                        break;
-               case Board::POSITION_FULL:
+               case MovementResult::POSITION_FULL:
                        fprintf(stderr,"Attempted move into square occupied by allied piece\n");
                        break;
-               case Board::VICTORY:
+               case MovementResult::VICTORY:
                        fprintf(stderr,"Captured the flag\n");
                        break;
-               case Board::BAD_RESPONSE:
+               case MovementResult::BAD_RESPONSE:
                        fprintf(stderr,"Unintelligable response\n");
                        break;
-               case Board::NO_MOVE:
+               case MovementResult::NO_MOVE:
                        fprintf(stderr,"Did not make a move (may have exited)\n");
                        break;
        }
@@ -221,4 +232,34 @@ void cleanup()
        delete blue;
 }
 
+void BrokenPipe(int sig)
+{
+       if (turn == Piece::RED)
+       {
+               fprintf(stderr,"Game ends on RED's turn - REASON: Broken pipe\n");
+               blue->SendMessage("DEFAULT");   
+       }
+       else if (turn == Piece::BLUE)
+       {
+               fprintf(stderr,"Game ends on BLUE's turn - REASON: Broken pipe\n");
+               red->SendMessage("DEFAULT");
+       }
+       else
+       {
+               fprintf(stderr,"Game ends on ERROR's turn - REASON: Broken pipe\n");
+                       
+       }
+                       Board::theBoard.Draw();
+                       while (true)
+                       {
+                               if (CheckForQuitWhilstWaiting(4000))
+                               {
+                               red->SendMessage("QUIT");
+                               blue->SendMessage("QUIT");
+                               exit(EXIT_SUCCESS);
+                               }
+                       }
+       exit(EXIT_SUCCESS);
+}
+       
 #endif //GRAPHICS

UCC git Repository :: git.ucc.asn.au