文本块和 Println 格式,Java:如何删除多余的行

Text Block and Println Formatting, Java: How to Remove Extra Lines

这是一个刽子手游戏,逻辑运行良好 - 单词填写正确,刽子手被绞死的次数越来越多。但是,“图形”对用户来说有点困难,正如您在下面的输出中看到的那样:

3

[ .----------------. 
| .--------------. |
| |  _______     | |
| | |_   __ \    | |
| |   | |__) |   | |
| |   |  __ /    | |
| |  _| |  \ \_  | |
| | |____| |___| | |
| |              | |
| '--------------' |
 '----------------' ,  .----------------. 
| .--------------. |
| |  ____  ____  | |
| | |_   ||   _| | |
| |   | |__| |   | |
| |   |  __  |   | |
| |  _| |  | |_  | |
| | |____||____| | |
| |              | |
| '--------------' |
 '----------------' , .----------------.s
| .--------------. |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| '--------------' |
 '----------------'\, .----------------.s
| .--------------. |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| '--------------' |
 '----------------'\,  .----------------. 
| .--------------. |
| |     ____     | |
| |   .'    `.   | |
| |  /  .--.  \  | |
| |  | |    | |  | |
| |  \  `--'  /  | |
| |   `.____.'   | |
| |              | |
| '--------------' |
 '----------------' , .----------------.s
| .--------------. |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| '--------------' |
 '----------------'\, .----------------.s
| .--------------. |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| '--------------' |
 '----------------'\,  .----------------. 
| .--------------. |
| |  _______     | |
| | |_   __ \    | |
| |   | |__) |   | |
| |   |  __ /    | |
| |  _| |  \ \_  | |
| | |____| |___| | |
| |              | |
| '--------------' |
 '----------------' ,  .----------------. 
| .--------------. |
| |     ____     | |
| |   .'    `.   | |
| |  /  .--.  \  | |
| |  | |    | |  | |
| |  \  `--'  /  | |
| |   `.____.'   | |
| |              | |
| '--------------' |
 '----------------' , .----------------.s
| .--------------. |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| |              | |
| '--------------' |
 '----------------'\]

怎么才能弄平呢? 下面的三个框显示了它是如何创建的相关代码。

if (word.contains(guess)) {
                                for (int location = 0; location < word.length(); location++) {
                                    String letter = String.valueOf(word.charAt(location));
                                    if (letter.equalsIgnoreCase(guess)) {
                                        progressOnWord.set(location, guess);
                                    }
                                }
                                numberCorrect++;
                                p(numberCorrect);
                        }

                

以上代码填入一个ArrayList,progressOnWord,当有正确的单词时。 progressOnWord 以“0000000000”开头,待猜测的单词中有多少个字符就有多少个零。如果猜对了就填上正确的字母,例如:

“rh00o00ro0”在上面显示的当前阶段。然后将其转换为 ASCII:如果字符串为 0,则将 ASCII 块空白添加到 ASCIIform,即 progressOnWord 的 ASCII 形式。例如,如果 progressOnWord 是 rh00o00ro0,那么 ASCII 块将是您在上面看到的。 blank-setting是不分青红皂白的-它不关心blank在什么位置,它只是将全0设置为blanks

for (int j = 0; j < progressOnWord.size(); j++) {
                            String wordPlace = progressOnWord.get(j);
                            if (wordPlace.equals("0")) {
                                ASCIIform.set(j, ASCIIblank);
                            }

这条语句歧视,它确保字母在正确的位置。

for (int k = 0; k < lowercase.length; k++) {
                            String letter = String.valueOf(lowercase[k]);
                            String ASCIIletter = ASCIIalphabet[k];
                            if (wordPlace.equalsIgnoreCase(letter)) {
                                ASCIIform.set(j, ASCIIletter);
                            }
                        }
                        }

注意,两段代码是连续的,这里分开来注释。回到问题:为什么每个块都在一个新行上,如何修复?它从 ArrayList<String> 获取块(在下面浓缩):

