diff options
Diffstat (limited to 'kenolaba/Move.h')
-rw-r--r-- | kenolaba/Move.h | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/kenolaba/Move.h b/kenolaba/Move.h new file mode 100644 index 00000000..1226d969 --- /dev/null +++ b/kenolaba/Move.h @@ -0,0 +1,132 @@ +/* Classes Move, MoveList + * - represents a move in the game of Abalone + * + * Josef Weidendorfer, 28.8.97 +*/ + +#ifndef _MOVE_H_ +#define _MOVE_H_ + +#include <qstring.h> + +class Move +{ + public: + + /* Type of move: Moves are searched in this order */ + enum MoveType { out2 = 0, out1with3, out1with2, push2, + push1with3, push1with2, move3, left3, right3, + left2, right2, move2, move1, none }; + enum { typeCount = none }; + + Move() { type = none; } + Move(short f, char d, MoveType t) + { field = f; direction = d, type = t; } + + + bool isOutMove() const + { return type <= out1with2; } + bool isPushMove() const + { return type <= push1with2; } + static int maxOutType() + { return out1with2; } + static int maxPushType() + { return push1with2; } + static int maxMoveType() + { return move1; } + + QString name() const; + + void print() const; + + /* Directions */ + enum { Right=1, RightDown, LeftDown, Left, LeftUp, RightUp }; + + short field; + unsigned char direction; + MoveType type; +}; + +/** + * Class MoveTypeCounter + * + * Used in Board evaluation to count types of board allowed + * in a position + */ +class MoveTypeCounter +{ + public: + MoveTypeCounter(); + ~MoveTypeCounter() {} + + void init(); + void incr(int t) { count[t]++; } + int get(int t) { return count[t]; } + int sum(); + + private: + int count[Move::typeCount]; +}; + +/** + * Class InARowCounter + * + * Used in Board evaluation to count connectiveness + * of some degrees in a position + */ +class InARowCounter +{ + public: + enum InARowType { inARow2 = 0, inARow3, inARow4, inARow5, inARowCount }; + + InARowCounter(); + ~InARowCounter() {} + + void init(); + void incr(int c) { count[c]++; } + int get(int c) { return count[c]; } + + private: + int count[inARowCount]; +}; + + +/* MoveList stores a fixed number of moves (for efficince) + * <getNext> returns reference of next move ordered according to type + * <insert> does nothing if there isn't enough free space + * + * Recommend usage (* means 0 or more times): + * [ clear() ; insert() * ; isElement() * ; getNext() * ] * + */ +class MoveList +{ + public: + MoveList(); + + enum { MaxMoves = 150 }; + + /* for isElement: search for moves starting with 1/2/3 fields */ + enum { all , start1, start2, start3 }; + + void clear(); + void insert(Move); + bool isElement(int f); + bool isElement(Move&, int startType, bool del=false); + void insert(short f, char d, Move::MoveType t) + { insert( Move(f,d,t) ); } + int getLength() + { return nextUnused; } + + bool getNext(Move&,int maxType); /* returns false if no more moves */ + + private: + Move move[MaxMoves]; + int next[MaxMoves]; + int first[Move::typeCount]; + int last[Move::typeCount]; + int actual[Move::typeCount]; + int nextUnused, actualType; +}; + +#endif /* _MOVE_H_ */ + |