我是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
我知道这对游戏来说并不是必不可少的,可能只是让我的事情变得比必要的更复杂,但它驱使我坚果。我想发生了什么,当你输入你的猜测后点击输入,程序开始一个新的行,然后打印公牛和奶牛。有没有办法解决这个问题?
答案 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 Console或Java 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)
这是一个从显示角度实现相同目标的不同实现,但你应该注意到我正在通过多个新行清除屏幕,所以最终效果仍然相同,即...
注意:我有运行程序的硬编码公牛和奶牛值。
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);
}
}
}
示例运行