position: 解决 QtUI 切规则后对弈异常问题
原因是之前提交引入的: // TODO: Do not need to set again set_position(DEFAULT_RULE_NUMBER); 解决方案: set_position() 部分分离到新函数 set_rule() 其余则补充到 reset()。
This commit is contained in:
parent
0ac61a94d0
commit
df68dafa8e
|
@ -169,8 +169,7 @@ Position::Position()
|
|||
{
|
||||
construct_key();
|
||||
|
||||
// TODO: Do not need to set again
|
||||
set_position(DEFAULT_RULE_NUMBER);
|
||||
reset();
|
||||
|
||||
score[BLACK] = score[WHITE] = score_draw = nPlayed = 0;
|
||||
|
||||
|
@ -708,43 +707,6 @@ int Position::pieces_in_hand_count()
|
|||
return pieceCountInHand[BLACK] + pieceCountInHand[WHITE];
|
||||
}
|
||||
|
||||
int Position::set_position(int ruleNo)
|
||||
{
|
||||
memset(&rule, 0, sizeof(Rule));
|
||||
memcpy(&rule, &RULES[ruleNo], sizeof(Rule));
|
||||
|
||||
gamePly = 0;
|
||||
st.rule50 = 0;
|
||||
|
||||
phase = PHASE_READY;
|
||||
set_side_to_move(BLACK);
|
||||
action = ACTION_PLACE;
|
||||
|
||||
memset(board, 0, sizeof(board));
|
||||
st.key = 0;
|
||||
memset(byTypeBB, 0, sizeof(byTypeBB));
|
||||
|
||||
if (pieces_on_board_count() == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
pieces_in_hand_count();
|
||||
pieceCountNeedRemove = 0;
|
||||
millListSize = 0;
|
||||
winner = NOBODY;
|
||||
MoveList<LEGAL>::create();
|
||||
create_mill_table();
|
||||
currentSquare = SQ_0;
|
||||
|
||||
int r;
|
||||
for (r = 0; r < N_RULES; r++) {
|
||||
if (strcmp(rule.name, RULES[r].name) == 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef THREEFOLD_REPETITION
|
||||
extern int nRepetition;
|
||||
#endif // THREEFOLD_REPETITION
|
||||
|
@ -773,6 +735,9 @@ bool Position::reset()
|
|||
pieceCountInHand[BLACK] = pieceCountInHand[WHITE] = rule.nTotalPiecesEachSide;
|
||||
pieceCountNeedRemove = 0;
|
||||
millListSize = 0;
|
||||
|
||||
MoveList<LEGAL>::create();
|
||||
create_mill_table();
|
||||
currentSquare = SQ_0;
|
||||
|
||||
#ifdef ENDGAME_LEARNING
|
||||
|
@ -781,15 +746,14 @@ bool Position::reset()
|
|||
}
|
||||
#endif /* ENDGAME_LEARNING */
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < N_RULES; i++) {
|
||||
if (strcmp(rule.name, RULES[i].name) == 0)
|
||||
int r;
|
||||
for (r = 0; r < N_RULES; r++) {
|
||||
if (strcmp(rule.name, RULES[r].name) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (sprintf(cmdline, "r%1u s%03u t%02u",
|
||||
i + 1, rule.maxStepsLedToDraw, 0) > 0) {
|
||||
r + 1, rule.maxStepsLedToDraw, 0) > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1073,11 +1037,11 @@ bool Position::command(const char *cmd)
|
|||
int args = 0;
|
||||
|
||||
if (sscanf(cmd, "r%1u s%3d t%2u", &ruleNo, &step, &t) == 3) {
|
||||
if (ruleNo <= 0 || ruleNo > N_RULES) {
|
||||
if (set_rule(ruleNo - 1) == false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return set_position(ruleNo - 1) >= 0 ? true : false;
|
||||
return reset();
|
||||
}
|
||||
|
||||
args = sscanf(cmd, "(%1u,%1u)->(%1u,%1u)", (unsigned*)&file1, (unsigned*)&rank1, (unsigned*)&file2, (unsigned*)&rank2);
|
||||
|
|
|
@ -104,8 +104,6 @@ public:
|
|||
|
||||
/// Mill Game
|
||||
|
||||
int set_position(int ruleNo);
|
||||
|
||||
Piece *get_board();
|
||||
Square current_square() const;
|
||||
enum Phase get_phase() const;
|
||||
|
|
12
src/rule.cpp
12
src/rule.cpp
|
@ -125,3 +125,15 @@ const struct Rule RULES[N_RULES] = {
|
|||
50 // 50步
|
||||
}
|
||||
};
|
||||
|
||||
bool set_rule(int ruleIdx)
|
||||
{
|
||||
if (ruleIdx <= 0 || ruleIdx > N_RULES) {
|
||||
return false;
|
||||
}
|
||||
|
||||
memset(&rule, 0, sizeof(Rule));
|
||||
memcpy(&rule, &RULES[ruleIdx], sizeof(Rule));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -42,5 +42,6 @@ struct Rule
|
|||
#define N_RULES 4
|
||||
extern const struct Rule RULES[N_RULES];
|
||||
extern struct Rule rule;
|
||||
extern bool set_rule(int ruleIdx);
|
||||
|
||||
#endif /* RULE_H */
|
||||
|
|
|
@ -353,7 +353,11 @@ void Game::setRule(int ruleNo, int stepLimited /*= -1*/, int timeLimited /*= -1*
|
|||
}
|
||||
|
||||
// 设置模型规则,重置游戏
|
||||
int r = position.set_position(ruleNo);
|
||||
if (set_rule(ruleNo) == false) {
|
||||
return;
|
||||
}
|
||||
|
||||
int r = ruleNo;
|
||||
elapsedSeconds[BLACK] = elapsedSeconds[WHITE] = 0;
|
||||
|
||||
char cmdline[64] = { 0 };
|
||||
|
|
Loading…
Reference in New Issue