00001 #include "osl/effect/boardBitMask.h"
00002 #include "osl/ptype.h"
00003 #include "osl/ptypeTable.h"
00004 #include <iostream>
00005
00006 namespace osl
00007 {
00008 namespace effect
00009 {
00010
00011 std::ostream& operator<<(std::ostream& os,BoardBitMask const& boardBitMask){
00012 os << "[";
00013 for(int i=15;i>=0;i--){
00014 unsigned char uc=boardBitMask.bMask[i];
00015 for(int j=7;j>=0;j--){
00016 if((uc&(1<<j))!=0) os << "1";
00017 else os<<"0";
00018 }
00019 os<<" ";
00020 }
00021 return os << "]";
00022 }
00023
00024
00025 void BoardBitMaskTable::initMaskOfPosition(){
00026 for(int i=0;i<Position::SIZE;i++){
00027 maskOfPosition[i].clearAll();
00028 }
00029 for(int y=1;y<=9;y++)
00030 for(int x=1;x<=9;x++){
00031 Position pos(x,y);
00032 maskOfPosition[pos.index()].setBit(BoardBitMask::positionToOffset(pos));
00033 }
00034 }
00035
00036 static void setBetweenMask(BoardBitMask& mask,Position from,Position to,
00037 Ptype ptype){
00038 const EffectContent effect=Ptype_Table.getEffect(newPtypeO(BLACK,ptype),Offset32(to,from));
00039 if(!effect.hasBlockableEffect()) return;
00040 const Offset offset=effect.offset();
00041 mask.clearAll();
00042 for(Position pos=from+offset;pos!=to;pos+=offset){
00043 mask.setBit(pos);
00044 }
00045 }
00046 void BoardBitMaskTable::initBetweenMask(){
00047 for(int j=0;j<Position::SIZE;j++){
00048 for(int i=0;i<Position::SIZE;i++){
00049 rookBetweenMask[i][j].setAll();
00050 lanceBetweenMask[i][j].setAll();
00051 bishopBetweenMask[i][j].setAll();
00052 }
00053 }
00054 for(int y1=1;y1<=9;y1++)
00055 for(int x1=1;x1<=9;x1++){
00056 Position from(x1,y1);
00057 for(int y2=1;y2<=9;y2++)
00058 for(int x2=1;x2<=9;x2++){
00059 Position to(x2,y2);
00063 setBetweenMask(lanceBetweenMask[from.index()][to.index()],from,to,LANCE);
00064 setBetweenMask(bishopBetweenMask[from.index()][to.index()],from,to,BISHOP);
00065 setBetweenMask(rookBetweenMask[from.index()][to.index()],from,to,ROOK);
00066 }
00067 }
00068 }
00069
00070 BoardBitMaskTable::BoardBitMaskTable(){
00071 initMaskOfPosition();
00072 initBetweenMask();
00073 }
00074 }
00075 }