From 59f286dab4a73692b48a2170af0fd9ed767988a8 Mon Sep 17 00:00:00 2001 From: CalciteM Date: Sun, 23 Jun 2019 13:35:34 +0800 Subject: [PATCH] refactor --- NineChess/src/ninechess.cpp | 98 +++++++++++++++++++++---------------- NineChess/src/ninechess.h | 3 ++ 2 files changed, 59 insertions(+), 42 deletions(-) diff --git a/NineChess/src/ninechess.cpp b/NineChess/src/ninechess.cpp index d9ac9da0..070c9ce2 100644 --- a/NineChess/src/ninechess.cpp +++ b/NineChess/src/ninechess.cpp @@ -115,14 +115,14 @@ const int NineChess::onBoard[(N_RINGS + 2) * N_SEATS] = { int NineChess::moveTable[(N_RINGS + 2) * N_SEATS][4] = { 0 }; // 成三表 -int NineChess::millTable[(N_RINGS + 2) * N_SEATS][3][2] = { 0 }; +int NineChess::millTable[(N_RINGS + 2) * N_SEATS][N_DIRECTIONS][N_RINGS - 1] = { 0 }; NineChess::NineChess() { // 单独提出board,免得每次都写data.board; board_ = context.board; - // 默认选择第0号规则,即“成三棋” - setContext(&RULES[0]); + // 默认选择第1号规则,即“打三棋” + setContext(&RULES[1]); } NineChess::NineChess(const NineChess &chess) @@ -203,60 +203,74 @@ void NineChess::createMoveTable() void NineChess::createMillTable() { - for (int s = 0; s < N_SEATS; s++) { + for (int i = 0; i < N_SEATS; i++) { // 内外方向的“成三” // 如果是0、2、4、6位(偶数位)或是有斜线 - if (!(s & 1) || this->currentRule.hasObliqueLines) { - millTable[1 * N_SEATS + s][0][0] = 2 * N_SEATS + s; - millTable[1 * N_SEATS + s][0][1] = 3 * N_SEATS + s; - millTable[2 * N_SEATS + s][0][0] = 1 * N_SEATS + s; - millTable[2 * N_SEATS + s][0][1] = 3 * N_SEATS + s; - millTable[3 * N_SEATS + s][0][0] = 1 * N_SEATS + s; - millTable[3 * N_SEATS + s][0][1] = 2 * N_SEATS + s; + if (!(i & 1) || this->currentRule.hasObliqueLines) { + millTable[1 * N_SEATS + i][0][0] = 2 * N_SEATS + i; + millTable[1 * N_SEATS + i][0][1] = 3 * N_SEATS + i; + + millTable[2 * N_SEATS + i][0][0] = 1 * N_SEATS + i; + millTable[2 * N_SEATS + i][0][1] = 3 * N_SEATS + i; + + millTable[3 * N_SEATS + i][0][0] = 1 * N_SEATS + i; + millTable[3 * N_SEATS + i][0][1] = 2 * N_SEATS + i; } // 对于无斜线情况下的1、3、5、7位(奇数位) else { // 置空该组“成三” - millTable[1 * N_SEATS + s][0][0] = 0; - millTable[1 * N_SEATS + s][0][1] = 0; - millTable[2 * N_SEATS + s][0][0] = 0; - millTable[2 * N_SEATS + s][0][1] = 0; - millTable[3 * N_SEATS + s][0][0] = 0; - millTable[3 * N_SEATS + s][0][1] = 0; + millTable[1 * N_SEATS + i][0][0] = 0; + millTable[1 * N_SEATS + i][0][1] = 0; + + millTable[2 * N_SEATS + i][0][0] = 0; + millTable[2 * N_SEATS + i][0][1] = 0; + + millTable[3 * N_SEATS + i][0][0] = 0; + millTable[3 * N_SEATS + i][0][1] = 0; } + // 当前圈上的“成三” // 如果是0、2、4、6位 - if (!(s & 1)) { - millTable[1 * N_SEATS + s][1][0] = 1 * N_SEATS + (s + 1) % N_SEATS; - millTable[1 * N_SEATS + s][1][1] = 1 * N_SEATS + (s + N_SEATS - 1) % N_SEATS; - millTable[2 * N_SEATS + s][1][0] = 2 * N_SEATS + (s + 1) % N_SEATS; - millTable[2 * N_SEATS + s][1][1] = 2 * N_SEATS + (s + N_SEATS - 1) % N_SEATS; - millTable[3 * N_SEATS + s][1][0] = 3 * N_SEATS + (s + 1) % N_SEATS; - millTable[3 * N_SEATS + s][1][1] = 3 * N_SEATS + (s + N_SEATS - 1) % N_SEATS; + if (!(i & 1)) { + millTable[1 * N_SEATS + i][1][0] = 1 * N_SEATS + (i + 1) % N_SEATS; + millTable[1 * N_SEATS + i][1][1] = 1 * N_SEATS + (i + N_SEATS - 1) % N_SEATS; + + millTable[2 * N_SEATS + i][1][0] = 2 * N_SEATS + (i + 1) % N_SEATS; + millTable[2 * N_SEATS + i][1][1] = 2 * N_SEATS + (i + N_SEATS - 1) % N_SEATS; + + millTable[3 * N_SEATS + i][1][0] = 3 * N_SEATS + (i + 1) % N_SEATS; + millTable[3 * N_SEATS + i][1][1] = 3 * N_SEATS + (i + N_SEATS - 1) % N_SEATS; // 置空另一组“成三” - millTable[1 * N_SEATS + s][2][0] = 0; - millTable[1 * N_SEATS + s][2][1] = 0; - millTable[2 * N_SEATS + s][2][0] = 0; - millTable[2 * N_SEATS + s][2][1] = 0; - millTable[3 * N_SEATS + s][2][0] = 0; - millTable[3 * N_SEATS + s][2][1] = 0; + millTable[1 * N_SEATS + i][2][0] = 0; + millTable[1 * N_SEATS + i][2][1] = 0; + + millTable[2 * N_SEATS + i][2][0] = 0; + millTable[2 * N_SEATS + i][2][1] = 0; + + millTable[3 * N_SEATS + i][2][0] = 0; + millTable[3 * N_SEATS + i][2][1] = 0; } // 对于1、3、5、7位(奇数位) else { // 当前圈上逆时针的“成三” - millTable[1 * N_SEATS + s][1][0] = 1 * N_SEATS + (s + N_SEATS - 2) % N_SEATS; - millTable[1 * N_SEATS + s][1][1] = 1 * N_SEATS + (s + N_SEATS - 1) % N_SEATS; - millTable[2 * N_SEATS + s][1][0] = 2 * N_SEATS + (s + N_SEATS - 2) % N_SEATS; - millTable[2 * N_SEATS + s][1][1] = 2 * N_SEATS + (s + N_SEATS - 1) % N_SEATS; - millTable[3 * N_SEATS + s][1][0] = 3 * N_SEATS + (s + N_SEATS - 2) % N_SEATS; - millTable[3 * N_SEATS + s][1][1] = 3 * N_SEATS + (s + N_SEATS - 1) % N_SEATS; + millTable[1 * N_SEATS + i][1][0] = 1 * N_SEATS + (i + N_SEATS - 2) % N_SEATS; + millTable[1 * N_SEATS + i][1][1] = 1 * N_SEATS + (i + N_SEATS - 1) % N_SEATS; + + millTable[2 * N_SEATS + i][1][0] = 2 * N_SEATS + (i + N_SEATS - 2) % N_SEATS; + millTable[2 * N_SEATS + i][1][1] = 2 * N_SEATS + (i + N_SEATS - 1) % N_SEATS; + + millTable[3 * N_SEATS + i][1][0] = 3 * N_SEATS + (i + N_SEATS - 2) % N_SEATS; + millTable[3 * N_SEATS + i][1][1] = 3 * N_SEATS + (i + N_SEATS - 1) % N_SEATS; + // 当前圈上顺时针的“成三” - millTable[1 * N_SEATS + s][2][0] = 1 * N_SEATS + (s + 1) % N_SEATS; - millTable[1 * N_SEATS + s][2][1] = 1 * N_SEATS + (s + 2) % N_SEATS; - millTable[2 * N_SEATS + s][2][0] = 2 * N_SEATS + (s + 1) % N_SEATS; - millTable[2 * N_SEATS + s][2][1] = 2 * N_SEATS + (s + 2) % N_SEATS; - millTable[3 * N_SEATS + s][2][0] = 3 * N_SEATS + (s + 1) % N_SEATS; - millTable[3 * N_SEATS + s][2][1] = 3 * N_SEATS + (s + 2) % N_SEATS; + millTable[1 * N_SEATS + i][2][0] = 1 * N_SEATS + (i + 1) % N_SEATS; + millTable[1 * N_SEATS + i][2][1] = 1 * N_SEATS + (i + 2) % N_SEATS; + + millTable[2 * N_SEATS + i][2][0] = 2 * N_SEATS + (i + 1) % N_SEATS; + millTable[2 * N_SEATS + i][2][1] = 2 * N_SEATS + (i + 2) % N_SEATS; + + millTable[3 * N_SEATS + i][2][0] = 3 * N_SEATS + (i + 1) % N_SEATS; + millTable[3 * N_SEATS + i][2][1] = 3 * N_SEATS + (i + 2) % N_SEATS; } } } diff --git a/NineChess/src/ninechess.h b/NineChess/src/ninechess.h index 9b8a11ba..050ad8dd 100644 --- a/NineChess/src/ninechess.h +++ b/NineChess/src/ninechess.h @@ -31,6 +31,9 @@ public: // 8位,禁止修改! static const int N_SEATS = 8; + // 横直斜2个方向,禁止修改! + static const int N_DIRECTIONS = 3; + // 遍历棋盘点所用的起始位置,即 [8, 32) static const int POS_BEGIN = N_SEATS; static const int POS_END = ((N_RINGS + 1) * N_SEATS);