这是一个刽子手游戏,逻辑很好——单词填写正确,刽子手越来越被每个单词绞死。然而,“图形”对用户来说有点困难,你可以在下面的输出中看到:
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:如果 String 为 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<String>
(浓缩如下)获取块:
public static String[] getASCIIalphabet() {
String[] ASCIIalphabet = {
"""
.----------------.\s
| .--------------. |
| | __ | |
| | / \\ | |
| | / /\\ \\ | |
| | / ____ \\ | |
| | _/ / \\ \\_ | |
| ||____| |____|| |
| | | |
| '--------------' |
'----------------'\s""",
"""
.----------------.\s
| .--------------. |
| | ______ | |
| | |_ _ \\ | |
| | | |_) | | |
| | | __'. | |
| | _| |__) | | |
| | |_______/ | |
| | | |
| '--------------' |
'----------------'\s"""
};
ArrayList 的格式可能是问题吗?就像你有
"0",
"1",
"2",
在 ArrayList 中,它会打印以下内容吗?
0
1
2
我不这么认为。是因为添加了方块吗?正如他们所猜测的那样,它们被一个一个地添加,这会导致堆叠吗?或者是块本身中的某个字符 - 在字母 ArrayList 中的文本块中,它可能是\s
?
要提供有关丹尼尔答案的更多详细信息,
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 Block Blank:
'----------------'
| .--------------. |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| '--------------' |
'----------------'\,
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 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...?