开发CLI国际象棋项目时,终端打印如何使用自定义字体?
CLI国际象棋自定义棋子实现方案
因为CLI(命令行界面)本身不支持像GUI那样加载自定义字体文件,所以无需纠结字体加载,直接用以下两种零第三方库的可行方案:
1. 使用Unicode内置国际象棋字符
Unicode标准包含一套完整的国际象棋棋子字符,能在绝大多数现代终端(Windows Terminal、Linux/macOS终端)中直接显示,实现成本极低。
对应字符映射:
- 白方:♔(王)、♕(后)、♖(车)、♗(象)、♘(马)、♙(兵)
- 黑方:♚(王)、♛(后)、♜(车)、♝(象)、♞(马)、♟(兵)
代码示例(Java)
// 初始化棋盘状态 char[][] board = { {'♜', '♞', '♝', '♛', '♚', '♝', '♞', '♜'}, {'♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'}, {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, {'♙', '♙', '♙', '♙', '♙', '♙', '♙', '♙'}, {'♖', '♘', '♗', '♕', '♔', '♗', '♘', '♖'} }; // 打印棋盘(支持黑白背景) public void printBoard() { for (int i = 0; i < 8; i++) { // 打印行号 System.out.print(8 - i + " "); for (int j = 0; j < 8; j++) { // 用ANSI转义码实现交替背景色(终端不支持可删除) String bgColor = (i + j) % 2 == 0 ? "\u001B[47m" : "\u001B[40m"; System.out.print(bgColor + board[i][j] + "\u001B[0m "); } System.out.println(); } // 打印列号 System.out.println(" a b c d e f g h"); }
2. 自定义ASCII艺术棋子
如果Unicode字符不符合需求,可手动用ASCII字符组合棋子样式,兼容性拉满(所有终端都支持)。核心思路是把每个棋子拆成多行字符,打印棋盘时逐行拼接所有棋子的对应行内容。
代码示例(Java)
// 定义白方棋子的ASCII样式(每行5个字符,共5行) String[][] whitePieces = { {" ♚ ", " ♛♛♛ ", "♛♚♛♛♛", " ♛♛♛ ", " ♚ "}, // 王 {" ♕ ", " ♕♕♕ ", "♕♕♕♕♕", " ♕♕♕ ", " ♕ "}, // 后 {" ♖ ", " ♖♖♖ ", "♖ ♖ ♖", " ♖♖♖ ", " ♖ "}, // 车 {" ♗ ", " ♗♗♗ ", "♗♗♗♗♗", " ♗♗♗ ", " ♗ "}, // 象 {" ♘ ", " ♘♘♘ ", "♘♘♘♘♘", " ♘♘♘ ", " ♘ "}, // 马 {" □ ", " □□□ ", "□□□□□", " □□□ ", " □ "} // 兵 }; // 定义黑方棋子的ASCII样式 String[][] blackPieces = { {" ♔ ", " ♜♜♜ ", "♜♔♜♜♜", " ♜♜♜ ", " ♔ "}, // 王 {" ♛ ", " ♜♜♜ ", "♜♛♜♜♜", " ♜♜♜ ", " ♛ "}, // 后 {" ♜ ", " ♜♜♜ ", "♜ ♜ ♜", " ♜♜♜ ", " ♜ "}, // 车 {" ♝ ", " ♜♜♜ ", "♜♝♜♜♜", " ♜♜♜ ", " ♝ "}, // 象 {" ♞ ", " ♜♜♜ ", "♜♞♜♜♜", " ♜♜♜ ", " ♞ "}, // 马 {" ■ ", " ■■■ ", "■■■■■", " ■■■ ", " ■ "} // 兵 }; // 打印ASCII棋盘 public void printASCIIBoard(char[][] boardState) { // 每个棋子占5行,循环打印每行内容 for (int line = 0; line < 5; line++) { // 中间行打印行号 System.out.print(line == 2 ? (8 - (line / 5)) + " " : " "); for (int col = 0; col < 8; col++) { char piece = boardState[line / 5][col]; String[] art = new String[]{" ", " ", " ", " ", " "}; if (Character.isUpperCase(piece)) { // 匹配白方棋子样式 switch (piece) { case 'K': art = whitePieces[0]; break; case 'Q': art = whitePieces[1]; break; case 'R': art = whitePieces[2]; break; case 'B': art = whitePieces[3]; break; case 'N': art = whitePieces[4]; break; case 'P': art = whitePieces[5]; break; } } else if (Character.isLowerCase(piece)) { // 匹配黑方棋子样式 switch (Character.toUpperCase(piece)) { case 'K': art = blackPieces[0]; break; case 'Q': art = blackPieces[1]; break; case 'R': art = blackPieces[2]; break; case 'B': art = blackPieces[3]; break; case 'N': art = blackPieces[4]; break; case 'P': art = blackPieces[5]; break; } } System.out.print(art[line] + " "); } System.out.println(); } // 打印列号 System.out.println(" a b c d e f g h"); }
核心说明
- CLI环境下无法强制终端加载自定义字体,所有显示内容只能依赖终端支持的字符集,因此Unicode或ASCII是唯一可行路径。
- Unicode方案简洁高效,ASCII方案兼容性更强,可根据项目需求选择。
内容的提问来源于stack exchange,提问作者Huchsle
相关产品推荐
相关产品推荐

