2015-10-14 67 views
3

对于此代码按预期运行使用您的cmd /终端不是IDE。 (或者你不会看到\ r的正确效果)Java printf并发症

当终端中的9到达4个空格后的最右边位置时,它将转向并且向后移动4个空格并且继续。但是,当它在完整循环后到达起始点时,第二个空间上的剩余9个不会被\ r清除。什么可能导致这个?

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

+0

那么问题是,在返回的腿\ r不清楚每9个。我无法找到是什么原因导致这也是我在eclipse中写入,并找不到错误。 (代码在eclipse中并没有像预期的那样起作用,因为它跳转了一行,但是在终端中所有的输出都发生在一行上) – heathbm

+1

你的代码中几条无关的注释: 你有'if(dir == true) {...} else if(dir == false){...}'因为_dir_是一个布尔值,所以它只能是真或假,所以你的if..else可以是'if(dir == true){。 ..} else/* dir必须是false */{...}' 另外,不要测试'some_boolean == true'是否测试'some_boolean':'if(dir){...} else { ...} 这很混乱,因为“dir”(方向?)没有告诉你很多:'dir == true'是什么意思?如果它意味着“向右移动”,虚假意味着“向左移动”,则将“dir”重命名为“movingRight”......如果(movingRight){...} else {/ * left left * /}' –

回答

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 

因此最后一条语句不清除9日在X2如果(DIR ==真)需要

变化

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

或者这将是最好使用

System.out.print("    \r"); // preferable 

您还可以从条件循环中删除您的sysout \ r并在线程休眠前使用它

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

感谢您的反馈,我现在使用第二种方法,现在我明白我最初出错的地方。非常感激。 – heathbm