问题描述
这是一个刽子手游戏,逻辑很好——单词填对了,刽子手越来越多地被每个单词挂了。但是,“图形”对用户来说有点困难,您可以在下面的输出中看到:
3
[ .----------------.
| .--------------. |
| | _______ | |
| | |_ __ \ | |
| | | |__) | | |
| | | __ / | |
| | _| | \ \_ | |
| | |____| |___| | |
| | | |
| '--------------' |
'----------------',.----------------.
| .--------------. |
| | ____ ____ | |
| | |_ || _| | |
| | | |__| | | |
| | | __ | | |
| | _| | | |_ | |
| | |____||____| | |
| | | |
| '--------------' |
'----------------',.----------------.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,则向 ASCIIform(progressOnWord 的 ASCII 格式)添加一个 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<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);
}
}
上面的代码遍历一个字母表, in 正在迭代的循环 通过单词中的每个字符。 例如,对于“犀牛”: 如果进度是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 转换的演示;如果用户输入'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中的文本块格式有关。尽管水平通常是默认值,但是否可以在水平方向强制执行这种随意附加/设置,以导致 R---->H---->I---->N...?
解决方法
我现在明白您的问题了,问题是您在绘制每个字符后附加行,这意味着您无法返回到同一行绘制另一个字符,因此您可以将每个行保存在字符串数组中的字符中 ({ {1}}) 在原始 ArrayList 中,因此它将是 String[]
并且您可以遍历字符的每一行,看看我为解决问题而制作的代码:
ArrayList<String[]>
字符在 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 中,因为我不需要这样做,我只添加了 R 和 H