00001 /* effectedNumTable.cc 00002 */ 00003 #include "osl/bits/effectedNumTable.h" 00004 #include "osl/bits/ptypeTable.h" 00005 #include "osl/bits/boardTable.h" 00006 #include <iostream> 00007 00008 void 00009 osl::effect::EffectedNumTable::clear() 00010 { 00011 for(int i=0;i<40;i++) contents[i].clear(); 00012 } 00013 00014 osl::effect::EffectedNumTable::EffectedNumTable(SimpleState const& state) 00015 { 00016 clear(); 00017 for(int num=32;num<=39;num++){ 00018 osl::Piece p=state.pieceOf(num); 00019 if(!p.isOnBoard()) continue; 00020 int moveMask=Ptype_Table.getMoveMask(p.ptype()); 00021 for(int i=0;i<8;i++){ 00022 Direction d=static_cast<Direction>(i); 00023 if(p.owner()==WHITE) d=inverse(d); 00024 Direction longD=shortToLong(d); 00025 if((moveMask&dirToMask(longD))==0) continue; 00026 Offset o=Board_Table.getOffsetForBlack(static_cast<Direction>(i)); 00027 Square pos=p.square()+o; 00028 Piece p1; 00029 for(;(p1=state.pieceAt(pos)).isEmpty();pos+=o) ; 00030 if(pos.isEdge()) continue; 00031 int num1=p1.number(); 00032 contents[num1][static_cast<Direction>(i)]=num1; 00033 } 00034 } 00035 } 00036 00037 std::ostream& osl::effect::operator<<(std::ostream& os,osl::EffectedNumTable const& et) 00038 { 00039 os << "[\n"; 00040 for(int num=0;num<=39;num++){ 00041 os << " ["; 00042 for(int d=0;d<7;d++) os << et[num][static_cast<Direction>(d)] << ","; 00043 os << et[num][static_cast<Direction>(7)] << "],\n"; 00044 } 00045 return os << "]\n"; 00046 } 00047 bool osl::effect::operator==(EffectedNumTable const& e1, EffectedNumTable const& e2) 00048 { 00049 for(int i=0;i<8;i++){ 00050 for(int num=0;num<=39;num++){ 00051 if(e1[num][static_cast<Direction>(i)]!=e2[num][static_cast<Direction>(i)]) return false; 00052 } 00053 } 00054 return true; 00055 }