My Project
pattern.h
Go to the documentation of this file.
1/* patternLong2.h
2 */
3#ifndef _PATTERNLONG2_H
4#define _PATTERNLONG2_H
5
8
9namespace osl
10{
11 namespace rating
12 {
14 {
15 public:
16 static const Direction INVALID = LONG_UL;
17 private:
20 bool same;
21 static const std::string name(Direction d, Direction d2, Ptype self, Ptype target, bool same);
22 public:
34 {
35 const Square p = Board_Table.nextSquare(player, start, direction);
36 if (direction2 == INVALID || ! p.isOnBoard())
37 return p;
38 return Board_Table.nextSquare(player, p, direction2);
39 }
41 {
42 return nextSquare(move.player(), move.to(), direction, direction2);
43 }
44 bool match(const NumEffectState& state, Move move, const RatingEnv& env) const
45 {
46 if (move.ptype() != self)
47 return false;
49 const Piece p = (position == move.from()) ? Piece::EMPTY() : state.pieceAt(position);
50 if (p.ptype() != target)
51 return false;
52 if (! CountEffect2::match(state, position, env))
53 return false;
54 if (!isPiece(target))
55 return true;
56 return same == (p.owner() == move.player());
57 }
58 };
59
60 typedef std::pair<Piece,Square> PieceSquare;
62 {
65 LongTarget(Ptype t, bool p, bool s, int attack, int defense)
67 {
68 }
69 static bool isPromotable(Move move, Square position)
70 {
71 assert(position.isOnBoard());
72 return position.canPromote(move.player()) || (! move.isDrop() && move.to().canPromote(move.player()));
73 }
74 bool match(const NumEffectState& state, Move move, PieceSquare p, const RatingEnv& env) const
75 {
76 if (p.first.ptype() != target)
77 return false;
78 if (target == PTYPE_EDGE)
79 return true;
80 if (isPromotable(move, p.second) != promotable)
81 return false;
82 if (! CountEffect2::match(state, p.second, env))
83 return false;
84 if (! p.first.isPiece())
85 return true;
86 return same == (p.first.owner() == move.player());
87 }
88 bool matchOtherThanPromotable(const NumEffectState& state, Move move, PieceSquare p, const RatingEnv& env) const
89 {
90 if (p.first.ptype() != target)
91 return false;
92 if (target == PTYPE_EDGE)
93 return true;
94 if (! CountEffect2::match(state, p.second, env))
95 return false;
96 if (! p.first.isPiece())
97 return true;
98 return same == (p.first.owner() == move.player());
99 }
100 const std::string name() const;
101 };
102
104 {
106 bool same;
107 LongTarget2(Ptype t, bool s) : target(t), same(s)
108 {
109 }
110 bool match(const NumEffectState&, Move move, Piece p) const
111 {
112 if (p.ptype() != target)
113 return false;
114 assert(! p.isEmpty());
115 if (! isPiece(target))
116 return true;
117 return same == (p.owner() == move.player());
118 }
119 const std::string name() const;
120 };
121
122 class PatternLong : public Feature
123 {
127 static const std::string name(Direction d, Ptype self);
128 public:
137 static const PieceSquare nextPieceOrEnd(const SimpleState& state, Square start, Player player, Direction direction);
138 static const PieceSquare nextPieceOrEnd(const SimpleState& state, Square start, Offset);
139 static const PieceSquare find(const NumEffectState& state, Move move, Direction direction);
140 bool match(const NumEffectState& state, Move move, const RatingEnv& env) const
141 {
142 if (move.ptype() != self)
143 return false;
144 PieceSquare pp = find(state, move, direction);
145 return target.match(state, move, pp, env);
146 }
147 };
148
149 class PatternLong2 : public Feature
150 {
154 static const std::string name(Direction d, Ptype self);
155 public:
157 static const Piece find(const NumEffectState& state, Move move, Direction direction)
158 {
159 Piece p = state.nextPiece(move.to(), Board_Table.getOffset(move.player(), direction));
160 if (p.isPiece() && p.square() == move.from())
161 p = state.nextPiece(move.to(), Board_Table.getOffset(move.player(), direction));
162 return p;
163 }
164 bool match(const NumEffectState& state, Move move, const RatingEnv&) const
165 {
166 if (move.ptype() != self)
167 return false;
168 const Piece p = find(state, move, direction);
169 return target2.match(state, move, p);
170 }
171 };
172
173 class PatternBlock : public Feature
174 {
177 public:
179 static const PieceSquare find(const NumEffectState& state, Move move, Ptype attacker_ptype);
180 bool match(const NumEffectState& state, Move move, const RatingEnv& env) const
181 {
182 if (move.ptype() != self)
183 return false;
184 PieceSquare pp = find(state, move, attack);
185 return ! pp.first.isEdge() && target.matchOtherThanPromotable(state, move, pp, env)
186 && pp.second.canPromote(pp.first.isPiece() ? alt(pp.first.owner()) : alt(move.player()))
188 }
189 };
190 }
191}
192
193#endif /* _PATTERNLONG2_H */
194// ;;; Local Variables:
195// ;;; mode:c++
196// ;;; c-basic-offset:2
197// ;;; End:
const Offset getOffset(Direction dir) const
Definition boardTable.h:47
const Square nextSquare(Player P, Square pos, Direction dr) const
next position from pos for player P.
Definition boardTable.h:61
圧縮していない moveの表現 .
Ptype ptype() const
Player player() const
bool isDrop() const
const Square to() const
const Square from() const
利きを持つ局面
座標の差分
Definition basic_type.h:430
Ptype ptype() const
Definition basic_type.h:821
const Square square() const
Definition basic_type.h:832
bool isEmpty() const
Definition basic_type.h:913
Player owner() const
Definition basic_type.h:963
bool isPiece() const
Definition basic_type.h:953
static const Piece EMPTY()
Definition basic_type.h:797
Piece nextPiece(Square cur, Offset diff) const
diff方向にあるPiece を求める.
const Piece pieceAt(Square sq) const
bool canPromote() const
Definition basic_type.h:659
const std::string & name() const
bool match(const NumEffectState &state, Move move, const RatingEnv &env) const
Definition pattern.h:180
static const PieceSquare find(const NumEffectState &state, Move move, Ptype attacker_ptype)
Definition pattern.cc:105
static const Piece find(const NumEffectState &state, Move move, Direction direction)
Definition pattern.h:157
bool match(const NumEffectState &state, Move move, const RatingEnv &) const
Definition pattern.h:164
static const PieceSquare nextPieceOrEnd(const SimpleState &state, Square start, Player player, Direction direction)
direction方向に空白を進み、駒を探す
Definition pattern.cc:59
bool match(const NumEffectState &state, Move move, const RatingEnv &env) const
Definition pattern.h:140
static const PieceSquare find(const NumEffectState &state, Move move, Direction direction)
Definition pattern.cc:66
static Square nextSquare(Player player, Square start, Direction direction, Direction direction2)
Definition pattern.h:33
Direction direction
Definition pattern.h:18
Pattern(Direction d, Ptype s, Ptype t, bool ss, int attack, int defense)
Definition pattern.h:23
static Square nextSquare(Move move, Direction direction, Direction direction2)
Definition pattern.h:40
static const Direction INVALID
Definition pattern.h:16
Pattern(Direction d, Direction d2, Ptype s, Ptype t, bool ss, int attack, int defense)
Definition pattern.h:28
bool match(const NumEffectState &state, Move move, const RatingEnv &env) const
Definition pattern.h:44
Direction direction2
Definition pattern.h:18
std::pair< Piece, Square > PieceSquare
Definition pattern.h:60
Ptype
駒の種類を4ビットでコード化する
Definition basic_type.h:84
@ PTYPE_EDGE
Definition basic_type.h:86
const BoardTable Board_Table
Definition tables.cc:95
Direction
Definition basic_type.h:310
@ LONG_UL
Definition basic_type.h:325
Player
Definition basic_type.h:8
constexpr bool isPiece(Ptype ptype)
ptypeが空白やEDGEでないかのチェック
Definition basic_type.h:120
constexpr Player alt(Player player)
Definition basic_type.h:13
bool match(const NumEffectState &state, Square position, const RatingEnv &env) const
static std::pair< int, int > count(const NumEffectState &state, Square position, const RatingEnv &env)
LongTarget2(Ptype t, bool s)
Definition pattern.h:107
const std::string name() const
Definition pattern.cc:24
bool match(const NumEffectState &, Move move, Piece p) const
Definition pattern.h:110
bool matchOtherThanPromotable(const NumEffectState &state, Move move, PieceSquare p, const RatingEnv &env) const
Definition pattern.h:88
static bool isPromotable(Move move, Square position)
Definition pattern.h:69
bool match(const NumEffectState &state, Move move, PieceSquare p, const RatingEnv &env) const
Definition pattern.h:74
LongTarget(Ptype t, bool p, bool s, int attack, int defense)
Definition pattern.h:65
const std::string name() const
Definition pattern.cc:17