You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:57:23