flutter: 完成 putPiece()
This commit is contained in:
parent
a5f9af6121
commit
b531b2a931
|
@ -166,76 +166,6 @@ class Position {
|
||||||
return selectPieceSQ(makeSquare(file, rank));
|
return selectPieceSQ(makeSquare(file, rank));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool putPiece(int s) {
|
|
||||||
var index = squareToIndex[s];
|
|
||||||
var piece = _sideToMove;
|
|
||||||
var us = _sideToMove;
|
|
||||||
|
|
||||||
if (phase == Phase.gameOver ||
|
|
||||||
action != Act.place ||
|
|
||||||
board[s] != Piece.noPiece) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
if (n == 0) {
|
|
||||||
assert(pieceCountInHand[Color.black] >= 0 &&
|
|
||||||
pieceCountInHand[Color.white] >= 0);
|
|
||||||
|
|
||||||
if (pieceCountInHand[Color.black] == 0 &&
|
|
||||||
pieceCountInHand[Color.white] == 0) {
|
|
||||||
if (checkGameoverCondition()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
phase = Phase.moving;
|
|
||||||
action = Act.select;
|
|
||||||
|
|
||||||
if (rule.hasBannedLocations) {
|
|
||||||
removeBanStones();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rule.isDefenderMoveFirst) {
|
|
||||||
changeSideToMove();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (checkGameoverCondition()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
changeSideToMove();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pieceCountNeedRemove =
|
|
||||||
rule.allowRemoveMultiPiecesWhenCloseMultiMill ? n : 1;
|
|
||||||
action = Act.remove;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// TODO: pieceCountNeedRemove
|
|
||||||
|
|
||||||
print("putPiece: pt = $piece, index = $index, sq = $s");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool putPieceFR(int file, int rank) {
|
bool putPieceFR(int file, int rank) {
|
||||||
bool ret = putPieceSQ(makeSquare(file, rank));
|
bool ret = putPieceSQ(makeSquare(file, rank));
|
||||||
|
|
||||||
|
@ -723,6 +653,126 @@ class Position {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool putPiece(int s) {
|
||||||
|
var index = squareToIndex[s];
|
||||||
|
var piece = _sideToMove;
|
||||||
|
var us = _sideToMove;
|
||||||
|
|
||||||
|
if (phase == Phase.gameOver ||
|
||||||
|
action != Act.place ||
|
||||||
|
board[s] != Piece.noPiece) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (n == 0) {
|
||||||
|
assert(pieceCountInHand[Color.black] >= 0 &&
|
||||||
|
pieceCountInHand[Color.white] >= 0);
|
||||||
|
|
||||||
|
if (pieceCountInHand[Color.black] == 0 &&
|
||||||
|
pieceCountInHand[Color.white] == 0) {
|
||||||
|
if (checkGameOverCondition()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
phase = Phase.moving;
|
||||||
|
action = Act.select;
|
||||||
|
|
||||||
|
if (rule.hasBannedLocations) {
|
||||||
|
removeBanStones();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rule.isDefenderMoveFirst) {
|
||||||
|
changeSideToMove();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkGameOverCondition()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
changeSideToMove();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pieceCountNeedRemove =
|
||||||
|
rule.allowRemoveMultiPiecesWhenCloseMultiMill ? n : 1;
|
||||||
|
action = Act.remove;
|
||||||
|
}
|
||||||
|
} else if (phase == Phase.moving) {
|
||||||
|
if (checkGameOverCondition()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if illegal
|
||||||
|
if (pieceCountOnBoard[sideToMove()] > rule.nPiecesAtLeast ||
|
||||||
|
!rule.allowFlyWhenRemainThreePieces) {
|
||||||
|
int md;
|
||||||
|
|
||||||
|
for (md = 0; md < moveDirectionNumber; md++) {
|
||||||
|
if (s == moveTable[currentSquare][md]) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// not in moveTable
|
||||||
|
if (md == moveDirectionNumber) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdline = "(" +
|
||||||
|
fileOf(currentSquare).toString() +
|
||||||
|
"," +
|
||||||
|
rankOf(currentSquare).toString() +
|
||||||
|
")->(" +
|
||||||
|
fileOf(s).toString() +
|
||||||
|
"," +
|
||||||
|
rankOf(s).toString() +
|
||||||
|
")";
|
||||||
|
|
||||||
|
rule50++;
|
||||||
|
|
||||||
|
board[s] = board[currentSquare];
|
||||||
|
|
||||||
|
board[currentSquare] = Piece.noPiece;
|
||||||
|
|
||||||
|
currentSquare = s;
|
||||||
|
int n = addMills(currentSquare);
|
||||||
|
|
||||||
|
// midgame
|
||||||
|
if (n == 0) {
|
||||||
|
action = Act.select;
|
||||||
|
changeSideToMove();
|
||||||
|
|
||||||
|
if (checkGameOverCondition()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pieceCountNeedRemove =
|
||||||
|
rule.allowRemoveMultiPiecesWhenCloseMultiMill ? n : 1;
|
||||||
|
action = Act.remove;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool removePiece(int s) {
|
bool removePiece(int s) {
|
||||||
if (phase == Phase.ready || phase == Phase.gameOver) return false;
|
if (phase == Phase.ready || phase == Phase.gameOver) return false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue