Java printf问题

3

为了让这段代码按照预期运行,请使用cmd/终端而不是IDE。(否则你将看不到\r的正确效果)

当终端中的9在4个空格后到达最右侧位置时,它会掉头并向后移动4个空格,如此往复。然而,在完成一个完整的周期后,当它到达起点时,第二个空格上仍然有一个未被\r清除的数字9。这可能是什么原因呢?

public class Core {
    public static void main(String[] args) throws InterruptedException {

        int Array[][] = new int[4][6];
        int score;
        boolean enemy = true;
        boolean dir = true;

        // EnemyLine
        while (enemy) {
            for (int i = 1;;) {
                Thread.sleep(1000);

                if (i == 1)
                    dir = true;
                else if (i == 4)
                    dir = false;
                if (dir == true) {
                    int a = Array[0][i] = 9;
                    System.out.printf("%" + i + "d", a);
                    i++;
                    System.out.print("\r");
                    continue;
                } else if (dir == false) {
                    int a = Array[0][i] = 9;
                    System.out.printf("%" + i + "d", a);
                    i--;
                    System.out.print("               \r");
                    continue;
                }
            }
        }

    }
}   

1
我这里没有看到问题或者除了作业问题之外的其他问题。在调试器/IDE中运行它,并观察所有变量和输出窗口,以确定发生了什么。或者,只需在纸上(或者在脑海中)逐步执行即可,它并不太复杂。 - KevinDTimm
问题在于回程时\r不能每9个清除一次。我无法找到导致这个问题的原因,而且我在eclipse中编写代码时也找不到错误。(无论如何,在eclipse中代码并没有按预期运行,因为由于某种原因它会跳过一行,但在终端中所有输出都在同一行上) - jim layhey
1
关于你的代码,有几个无关的评论: 你写了 if (dir == true) { ... } else if (dir == false) { ... }。既然 dir 是一个布尔值,它只能是 true 或 false,所以你的 if..else 可以这样写:if (dir == true) { ... } else /*dir 必须是 false*/ { ... } 此外,不要测试 some_boolean == true,只需测试 some_booleanif (dir) { ... } else { ... }。 这很令人困惑,因为 "dir"(方向?)并没有告诉你太多信息:dir == true 是什么意思?如果它表示“向右移动”,而 false 表示“向左移动”,那么将 dir 重命名为 movingRight ... if (movingRight) { ... } else { /* 向左移动 */ } - Stephen P
我也会采纳Stephen的建议。@heathbm。显然,你需要改进你的编程逻辑。而在编程时,更好的命名总是有帮助的。虽然我喜欢使用\r或回车符。 - Acewin
1个回答

3

解释为什么会得到这样的结果

基本上,在您的循环中,您正在更改放置回车符\r的位置。

在循环完成后,当您返回 i = 1 时,您正在更改每隔多少个字符进行换行。

1 -> _9\r
2 -> __9\r
3 -> ___9\r
4 -> ____9      \r
x3 -> ___9       \r
x2 -> __9        \r
x1 -> _9\r

因此,最后一条语句没有清除x2处的9。

需要更改if (dir == true)中的内容。

System.out.print(" \r" ); // enter a space before \r

或者最好使用。
System.out.print("               \r" ); // preferable

您还可以从条件循环中删除sysout \ r,并在Thread sleep之前使用它。

System.out.print("       \r" );
Thread.sleep(1000);

感谢您的反馈,我现在使用了您提供的第二种方法,现在我明白了我最初犯了什么错误。非常感谢。 - jim layhey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接