X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=inline;f=manager%2Fcontroller.cpp;h=3a78e9b902e82349e789f6fce0a46ef70782143f;hb=HEAD;hp=7325ec75a15b950acac605f37feea264a3d68db5;hpb=53a666903d770b14969f542d6548e267e5017b31;p=progcomp2012.git diff --git a/manager/controller.cpp b/manager/controller.cpp deleted file mode 100644 index 7325ec7..0000000 --- a/manager/controller.cpp +++ /dev/null @@ -1,183 +0,0 @@ -#include - -#include "stratego.h" - -#include "controller.h" - -using namespace std; - -/** - * Queries the AI program to setup its pieces - * @param opponentName - string containing the name/id of the opponent AI program - * @returns the result of the response - */ -MovementResult Controller::Setup(const char * opponentName) -{ - int y; - switch (colour) - { - case Piece::RED: - assert(SendMessage("RED %s %d %d", opponentName, Board::theBoard.Width(), Board::theBoard.Height())); - y = 0; - - break; - case Piece::BLUE: - assert(SendMessage("BLUE %s %d %d", opponentName, Board::theBoard.Width(), Board::theBoard.Height())); - y = Board::theBoard.Height()-4; - - break; - case Piece::NONE: - case Piece::BOTH: - //Should never see this; - assert(false); - break; - } - - - int usedUnits[(int)(Piece::BOMB)]; - for (int ii = 0; ii <= (int)(Piece::BOMB); ++ii) - usedUnits[ii] = 0; - - //The setup is spread across 4 lines of the board - blue at the top, red at the bottom. AI has 2.5s for each line. - - - - - for (int ii=0; ii < 4; ++ii) - { - string line=""; - if (!GetMessage(line, 2.5)) - { - fprintf(stderr, "Timeout on setup\n"); - return MovementResult::BAD_RESPONSE; - } - if ((int)(line.size()) != Board::theBoard.Width()) - { - fprintf(stderr, "Bad length of \"%s\" on setup\n", line.c_str()); - return MovementResult::BAD_RESPONSE; - } - - for (int x = 0; x < (int)(line.size()); ++x) - { - Piece::Type type = Piece::GetType(line[x]); - if (type != Piece::NOTHING) - { -//fprintf(stderr, "x y %d %d\n", x, y+ii); -// fprintf(stderr, "Found unit of type '%c' (%d '%c') %d vs %d\n", line[x], (int)(type), Piece::tokens[(int)(type)], usedUnits[(int)(type)], Piece::maxUnits[(int)type]); - /// fprintf(stderr, "Marshal is %d '%c', flag is %d '%c'\n", (int)Piece::MARSHAL, Piece::tokens[(int)(Piece::MARSHAL)], (int)Piece::FLAG, Piece::tokens[(int)(Piece::FLAG)]); - - usedUnits[(int)(type)] += 1; - if (usedUnits[type] > Piece::maxUnits[(int)type]) - { - fprintf(stderr, "Too many units of type %c\n", Piece::tokens[(int)(type)]); - return MovementResult::BAD_RESPONSE; - } - - Board::theBoard.AddPiece(x, y+ii, type, colour); - } - } - } - - if (usedUnits[(int)Piece::FLAG] <= 0) - { - return MovementResult::BAD_RESPONSE; //You need to include a flag! - } - - return MovementResult::OK; -} - - -/** - * Queries the AI program to respond to a state of Board::theBoard - * @returns The result of the response and/or move if made - */ -MovementResult Controller::MakeMove(string & buffer) -{ - - if (!Running()) - return MovementResult::NO_MOVE; //AI has quit - Board::theBoard.Print(output, colour); - - - - - buffer.clear(); - if (!GetMessage(buffer,2)) - { - return MovementResult::NO_MOVE; //AI did not respond. It will lose by default. - } - - int x; int y; string direction=""; - stringstream s(buffer); - s >> x; - s >> y; - - - s >> direction; - Board::Direction dir; - if (direction == "UP") - { - dir = Board::UP; - } - else if (direction == "DOWN") - { - dir = Board::DOWN; - } - else if (direction == "LEFT") - { - dir = Board::LEFT; - } - else if (direction == "RIGHT") - { - dir = Board::RIGHT; - } - else - { - fprintf(stderr, "BAD_RESPONSE \"%s\"\n", buffer.c_str()); - return MovementResult::BAD_RESPONSE; //AI gave bogus direction - it will lose by default. - } - - int multiplier = 1; - if (s.peek() != EOF) - s >> multiplier; - MovementResult moveResult = Board::theBoard.MovePiece(x, y, dir, multiplier, colour); - - s.clear(); s.str(""); - - //I stored the ranks in the wrong order; rank 1 is the marshal, 2 is the general etc... - //So I am reversing them in the output... great work - s << (Piece::BOMB - moveResult.attackerRank) << " " << (Piece::BOMB - moveResult.defenderRank); - switch (moveResult.type) - { - case MovementResult::OK: - buffer += " OK"; - break; - case MovementResult::VICTORY: - buffer += " FLAG"; - break; - case MovementResult::KILLS: - buffer += " KILLS "; - buffer += s.str(); - - break; - case MovementResult::DIES: - buffer += " DIES "; - buffer += s.str(); - break; - case MovementResult::BOTH_DIE: - buffer += " BOTHDIE "; - buffer += s.str(); - break; - default: - buffer += " ILLEGAL"; - break; - - } - - if (!Board::LegalResult(moveResult)) - return MovementResult::OK; //HACK - Legal results returned! - else - return moveResult; - -} -