toChineseString method
Translate a move to chinese
Implementation
String toChineseString(String move) {
if (ChessManual.results.contains(move)) {
return getChineseResult(move);
}
String chineseString;
ChessPos posFrom = ChessPos.fromCode(move.substring(0, 2));
ChessPos posTo = ChessPos.fromCode(move.substring(2, 4));
// 找出子
String matchCode = _rows[posFrom.y][posFrom.x];
if (matchCode == '0') {
logger.info('着法错误 $fen $move');
return '';
}
int team = matchCode.codeUnitAt(0) < 'a'.codeUnitAt(0) ? 0 : 1;
String code = matchCode.toLowerCase();
// 子名
String name = team == 0 ? nameRedMap[code]! : nameBlackMap[code]!;
if (code == 'k' || code == 'a' || code == 'b') {
chineseString =
name + (team == 0 ? colRed[posFrom.x] : colBlack[posFrom.x]);
} else {
int colCount = 0;
int rowNumber = 0;
List<int> rowIndexs = [];
for (var row in _rows) {
if (row[posFrom.x] == matchCode) {
colCount++;
rowIndexs.add(rowNumber);
}
rowNumber++;
}
if (colCount > 3) {
int idx = rowIndexs.indexOf(posFrom.y);
// print([colCount, idx]);
if (team == 0) {
chineseString = _nameIndex[idx] + name;
} else {
chineseString = _nameIndex[rowIndexs.length - idx - 1] + name;
}
} else if (colCount > 2 || (colCount > 1 && code == 'p')) {
// 找出所有的兵
List<ChessPos> pawns = findAll(matchCode);
// 筛选出有同列的兵
List<ChessPos> nPawns = pawns
.where(
(item) => pawns.any((pawn) => (pawn != item && pawn.x == item.x)),
)
.toList();
nPawns.sort(posSort);
int idx = nPawns.indexOf(posFrom);
if (nPawns.length == 2) {
if (team == 0) {
chineseString = (idx == 0 ? '前' : '后') + name;
} else {
chineseString = (idx == 1 ? '前' : '后') + name;
}
} else if (nPawns.length == 3) {
if (idx == 1) {
chineseString = '中$name';
} else {
if (team == 0) {
chineseString = (idx == 0 ? '前' : '后') + name;
} else {
chineseString = (idx == 2 ? '前' : '后') + name;
}
}
} else {
if (team == 0) {
chineseString = _nameIndex[idx] + name;
} else {
chineseString = _nameIndex[nPawns.length - idx - 1] + name;
}
}
} else if (colCount > 1) {
if (team == 0) {
chineseString = (posFrom.y > rowIndexs[0] ? '前' : '后') + name;
} else {
chineseString = (posFrom.y < rowIndexs[1] ? '前' : '后') + name;
}
} else {
chineseString =
name + (team == 0 ? colRed[posFrom.x] : colBlack[posFrom.x]);
}
}
if (posFrom.y == posTo.y) {
chineseString += '平${team == 0 ? colRed[posTo.x] : colBlack[posTo.x]}';
} else {
if ((team == 0 && posFrom.y < posTo.y) ||
(team == 1 && posFrom.y > posTo.y)) {
chineseString += '进';
} else {
chineseString += '退';
}
if (['p', 'k', 'c', 'r'].contains(code)) {
int step = (posFrom.y - posTo.y).abs();
chineseString += team == 0 ? _stepIndex[step] : step.toString();
} else {
chineseString += team == 0 ? colRed[posTo.x] : colBlack[posTo.x];
}
}
return chineseString;
}