当前位置: 首页 > 知识库问答 >
问题:

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

柯昆
2023-03-14

这是一个刽子手游戏,逻辑很好-单词填写正确,刽子手会越来越多地被每个单词绞死。然而,“图形”对于用户来说有点困难,正如您在下面的输出中所看到的:

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块将是您在上面看到的。空白设置是不分青红皂白的,它不关心空白是什么位置,它只是将所有的0设置为空白。

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获取块

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

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

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

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

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

0
1
2

我不这么认为。是因为增加了区块吗?他们被1加1,因为他们猜测,这是造成堆叠?或者它是块本身中的某个字符-在字母表数组列表中的文本块中,它可能是\s

为了提供更多关于Daniel回答的细节,

StringBuilder。追加(字符c)ArrayList。正在使用set(int索引、字符串元素)

代码如下:

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);
                                    }
                                }
                            


                          

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

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

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

相反,StringBuilder。在创建ASCII转换的演示时使用append(char c);如果用户输入“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()数组列表。set()产生相同的结果:堆叠。有没有办法将append()set()设置为“侧边”?默认情况下,append()set()方法堆叠字母;看起来它一定是ArrayList中的文本块格式。虽然水平通常是默认值,但是否可以在水平方向强制执行此任意附加/设置,以导致R----


共有1个答案

萧英睿
2023-03-14

我现在明白你的问题了,问题是你在绘制每个字符后都要追加行,这意味着你不能回到同一行来绘制另一个字符,所以你可以将字符中的每一行都保存在String数组中(String[])在您的原始ArrayList中,因此它将是ArrayList

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

 类似资料:
  • 我有一个5页的pdf文件,每页有一个表,我需要提取。我需要从每一页提取所有的表,并将它们保存为数据帧文件,所有使用python,所以我转换了文件,使用tabula的csv文件 文件输出的主要问题。csv是指有几个额外的逗号。 实例 当我将csv文件转换成行/列时,我得到了一些行偏移 注意:dataframe应该有6列,其中包含空字段。我猜额外的逗号来自pdf文件中的空格。如何从csv文件中删除额外

  • 我使用使用捕获的计数器从容器中删除一半元素,如下所示。用编译的C 20 输出出乎意料。对于向量,删除了一个额外的元素: 我打印出结果,看起来是意外删除的元素 虽然这通常不是erase_if的正常用法,但我仍然很好奇为什么它只发生在向量上,而不发生在其他贴图上。我猜这和迭代器类型shenanigan有关。如果有人能详细解释,我将不胜感激。

  • 问题内容: 如何使用Java删除文本文件的前两行? 问题答案: 这是番石榴解决方案: 是的,整个文件都被读到内存中,因此不要尝试使用庞大的服务器日志文件。

  • 我在SwiftUI中有一个InsertGroupedListStyle列表,并注意到iOS 15中添加了额外的顶部填充。如何控制或删除此项? 以下是iOS 14: iOS15:

  • 我有一个带有声明的XML文件,需要使用XSLT将其删除,用于我使用的样式表版本=“2.0” 我拥有的xml文件(输入) 我需要的输出