FEN加载器生成棋盘数组时输出数值异常问题求助
问题分析与修复方案
1. 字典映射笔误:黑方主教(b)错误映射到白方
你的PieceTypeFromSymbol字典中,小写'b'被错误关联到Piecies.White.Bishop,正确应该指向黑方主教:
['b'] = Piecies.Black.Bishop, // 原代码为White.Bishop,此处是核心笔误
2. FEN解析的行列变量逻辑完全颠倒
FEN棋盘段的规则是:从第8行(棋盘最上方)到第1行(最下方),每行从a列到h列依次排列。你代码里的rank和file变量逻辑完全搞反:
- 遇到
/时,应该切换到下一行(rank递减,对应FEN的下一个段),而非重置rank并递增file - 初始值应设为
rank =7(FEN第一个段对应棋盘第8行,对应数组索引7),file=0(对应a列) - 数字代表连续空格子,应让
file增加对应数值,而非rank
3. 缺失棋盘初始化逻辑
未初始化的Square数组会保留随机值,需先将所有格子设为默认空值(根据需求选择White.None或其他空值)。
修复后的完整代码
public static void LoadPositionFromFen(string fen) { var PieceTypeFromSymbol = new Dictionary<char, int>() { ['K'] = Piecies.White.King, ['k'] = Piecies.Black.King, ['P'] = Piecies.White.Pawn, ['p'] = Piecies.Black.Pawn, ['N'] = Piecies.White.Knight, ['n'] = Piecies.Black.Knight, ['B'] = Piecies.White.Bishop, ['b'] = Piecies.Black.Bishop, ['R'] = Piecies.White.Rook, ['r'] = Piecies.Black.Rook, ['Q'] = Piecies.White.Queen, ['q'] = Piecies.Black.Queen }; string fenBoard = fen.Split(' ')[0]; int rank = 7; // FEN第一个段对应棋盘第8行,数组索引为7 int file = 0; // 初始化所有格子为默认空值 for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) Square[i, j] = Piecies.White.None; foreach (char symbol in fenBoard) { if (symbol == '/') { rank--; // 切换到上一行(FEN下一个段对应更低的棋盘行) file = 0; // 重置到当前行的a列 } else { if (char.IsDigit(symbol)) { file += (int)char.GetNumericValue(symbol); // 空格子,列数增加对应数量 } else { var piece = PieceTypeFromSymbol[symbol]; Square[rank, file] = piece; file++; // 移动到下一列 } } } }
内容的提问来源于stack exchange,提问作者GabrieleC0
相关产品推荐
相关产品推荐

