File: kingOpenMove.cc

package info (click to toggle)
libosl 0.6.0-3.1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 148,792 kB
  • ctags: 151,985
  • sloc: cpp: 131,133; ansic: 7,228; ruby: 1,290; makefile: 569; perl: 309; sh: 35
file content (63 lines) | stat: -rw-r--r-- 2,276 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "osl/move_classifier/kingOpenMove.h"
#include "osl/state/numEffectState.h"

template <osl::Player P>
template <bool hasException>
bool osl::move_classifier::KingOpenMove<P>::
isMemberMain(const NumEffectState& state, Ptype, Square from, Square to,
	     Square exceptFor)
{
  assert(! from.isPieceStand());
  Square king_position=state.template kingSquare<P>();
  if (king_position.isPieceStand())
    return false;
  /**
   * 守っている玉が動く状況では呼ばない
   */
  assert(king_position != from);
  /**
   * openになってしまうかどうかのチェック
   */
  Offset offset=Board_Table.getShortOffsetNotKnight(Offset32(king_position,from));
  /**
   * 移動元が王の8方向でないか
   * openにならない
   */
  if(offset.zero() ||
     offset==Board_Table.getShortOffsetNotKnight(Offset32(king_position,to)))
    return false;
  if(!state.isEmptyBetween(from,king_position,offset,true)) return false;
  Square pos=from;
  Piece p;
  for(pos-=offset;;pos-=offset){
    // TODO: exceptFor を毎回チェックする必要があるのはoffset方向の時だけ
    if (! ((hasException && (pos == exceptFor)) 
	   || (p=state.pieceAt(pos), p.isEmpty())))
      break;
    assert(pos.isOnBoard());
  }
  /**
   * そのptypeoがそのoffsetを動きとして持つか
   * 注: 持つ => safe でない => false を返す
   */
  if (! p.isOnBoardByOwner<PlayerTraits<P>::opponent>())
    return false;
  return Ptype_Table.getEffect(p.ptypeO(),pos,king_position).hasEffect();
}

namespace osl
{
  // explicit template instantiation
  template struct move_classifier::KingOpenMove<BLACK>;
  template struct move_classifier::KingOpenMove<WHITE>;

  template bool move_classifier::KingOpenMove<BLACK>::isMemberMain<true>(const NumEffectState&, Ptype,Square,Square,Square);
  template bool move_classifier::KingOpenMove<BLACK>::isMemberMain<false>(const NumEffectState&, Ptype,Square,Square,Square);
  template bool move_classifier::KingOpenMove<WHITE>::isMemberMain<true>(const NumEffectState&, Ptype,Square,Square,Square);
  template bool move_classifier::KingOpenMove<WHITE>::isMemberMain<false>(const NumEffectState&, Ptype,Square,Square,Square);
}

// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End: