00001
00002
00003 #include "osl/eval/ppair/piecePairPieceEval.h"
00004 #include "osl/eval/ppair/piecePairRawEval.h"
00005 #include "osl/eval/ppair/piecePairEval.tcc"
00006 #include "osl/eval/ppair/piecePairWithStand.tcc"
00007 #include "osl/eval/pieceEval.h"
00008
00009 namespace osl
00010 {
00011 namespace eval
00012 {
00013 namespace ppair
00014 {
00015 template class PiecePairEvalTableBase<PiecePairPieceTable>;
00016 template class PiecePairEval<PiecePairWithStand<PiecePairPieceTable>,PiecePairPieceTable>;
00017 template class PiecePairWithStand<PiecePairPieceTable>;
00018 }
00019 }
00020 }
00021
00022 osl::eval::ppair::
00023 PiecePairPieceTable::PiecePairPieceTable()
00024 {
00025 }
00026
00027 osl::eval::ppair::
00028 PiecePairPieceTable::~PiecePairPieceTable()
00029 {
00030 }
00031
00032
00033 bool osl::eval::ppair::
00034 PiecePairPieceTable::
00035 setUp(const char *filename) const
00036 {
00037 if (! PiecePairRawEval::setUp(filename))
00038 return false;
00039
00040 for (unsigned int i=0; i<maxPairIndex; ++i)
00041 {
00042 values[i] = PiecePairRawTable::Table.value(i)
00043 *128/100;
00044 }
00045
00046 for (int y=1; y<=9; ++y)
00047 {
00048 for (int x=1; x<=9; ++x)
00049 {
00050 const Position position(x,y);
00051 for (int p=PTYPEO_MIN; p<=PTYPEO_MAX; ++p)
00052 {
00053 const PtypeO ptypeo = static_cast<PtypeO>(p);
00054 if (! isPiece(ptypeo))
00055 continue;
00056 const unsigned int index = indexOf(position, ptypeo);
00057 values[indexOf(index, index)] += Ptype_Eval_Table.value(ptypeo);
00058 }
00059 }
00060 }
00061
00062
00063 static const CArray<Ptype,2> gold_silver = {{ GOLD, SILVER }};
00064 for (size_t i=0; i<gold_silver.size(); ++i) {
00065 const Ptype ptype = gold_silver[i];
00066
00067 for (int y=7; y<=9; ++y) {
00068 Position right(1,y), left(9,y);
00069 unsigned int index_r = indexOf(right, newPtypeO(BLACK, ptype));
00070 unsigned int index_l = indexOf(left, newPtypeO(BLACK, ptype));
00071 values[selfIndexOf(index_r)] = values[selfIndexOf(index_r)]*4/5;
00072 values[selfIndexOf(index_l)] = values[selfIndexOf(index_l)]*4/5;
00073
00074 right = right.rotate180();
00075 left = left.rotate180();
00076 index_r = indexOf(right, newPtypeO(WHITE, ptype));
00077 index_l = indexOf(left, newPtypeO(WHITE, ptype));
00078 values[selfIndexOf(index_r)] = values[selfIndexOf(index_r)]*4/5;
00079 values[selfIndexOf(index_l)] = values[selfIndexOf(index_l)]*4/5;
00080 }
00081 for (int x=1; x<=9; ++x) {
00082 Position top(x,1);
00083 unsigned int index = indexOf(top, newPtypeO(BLACK, ptype));
00084 values[selfIndexOf(index)] = values[selfIndexOf(index)] * 2/3;
00085
00086 top = top.rotate180();
00087 index = indexOf(top, newPtypeO(WHITE, ptype));
00088 values[selfIndexOf(index)] = values[selfIndexOf(index)] * 2/3;
00089 }
00090 }
00091 for (int y=1; y<=6; ++y) {
00092 for (int x=1; x<=9; ++x) {
00093 Position out(x,y);
00094 unsigned int index = indexOf(out, newPtypeO(BLACK, GOLD));
00095 values[selfIndexOf(index)] = values[selfIndexOf(index)] * 6/7;
00096
00097 out = out.rotate180();
00098 index = indexOf(out, newPtypeO(WHITE, GOLD));
00099 values[selfIndexOf(index)] = values[selfIndexOf(index)] * 6/7;
00100 }
00101 }
00102 for (int y=7; y<=9; ++y) {
00103 Position right(2,y), left(8,y);
00104 unsigned int index_r = indexOf(right, newPtypeO(BLACK, GOLD));
00105 unsigned int index_l = indexOf(left, newPtypeO(BLACK, GOLD));
00106 values[selfIndexOf(index_r)] = values[selfIndexOf(index_r)]*7/8;
00107 values[selfIndexOf(index_l)] = values[selfIndexOf(index_l)]*7/8;
00108
00109 right = right.rotate180();
00110 left = left.rotate180();
00111 index_r = indexOf(right, newPtypeO(WHITE, GOLD));
00112 index_l = indexOf(left, newPtypeO(WHITE, GOLD));
00113 values[selfIndexOf(index_r)] = values[selfIndexOf(index_r)]*7/8;
00114 values[selfIndexOf(index_l)] = values[selfIndexOf(index_l)]*7/8;
00115 }
00116 return true;
00117 }
00118
00119
00120
00121
00122
00123