public static String[] getASCIIalphabet() {
        String[] ASCIIalphabet = {
                """
 .----------------.\s
| .--------------. |
| |      __      | |
| |     /  \     | |
| |    / /\ \    | |
| |   / ____ \   | |
| | _/ /    \ \_ | |
| ||____|  |____|| |
| |              | |
| '--------------' |
 '----------------'\s""",

                """
 .----------------.\s
| .--------------. |
| |   ______     | |
| |  |_   _ \    | |
| |    | |_) |   | |
| |    |  __'.   | |
| |   _| |__) |  | |
| |  |_______/   | |
| |              | |
| '--------------' |
 '----------------'\s"""
};

ArrayList 的格式可能是问题所在吗?就像你有

"0",
"1",
"2",

在 ArrayList 中,它会打印以下内容吗?

0
1
2

我不这么认为。 是因为添加了块吗?正如他们猜测的那样,它们是 1 乘 1 相加的,这是导致堆叠的原因吗? 或者它是块本身中的某个字符 - 在字母表 ArrayList 中的文本块中,它可能是 \s?

要提供有关 Daniel 回答的更多详细信息,

StringBuilder.append(char c)ArrayList.set(int index, String element) 正在使用中。

代码如下:

for (int j = 0; j < progressOnWord.size(); j++) {
                                String wordPlace = progressOnWord.get(j);
                                if (wordPlace.equals("0")) {
                                    ASCIIform.set(j, ASCIIblank);
                                }
                                
                            

同上,因为0是占位符,遇到0时, 它被替换为 ASCII 块空白:

                                             '----------------'
                                            | .--------------. |
                                            | |              | |
                                            | |              | |
                                            | |              | |
                                            | |              | |
                                            | |              | |
                                            | |              | |
                                            | |              | |
                                            | '--------------' |
                                             '----------------'\, 


        
                                for (int k = 0; k < lowercase.length; k++) {
                                    String letter = String.valueOf(lowercase[k]);
                                    String ASCIIletter = ASCIIalphabet[k];
                                    if (wordPlace.equalsIgnoreCase(letter)) {
                                        ASCIIform.set(j, ASCIIletter);
                                    }
                                }
                            


                          

上面的代码遍历字母表, 正在迭代的循环中 通过单词中的每个字符。 例如,对于“犀牛”: 如果进度是rh00o00ro0, 它检查 r 是否为 0。否。 然后它继续迭代 a, b, c...z, 直到它找到 r。 当它在字母表中找到 r 时, 它注意到 r 在进度中处于 0 点, 并注意到 r 是字母表中的第 18 个字母 并继续将 ASCII 字中的点 0 设置为 ASCII 块字母中的第 18 个字符串:

                                                [ .----------------.
                                                | .--------------. |
                                                | |  _______     | |
                                                | | |_   __ \    | |
                                                | |   | |__) |   | |
                                                | |   |  __ /    | |
                                                | |  _| |  \ \_  | |
                                                | | |____| |___| | |
                                                | |              | |
                                                | '--------------' |
                                                 '----------------' ,
                             

必须使用ArrayList.set(int index, String element)方法,因为角色位置在这个游戏中很重要。

相反,StringBuilder.append(char c)在创建ASCII转换的demo时使用;如果用户输入 'rhinoceros',它会以您在上面看到的 ASCII 块样式打印完整的单词 'rhinoceros',以便让用户体验“图形”样式。这是代码:

                        for (int i = 0; i < allCaps.length(); i++) {
                            char c = allCaps.charAt(i);
                            for (int j = 0; j < uppercase.length; j++) {
                                char bigChar = uppercase[j];
                                String ASCIIblock = getASCIIalphabet()[j];
                                if (c == bigChar) ASCIIword.append(ASCIIblock);
                            }
                        }

值得注意的是 StringBuilder.append()ArrayList.set() 产生相同的结果:堆叠。有没有办法 append()set() “横向”? append()set() 方法默认堆叠字母;似乎 必须 与 ArrayList 中的文本块格式有关。尽管水平通常是默认设置,但是否可以在水平方向上强制 appending/setting 随意,导致 R---->H---->I---->N... ?

我现在明白你的问题了,问题是你在绘制每个字符后追加行,这意味着你不能返回同一行来绘制另一个字符,所以你可以将每一行保存在字符串数组中的一个字符中(String[]) 在您的原始 ArrayList 中,因此它将是 ArrayList<String[]> 并且您可以遍历字符的每一行第一行看看我为解决问题而编写的代码:

final int numberOfLines = 11;
for (int i = 0; i < numberOfLines; i++) {
    for (int j = 0; j < asciiForm.size(); j++) {
        String[] word = asciiForm.get(j);
        System.out.print(word[i]);
    }
    System.out.println("\t");
}

ArrayList 中字符的外观示例:

   asciiForm.add(
                new String[] { 
                        " .----------------. ", 
                        "| .--------------. |", 
                        "| |  _______     | |", 
                        "| | |_   __ \    | |", 
                        "| |   | |__) |   | |", 
                        "| |   |  __ /    | |", 
                        "| |  _| |  \ \_  | |", 
                        "| | |____| |___| | |", 
                        "| |              | |", 
                        "| '--------------' |", 
                        " '----------------' "
                }

        );

我得到的输出:

注意:我没有把所有的字符都加到ArrayList中,因为我不需要这样做,我只加了R和H