00001
00002
00003 #ifndef BOARD_TABLE_H
00004 #define BOARD_TABLE_H
00005
00006 #include "osl/direction.h"
00007 #include "osl/misc/carray.h"
00008 #include "osl/offset32.h"
00009
00010 namespace osl
00011 {
00012 class BoardTable
00013 {
00014 CArray<Direction,Offset32::SIZE> directions;
00015 CArray<Offset, Offset32::SIZE> short_offsets;
00016 CArray<Offset, Offset32::SIZE> short_offsets_not_knight;
00017 public:
00018 static const CArray<Offset, DIRECTION_SIZE> offsets;
00019 static const CArray<int, DIRECTION_SIZE> dxs;
00020 static const CArray<int, DIRECTION_SIZE> dys;
00021 private:
00022 template<Direction Dir>
00023 void setDirections();
00024 template<Direction Dir>
00025 void setKnightDirections();
00026 void init();
00027 public:
00031 const Offset getOffsetForBlack(Direction dir) const{
00032 return offsets[static_cast<int>(dir)];
00033 }
00034 int getDxForBlack(Direction dir) const{
00035 return dxs[static_cast<int>(dir)];
00036 }
00037 int getDyForBlack(Direction dir) const{
00038 return dys[static_cast<int>(dir)];
00039 }
00040 template<Player P>
00041 const Offset getOffset(Direction dir) const{
00042 return getOffsetForBlack(dir)*playerToMul(P);
00043 }
00044 const Offset getOffset(Player pl,Direction dir) const{
00045 if (pl==BLACK)
00046 return getOffset<BLACK>(dir);
00047 else
00048 return getOffset<WHITE>(dir);
00049 }
00050
00055 const Position nextPosition(Player P, Position pos, Direction dr) const
00056 {
00057 assert(pos.isOnBoard());
00058 const Offset offset = getOffset(P, dr);
00059 return pos + offset;
00060 }
00061
00062 BoardTable();
00064 template <Player P>
00065 Direction getLongDirection(Offset32 offset32) const
00066 {
00067 assert(offset32.isValid());
00068 const Offset32 blackOffset32 = offset32.blackOffset32<P>();
00069 Direction ret=directions[blackOffset32.index()];
00070 assert(isValid(ret));
00071 return ret;
00072 }
00074 template <Player P>
00075 Direction getLongDirection(Position from, Position to) const
00076 {
00077 return getLongDirection<P>(Offset32(to,from));
00078 }
00084 const Offset getShortOffset(Offset32 offset32) const{
00085 assert(offset32.isValid());
00086 return short_offsets[offset32.index()];
00087 }
00093 const Offset getShortOffsetNotKnight(Offset32 offset32) const{
00094 assert(offset32.isValid());
00095 return short_offsets_not_knight[offset32.index()];
00096 }
00101 bool isBetween(Position t,Position p0,Position p1) const
00102 {
00103 Offset offset0=getShortOffsetNotKnight(Offset32(p0,t));
00104 Offset offset1=getShortOffsetNotKnight(Offset32(p1,t));
00105 assert(!offset0.zero() || !offset1.zero());
00106 return (-offset0)==offset1;
00107 }
00108 };
00109
00110 extern const BoardTable Board_Table;
00111 }
00112
00113
00114 #endif
00115
00116
00117
00118