toPositionString method
Translate a move to positional representation
Implementation
String toPositionString(int team, String move) {
late String code;
late String matchCode;
int colIndex = -1;
if (_nameIndex.contains(move[0]) || _posIndex.contains(move[0])) {
code = nameMap[move[1]]!;
} else {
code = nameMap[move[0]]!;
colIndex =
team == 0 ? colRed.indexOf(move[1]) : colBlack.indexOf(move[1]);
}
code = code.toLowerCase();
matchCode = team == 0 ? code.toUpperCase() : code;
List<ChessPos> items = findAll(matchCode);
ChessPos curItem;
// 这种情况只能是小兵
if (_nameIndex.contains(move[0])) {
// 筛选出有同列的兵
List<ChessPos> nItems = items
.where(
(item) => items.any((pawn) => pawn != item && pawn.x == item.x),
)
.toList();
nItems.sort(posSort);
colIndex = _nameIndex.indexOf(move[0]);
curItem =
team == 0 ? nItems[nItems.length - colIndex - 1] : nItems[colIndex];
// 前中后
} else if (_posIndex.contains(move[0])) {
// 筛选出有同列的兵
List<ChessPos> nItems = items
.where(
(item) => items.any((pawn) => pawn != item && pawn.x == item.x),
)
.toList();
nItems.sort(posSort);
if (nItems.length > 2) {
colIndex = _posIndex.indexOf(move[0]);
curItem =
team == 0 ? nItems[nItems.length - colIndex - 1] : nItems[colIndex];
} else {
if ((team == 0 && move[0] == '前') || (team == 1 && move[0] == '后')) {
curItem = nItems[0];
} else {
curItem = nItems[1];
}
}
} else {
colIndex =
team == 0 ? colRed.indexOf(move[1]) : colBlack.indexOf(move[1]);
List<ChessPos> nItems =
items.where((item) => item.x == colIndex).toList();
nItems.sort(posSort);
if (nItems.length > 1) {
if ((team == 0 && move[2] == '进') || (team == 1 && move[2] == '退')) {
curItem = nItems[1];
} else {
curItem = nItems[0];
}
} else if (nItems.isNotEmpty) {
curItem = nItems[0];
} else {
logger.info('招法加载错误 $team $move');
return '';
}
}
ChessPos nextItem = ChessPos(0, 0);
if (['p', 'k', 'c', 'r'].contains(code)) {
if (move[2] == '平') {
nextItem.y = curItem.y;
nextItem.x =
team == 0 ? colRed.indexOf(move[3]) : colBlack.indexOf(move[3]);
} else if ((team == 0 && move[2] == '进') ||
(team == 1 && move[2] == '退')) {
nextItem.x = curItem.x;
nextItem.y = curItem.y +
(team == 0 ? _stepIndex.indexOf(move[3]) : int.parse(move[3]));
} else {
nextItem.x = curItem.x;
nextItem.y = curItem.y -
(team == 0 ? _stepIndex.indexOf(move[3]) : int.parse(move[3]));
}
} else {
nextItem.x =
team == 0 ? colRed.indexOf(move[3]) : colBlack.indexOf(move[3]);
if ((team == 0 && move[2] == '进') || (team == 1 && move[2] == '退')) {
if (code == 'n') {
if ((nextItem.x - curItem.x).abs() == 2) {
nextItem.y = curItem.y + 1;
} else {
nextItem.y = curItem.y + 2;
}
} else {
nextItem.y = curItem.y + (nextItem.x - curItem.x).abs();
}
} else {
if (code == 'n') {
if ((nextItem.x - curItem.x).abs() == 2) {
nextItem.y = curItem.y - 1;
} else {
nextItem.y = curItem.y - 2;
}
} else {
nextItem.y = curItem.y - (nextItem.x - curItem.x).abs();
}
}
}
return '${curItem.toCode()}${nextItem.toCode()}';
}