toChineseString method

String toChineseString(
  1. String move
)

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;
}