这是一个刽子手游戏,逻辑很好-单词填写正确,刽子手得到越来越多的每一个单词吊死。然而,“图形”对于用户来说有点困难,正如您在下面的输出中所看到的:
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<String>
(以下简称):
public static String[] getASCIIalphabet() {
String[] ASCIIalphabet = {
"""
.----------------.\s
| .--------------. |
| | __ | |
| | / \\ | |
| | / /\\ \\ | |
| | / ____ \\ | |
| | _/ / \\ \\_ | |
| ||____| |____|| |
| | | |
| '--------------' |
'----------------'\s""",
"""
.----------------.\s
| .--------------. |
| | ______ | |
| | |_ _ \\ | |
| | | |_) | | |
| | | __'. | |
| | _| |__) | | |
| | |_______/ | |
| | | |
| '--------------' |
'----------------'\s"""
};
arraylist的格式可能是问题所在吗?就像你曾经
"0",
"1",
"2",
在arraylist中,它会打印以下内容吗?
0
1
2
我不这么认为。是因为积木的增加吗?他们被1加1,因为他们猜测,这是造成堆叠?或者它是块本身的某个字符-在字母表数组列表的文本块中,它可能是 \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块空白:
'----------------'
| .--------------. |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| '--------------' |
'----------------'\,
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。。。?
1条答案
按热度按时间8fsztsew1#
我现在明白你的问题了,问题是你在画完每个字符后都要附加行,这意味着你不能回到同一行去画另一个字符,这样你就可以把每个行都保存在一个字符串数组中(
String[]
)在你原来的数组列表中ArrayList<String[]>
你可以遍历每个字符的第一行,看看我用来解决问题的代码:角色在arraylist中的外观示例:
我得到的结果是:
注意:我没有将所有字符添加到arraylist中,因为我不需要这样做,我只添加了r和h