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