flutter: 完成 createMillTable()

This commit is contained in:
Calcitem 2020-11-15 11:19:22 +08:00
parent 98e9d2e8c9
commit e87991c591
3 changed files with 481 additions and 40 deletions

View File

@ -83,6 +83,8 @@ enum MoveDirection { clockwise, anticlockwise, inward, outward }
enum LineDirection { horizontal, vertical, slash }
const lineDirectionNumber = 3;
enum File { A, B, C }
const fileNumber = 3;

View File

@ -47,10 +47,8 @@ class Position {
MillRecorder _recorder;
int pieceCountInHandBlack = 12;
int pieceCountInHandWhite = 12;
int pieceCountOnBoardBlack = 0;
int pieceCountOnBoardWhite = 0;
Map<String, int> pieceCountInHand = {Color.black: 12, Color.white: 12};
Map<String, int> pieceCountOnBoard = {Color.black: 0, Color.white: 0};
int pieceCountNeedRemove = 0;
int gamePly = 0;
@ -78,6 +76,8 @@ class Position {
String cmdline;
var millTable;
//int _move;
Position.init() {
@ -124,10 +124,8 @@ class Position {
_recorder = other._recorder;
pieceCountInHandBlack = other.pieceCountInHandBlack;
pieceCountInHandWhite = other.pieceCountInHandWhite;
pieceCountOnBoardBlack = other.pieceCountOnBoardBlack;
pieceCountOnBoardWhite = other.pieceCountOnBoardWhite;
pieceCountInHand = other.pieceCountInHand;
pieceCountOnBoard = other.pieceCountOnBoard;
pieceCountNeedRemove = other.pieceCountNeedRemove;
gamePly = other.gamePly;
@ -173,30 +171,39 @@ class Position {
return selectPieceSQ(makeSquare(file, rank));
}
bool putPiece(int sq) {
var index = squareToIndex[sq];
bool putPiece(int s) {
var index = squareToIndex[s];
var piece = _sideToMove;
var us = _sideToMove;
if (sq == null) {
print("putPiece skip index: $index");
if (phase == Phase.gameOver ||
action != Act.place ||
_board[s] != Piece.noPiece) {
return false;
}
String pt = _sideToMove;
_grid[index] = pt;
_board[sq] = pt;
if (_sideToMove == Color.black) {
pieceCountInHandBlack--;
pieceCountOnBoardBlack++;
} else if (_sideToMove == Color.white) {
pieceCountInHandWhite--;
pieceCountInHandWhite++;
if (phase == Phase.ready) {
start();
}
if (phase == Phase.placing) {
piece = sideToMove();
pieceCountInHand[us]--;
pieceCountOnBoard[us]++;
_grid[index] = piece;
_board[s] = piece;
cmdline = "(" + fileOf(s).toString() + "," + rankOf(s).toString() + ")";
}
currentSquare = s;
//int n = addMills(currentSquare);
// TODO: pieceCountNeedRemove
print("putPiece: pt = $pt, index = $index, sq = $sq");
print("putPiece: pt = $piece, index = $index, sq = $s");
return true;
}
@ -354,13 +361,13 @@ class Position {
ss += " ";
ss += pieceCountOnBoardBlack.toString() +
ss += pieceCountOnBoard[Color.black].toString() +
" " +
pieceCountInHandBlack.toString() +
pieceCountInHand[Color.black].toString() +
" " +
pieceCountOnBoardWhite.toString() +
pieceCountOnBoard[Color.white].toString() +
" " +
pieceCountInHandWhite.toString() +
pieceCountInHand[Color.white].toString() +
" " +
pieceCountNeedRemove.toString() +
" ";
@ -580,32 +587,34 @@ class Position {
///////////////////////////////////////////////////////////////////////////////
int piecesOnBoardCount() {
pieceCountOnBoardBlack = pieceCountOnBoardWhite = 0;
pieceCountOnBoard[Color.black] = pieceCountOnBoard[Color.white] = 0;
for (int f = 1; f < 3 + 2; f++) {
for (int r = 0; r < 8; r++) {
int s = f * 8 + r;
if (_board[s] == Piece.blackStone) {
pieceCountOnBoardBlack++;
pieceCountOnBoard[Color.black]++;
} else if (_board[s] == Piece.whiteStone) {
pieceCountOnBoardBlack++;
pieceCountOnBoard[Color.black]++;
}
}
}
if (pieceCountOnBoardBlack > rule.nTotalPiecesEachSide ||
pieceCountOnBoardWhite > rule.nTotalPiecesEachSide) {
if (pieceCountOnBoard[Color.black] > rule.nTotalPiecesEachSide ||
pieceCountOnBoard[Color.white] > rule.nTotalPiecesEachSide) {
return -1;
}
return pieceCountOnBoardBlack + pieceCountOnBoardWhite;
return pieceCountOnBoard[Color.black] + pieceCountOnBoard[Color.white];
}
int piecesInHandCount() {
pieceCountInHandBlack = rule.nTotalPiecesEachSide - pieceCountOnBoardBlack;
pieceCountInHandWhite = rule.nTotalPiecesEachSide - pieceCountOnBoardWhite;
pieceCountInHand[Color.black] =
rule.nTotalPiecesEachSide - pieceCountOnBoard[Color.black];
pieceCountInHand[Color.white] =
rule.nTotalPiecesEachSide - pieceCountOnBoard[Color.white];
return pieceCountOnBoardBlack + pieceCountOnBoardWhite;
return pieceCountOnBoard[Color.black] + pieceCountOnBoard[Color.white];
}
int setPosition(Rule newRule) {
@ -650,8 +659,9 @@ class Position {
for (int i = 0; i < _board.length; i++) _board[i] = Piece.noPiece;
pieceCountOnBoardBlack = pieceCountOnBoardWhite = 0;
pieceCountInHandBlack = pieceCountInHandWhite = rule.nTotalPiecesEachSide;
pieceCountOnBoard[Color.black] = pieceCountOnBoard[Color.white] = 0;
pieceCountInHand[Color.black] =
pieceCountInHand[Color.white] = rule.nTotalPiecesEachSide;
pieceCountNeedRemove = 0;
currentSquare = 0;
@ -686,4 +696,426 @@ class Position {
return false;
}
}
void createMillTable() {
const millTable_noObliqueLine = [
/* 0 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 1 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 2 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 3 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 4 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 5 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 6 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 7 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 8 */ [
[16, 24],
[9, 15],
[0, 0]
],
/* 9 */ [
[0, 0],
[15, 8],
[10, 11]
],
/* 10 */ [
[18, 26],
[11, 9],
[0, 0]
],
/* 11 */ [
[0, 0],
[9, 10],
[12, 13]
],
/* 12 */ [
[20, 28],
[13, 11],
[0, 0]
],
/* 13 */ [
[0, 0],
[11, 12],
[14, 15]
],
/* 14 */ [
[22, 30],
[15, 13],
[0, 0]
],
/* 15 */ [
[0, 0],
[13, 14],
[8, 9]
],
/* 16 */ [
[8, 24],
[17, 23],
[0, 0]
],
/* 17 */ [
[0, 0],
[23, 16],
[18, 19]
],
/* 18 */ [
[10, 26],
[19, 17],
[0, 0]
],
/* 19 */ [
[0, 0],
[17, 18],
[20, 21]
],
/* 20 */ [
[12, 28],
[21, 19],
[0, 0]
],
/* 21 */ [
[0, 0],
[19, 20],
[22, 23]
],
/* 22 */ [
[14, 30],
[23, 21],
[0, 0]
],
/* 23 */ [
[0, 0],
[21, 22],
[16, 17]
],
/* 24 */ [
[8, 16],
[25, 31],
[0, 0]
],
/* 25 */ [
[0, 0],
[31, 24],
[26, 27]
],
/* 26 */ [
[10, 18],
[27, 25],
[0, 0]
],
/* 27 */ [
[0, 0],
[25, 26],
[28, 29]
],
/* 28 */ [
[12, 20],
[29, 27],
[0, 0]
],
/* 29 */ [
[0, 0],
[27, 28],
[30, 31]
],
/* 30 */ [
[14, 22],
[31, 29],
[0, 0]
],
/* 31 */ [
[0, 0],
[29, 30],
[24, 25]
],
/* 32 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 33 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 34 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 35 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 36 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 37 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 38 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 39 */ [
[0, 0],
[0, 0],
[0, 0]
]
];
const millTable_hasObliqueLines = [
/* 0 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 1 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 2 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 3 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 4 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 5 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 6 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 7 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 8 */ [
[16, 24],
[9, 15],
[0, 0]
],
/* 9 */ [
[17, 25],
[15, 8],
[10, 11]
],
/* 10 */ [
[18, 26],
[11, 9],
[0, 0]
],
/* 11 */ [
[19, 27],
[9, 10],
[12, 13]
],
/* 12 */ [
[20, 28],
[13, 11],
[0, 0]
],
/* 13 */ [
[21, 29],
[11, 12],
[14, 15]
],
/* 14 */ [
[22, 30],
[15, 13],
[0, 0]
],
/* 15 */ [
[23, 31],
[13, 14],
[8, 9]
],
/* 16 */ [
[8, 24],
[17, 23],
[0, 0]
],
/* 17 */ [
[9, 25],
[23, 16],
[18, 19]
],
/* 18 */ [
[10, 26],
[19, 17],
[0, 0]
],
/* 19 */ [
[11, 27],
[17, 18],
[20, 21]
],
/* 20 */ [
[12, 28],
[21, 19],
[0, 0]
],
/* 21 */ [
[13, 29],
[19, 20],
[22, 23]
],
/* 22 */ [
[14, 30],
[23, 21],
[0, 0]
],
/* 23 */ [
[15, 31],
[21, 22],
[16, 17]
],
/* 24 */ [
[8, 16],
[25, 31],
[0, 0]
],
/* 25 */ [
[9, 17],
[31, 24],
[26, 27]
],
/* 26 */ [
[10, 18],
[27, 25],
[0, 0]
],
/* 27 */ [
[11, 19],
[25, 26],
[28, 29]
],
/* 28 */ [
[12, 20],
[29, 27],
[0, 0]
],
/* 29 */ [
[13, 21],
[27, 28],
[30, 31]
],
/* 30 */ [
[14, 22],
[31, 29],
[0, 0]
],
/* 31 */ [
[15, 23],
[29, 30],
[24, 25]
],
/* 32 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 33 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 34 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 35 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 36 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 37 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 38 */ [
[0, 0],
[0, 0],
[0, 0]
],
/* 39 */ [
[0, 0],
[0, 0],
[0, 0]
]
];
if (rule.hasObliqueLines) {
millTable = millTable_hasObliqueLines;
} else {
millTable = millTable_noObliqueLine;
}
}
}

View File

@ -73,7 +73,14 @@ class _BattlePageState extends State<BattlePage> {
//position
//flag++;
//position.putPiece(flag % 2 == 0 ? '@' : 'O', index);
if (position.putPiece(indexToSquare[index]) == false) {
int sq = indexToSquare[index];
if (sq == null) {
print("putPiece skip index: $index");
return;
}
if (position.putPiece(sq) == false) {
return;
}