X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=progcomp%2Fjudge%2Fmanager%2Fstratego.h;fp=progcomp%2Fjudge%2Fmanager%2Fstratego.h;h=fe73aa13ff0b4311c3d10acea02c493f9b6dd610;hb=88fc5a96c424e9a451b98f3b680bc1980345320d;hp=0000000000000000000000000000000000000000;hpb=e3b15cd5dea739f7523920d83bda592db95a7b93;p=progcomp2012.git diff --git a/progcomp/judge/manager/stratego.h b/progcomp/judge/manager/stratego.h new file mode 100644 index 0000000..fe73aa1 --- /dev/null +++ b/progcomp/judge/manager/stratego.h @@ -0,0 +1,156 @@ +#ifndef STRATEGO_H +#define STRATEGO_H + +#include +#include + +#include + + + #include "graphics.h" + #include "array.h" + +#include + +/** + * Contains classes for a game of Stratego + */ + + +/** + * Class for a game piece + */ +class Piece +{ + public: + typedef enum {ERROR=14,BOMB=13,MARSHAL=12, GENERAL=11, COLONEL=10, MAJOR=9, CAPTAIN=8, LIEUTENANT=7, SERGEANT=6, MINER=5, SCOUT=4, SPY=3, FLAG=2,BOULDER=1, NOTHING=0} Type; //Type basically defines how strong the piece is + + + + typedef enum {RED=0, BLUE=1, NONE=2, BOTH=3} Colour; //Used for the allegiance of the pieces - terrain counts as NONE. + + Piece(const Type & newType, const Colour & newColour) : type(newType), colour(newColour), beenRevealed(false) {} + virtual ~Piece() {} + + + //Operators compare the strength of two pieces + bool operator==(const Piece & equ) const {return type == equ.type;} + bool operator<(const Piece & equ) const {return type < equ.type;} + bool operator>(const Piece & equ) const {return type > equ.type;} + + bool operator!=(const Piece & equ) const {return !operator==(equ);} + bool operator<=(const Piece & equ) const {return (operator<(equ) || operator==(equ));} + bool operator>=(const Piece & equ) const {return (operator>(equ) || operator==(equ));} + + //Contains the characters used to identify piece types when the board is printed to a stream + static char tokens[]; + static int maxUnits[]; + + static Type GetType(char fromToken); + + int PieceValue() const {if (type == BOMB || type == FLAG) {return 0;} return (int)(type) - (int)(SPY) + 1;} + + //Attributes of the piece + const Type type; + const Colour colour; + + bool beenRevealed; + + public: + + class TextureManager : public Graphics::TextureManager, private Array + { + public: + TextureManager() : Graphics::TextureManager(), Array() {} + virtual ~TextureManager(); + + virtual Texture & operator[](const LUint & at); + }; + static TextureManager textures; + + static Graphics::Colour GetGraphicsColour(const Piece::Colour & colour) + { + switch (colour) + { + case RED: + return Graphics::Colour(1,0,0); + break; + case BLUE: + return Graphics::Colour(0,0,1); + break; + case NONE: + return Graphics::Colour(0.5,0.5,0.5); + break; + case BOTH: + return Graphics::Colour(1,0,1); + break; + } + } + + + + + +}; + +#include "movementresult.h" + +/** + * A Stratego board + */ +class Board +{ + public: + Board(int newWidth, int newHeight); //Constructor + + virtual ~Board(); //Destructor + + void Print(FILE * stream, const Piece::Colour & reveal=Piece::BOTH); //Print board + void PrintPretty(FILE * stream, const Piece::Colour & reveal=Piece::BOTH); //Print board using colour + + void Draw(const Piece::Colour & reveal=Piece::BOTH, bool showRevealed = true); //Draw board + + + bool AddPiece(int x, int y, const Piece::Type & newType, const Piece::Colour & newColour); //Add piece to board + + + Piece * GetPiece(int x, int y); //Retrieve piece from a location on the board + + + typedef enum {UP, DOWN, LEFT, RIGHT} Direction; + + + + static bool LegalResult(const MovementResult & result) + { + return (result == MovementResult::OK || result == MovementResult::DIES || result == MovementResult::KILLS || result == MovementResult::BOTH_DIE || result == MovementResult::VICTORY || result == MovementResult::DRAW || result == MovementResult::DRAW_DEFAULT || result == MovementResult::SURRENDER); + } + + static bool HaltResult(const MovementResult & result) + { + return (result == MovementResult::VICTORY || result == MovementResult::DRAW || result == MovementResult::DRAW_DEFAULT || result == MovementResult::SURRENDER || !LegalResult(result)); + } + + MovementResult MovePiece(int x, int y, const Direction & direction, int multiplier=1,const Piece::Colour & colour=Piece::NONE); //Move piece from position in direction + + + Piece::Colour winner; + + int Width() const {return width;} + int Height() const {return height;} + + int MobilePieces(const Piece::Colour & colour) const; + int TotalPieceValue(const Piece::Colour & colour) const; + bool RemovePiece(Piece * piece); + private: + int width; + int height; + Piece ** * board; + std::vector pieces; +}; + +#endif //STRATEGO_H + +//EOF + +