Go to the documentation of this file.00001
00002
00003 #include "osl/mobility/mobilityTable.h"
00004 #include "osl/ptypeTable.h"
00005 #include "osl/boardTable.h"
00006
00007 osl::mobility::MobilityTable::MobilityTable(osl::state::SimpleState const& state)
00008 {
00009 for(int num=32;num<=39;num++){
00010 osl::Piece p=state.pieceOf(num);
00011 if(!p.isOnBoard()) continue;
00012 int moveMask=Ptype_Table.getMoveMask(p.ptype());
00013 for(int i=0;i<8;i++){
00014 Direction d=static_cast<Direction>(i);
00015 if(p.owner()==WHITE) d=inverse(d);
00016 d=shortToLong(d);
00017 if((moveMask&dirToMask(d))==0) continue;
00018 Offset o=Board_Table.getOffsetForBlack(static_cast<Direction>(i));
00019 Square pos=p.square()+o;
00020 for(;state.pieceAt(pos).isEmpty();pos+=o) ;
00021 if(state.pieceAt(pos)==Piece::EDGE()) pos-=o;
00022 this->set(static_cast<Direction>(i),num,pos);
00023 }
00024 }
00025 }
00026
00027 std::ostream& osl::mobility::operator<<(std::ostream& os,osl::mobility::MobilityContent const& mc)
00028 {
00029 os << "[";
00030 for(int i=0;i<7;i++) os << mc.get(static_cast<Direction>(i)) << ",";
00031 return os << mc.get(static_cast<Direction>(7)) << "]";
00032 }
00033
00034 std::ostream& osl::mobility::operator<<(std::ostream& os,osl::mobility::MobilityTable const& mt)
00035 {
00036 os << "MobilityTable(\n";
00037 for(int num=32;num<=39;num++){
00038 os << "num=" << num << ",[";
00039 for(int i=0;i<8;i++){
00040 Direction d=static_cast<Direction>(i);
00041 os << " " << mt.get(d,num);
00042 }
00043 os << "]\n";
00044 }
00045 return os << ")" << std::endl;
00046 }
00047
00048 bool osl::mobility::operator==(MobilityTable const& mt1, MobilityTable const& mt2)
00049 {
00050 for(int num=32;num<=39;num++){
00051 for(int i=0;i<8;i++){
00052 Direction d=static_cast<Direction>(i);
00053 if(mt1.get(d,num)!=mt2.get(d,num) ) return false;
00054 }
00055 }
00056 return true;
00057 }
00058
00059
00060
00061
00062
00063