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

Java扫雷文本界面UTF-8字符⚑打印缩进异常问题求助

解决Java扫雷文本界面旗帜字符对齐问题

嘿,我来帮你搞定这个控制台打印旗帜时的对齐异常问题!

问题根源

你遇到的间距变小问题,核心原因是Unicode旗帜字符⚑是全宽字符——在绝大多数终端里,它会占据2个普通ASCII字符的显示宽度,但你用的%4c格式化是按单个字符的数量来分配空间的(不管实际显示宽度)。比如你给了4个字符的位置,ASCII字符只占1个,剩下3个空格;但旗帜占2个,剩下2个空格,相邻两个旗帜加起来就比普通元素少了2个空格的间距,看起来就挤在一起了。

解决方案

我们可以把所有元素都当作字符串来格式化,让终端自动处理全宽字符的占位,确保每个单元格的显示宽度一致。具体修改如下:

  1. 统一用字符串格式化:把所有printf里的字符/数字格式都换成字符串格式%4s,这样不管是单宽的-、数字,还是双宽的⚑,都会按照4个显示宽度来对齐。
  2. 确保控制台编码为UTF-8:避免字符乱码,要么在代码开头设置编码,要么运行程序时加参数。

修改后的核心代码

public void printField() {
    String FLAG = "⚑";
    // 确保控制台编码为UTF-8(可选,若终端默认编码不是UTF-8则需要)
    System.setProperty("console.encoding", "UTF-8");
    
    for (int row = 0; row < field.length; row++) {
        for (int col = 0; col < field[row].length; col++) {
            if (state[row][col] == 0) {
                System.out.printf("%4s", "-");
            } else if (state[row][col] == 1 && field[row][col] != -1) {
                System.out.printf("%4s", String.valueOf(field[row][col]));
            } else if (field[row][col] == -1 && state[row][col] == 1) {
                System.err.printf("%4s", "*");
            } else if (state[row][col] == 2) {
                System.err.printf("%4s", FLAG);
            }
        }
        System.out.println();
    }
}

额外提示

如果修改后还是有问题,试试在运行Java程序时加上UTF-8编码参数:

java -Dfile.encoding=UTF-8 Minesweeper

这能确保Java输出的字符编码和终端一致,避免乱码或宽度计算错误。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:15:47