toPositionString method

String toPositionString(
  1. int team,
  2. String move
)

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()}';
}