Java - 如何在输入后打印()输出到上一行

时间:2017-07-12 22:56:40

标签: java

我是Java的新手,我仍然试图掌握它,所以我很抱歉这是一个愚蠢的问题,但我想知道如何打印输出行作为输入。例如,我编写了一个简单的游戏,用户试图猜测一个4位数字(就像Mastermind一样)。我已经弄清楚所有的机制,但我很难在控制台上显示它。在一开始它可能看起来像:(a)

Turn    Guess   Bulls   Cows
----------------------------
1

然后,用户输入他们的猜测:(b)

Turn    Guess   Bulls   Cows
----------------------------
1       1234

一旦用户点击进入,程序应该检查他们对秘密号码的猜测并输出" bulls" (他们的猜测数字与秘密数字完全匹配)和"奶牛" (他们的猜测中的数字是数字的一部分,但位置错误),然后开始一个新的行并再次等待用户输入。所以,如果秘密号码是4321 ......(c)

Turn    Guess   Bulls   Cows
----------------------------
1       1234    0       4
2

麻烦的是,我不能为我的生活弄清楚如何让输出显示在与输入相同的行上。这是我到目前为止的一小部分(由于完整代码更加丑陋而被删除):

number = "4321";
String guess;
int attempts = 1;
do
{
    System.out.print(attempts + "\t\t");
    guess = keyboard.next();
    attempts++;
    int bulls = checkBulls(guess, number);
    int cows = checkCows(guess, number);
    System.out.print("\t\t" + bulls + "\t\t" + cows + "\n");
}
while (!guess.equals(number));

这让我(b),但是当我按下回车时,会发生这种情况:

Turn    Guess   Bulls   Cows
----------------------------
1       1234                 // so far so good
    0       4                // ack! These should've been on the previous line!
2

我知道这对游戏来说并不是必不可少的,可能只是让我的事情变得比必要的更复杂,但它驱使我坚果。我想发生了什么,当你输入你的猜测后点击输入,程序开始一个新的行,然后打印公牛和奶牛。有没有办法解决这个问题?

4 个答案:

答案 0 :(得分:5)

您应该查看Ansi Escape Codes

类似的东西:

public void update() {
    final String guessString = keyboard.next();

    System.out.println("\033[1A\033[" + guessString.length() + 'C'
        + "\t{next col}");
}

将导致:

1234   {next col}

(用户输入了1234,然后是{RETURN};在适当支持的控制台中。

"\033[1A"将光标向上移动1行;并且"\033[xC"将光标x移动到右侧(我们在上面计算x作为猜测的长度)。

使用此方法的另一个选项是清除控制台("\033[2J"),这样您就可以完全重新绘制表格(这可能更容易维护)。

答案 1 :(得分:1)

您的问题很清楚,控制台或清除依赖于您正在使用的控制台的线路,并且是依赖的!

请参阅Java Clear ConsoleJava clear Line

无论如何这个例子清除了行,它在Unix bash shell上运行。 (不在Eclipse控制台中) 它使用"\b"来清除字符(反斜杠)

 public static void main(String[] args) throws Exception {
        int i=0;

        while (true)
        {            

            String hello="Good morning"+i;
            System.out.print(hello+i);
            int j=0;
            while(j<=hello.length()){
                 System.out.print("\b");
                j++;
            }
            i++;
            Thread.sleep(1000);
            if(i==100)
                break;
        }
    }

你的情况下的问题是,你需要清除新行,因为你读取输入并且没有新行是读取输入的简单方法。 见How to read a single char from the console in Java (as the user types it)?

答案 2 :(得分:0)

我知道这不是你的实现,但它可能就足够了。你可以做的是在每次输入后打印游戏进度。然后,您可以在每次尝试后看到游戏进度,每次都会更新电路板。

    ArrayList<String> turns = new ArrayList<>();
    turns.add("Turn\t\tGuess\t\tBulls\t\tCows\n");
    turns.add("----------------------------------------------------");
    Scanner keyboard = new Scanner(System.in);
    String number = "1234";
    String guess = "";
    int attempts = 0;

    while(!number.equals(guess))
    {
        for(String line : turns)
            System.out.println(line);
        System.out.println("Guess the magic number...");
        guess = keyboard.nextLine();
        attempts++;
        int bulls = checkBulls(guess, number);
        int cows = checkCows(guess, number);
        String attemptOutput = attempts + "\t\t" + guess + "\t\t" + bulls + "\t\t" + cows + "\n";
        turns.add(attemptOutput);
    }

答案 3 :(得分:0)

这是一个从显示角度实现相同目标的不同实现,但你应该注意到我正在通过多个新行清除屏幕,所以最终效果仍然相同,即...

  • 用户将在Guess列
  • 下输入数字
  • 用户按ENTER键后,将立即显示每次尝试。

注意:我有运行程序的硬编码公牛和奶牛值。

import java.util.ArrayList;
import java.util.Scanner;

public class Game {

    public static void main(String[] args) {
        ArrayList<String> attempts = new ArrayList<String>();
        attempts.add("Turn\t\tGuess\t\tBulls\t\tCows\n");
        attempts.add("----------------------------------------------------");
        Scanner keyboard = new Scanner(System.in);
        String number = "1234";
        String guess = "";
        int turn = 1;

        while (!number.equals(guess)) {
            // multiple new lines to clear screen
            System.out.println("\n\n\n\n\n\n\n\n");
            for (String line : attempts)
                System.out.println(line);
            System.out.print(turn + "\t\t");
            guess = keyboard.nextLine();
            // checkbull implementation
            int bulls = 0;
            // checkcow implementation
            int cows = 4;
            String attemptOutput = turn + "\t\t" + guess + "\t\t" + bulls
                    + "\t\t" + cows;
            turn++;
            attempts.add(attemptOutput);
        }
    }
}

示例运行

enter image description here