我卡在了Java作业上——使用StringBuilder编写Hangman游戏——求助?

4

*注意:我并不是让你帮我做作业,我只是卡住了。

我现在正在设计一个Hangman类。显然,我们需要三个StringBuilders(a)用于显示连字符:"--------",长度为单词长度,(b)用于显示正确的猜测字母:"--a--e---",最后(c)另一个基本上与b相反(猜测的字母被连字符替换,未猜测的字母被揭示)。c)的目的是在猜测过程中查看是否有匹配项。

我的最大问题是我在谷歌上找不到很多实际的StringBuilder示例,即我的最大问题是在Hangman类中可以/应该在哪里实例化这三个StringBuilders?

谢谢...


你真的需要三个变量吗?你可以使用一个 StringBuilder 并在玩家猜测时不断更改字符。 - MohamedSanaulla
1
StringBuilder示例 - Emil
通过在问题文本中提到它是作业来表明这一点;“作业”标签和其他所谓的“元”标签一样,现在已经不鼓励使用。 @willCode http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework-questions - Woot4Moo
@Woot4Moo - 嗯,有关作业标签的维基百科上没有任何介绍。 - willcodejavaforfood
@willCode很好知道,也许应该更新维基百科。 - Woot4Moo
显示剩余2条评论
4个回答

2
我猜测您有一个Hangman类,作为模型执行三个操作(与此相关),即:
  • 为您提供一个字符串,其中每个字符都用-表示要猜的单词中的字符
  • 为您提供一个字符串,其中显示正确猜测的字符在正确的位置
  • 为您提供一个字符串,其中显示已使用的字符
这些都取决于模型的状态,即单词和已猜测的字符。
基于此,我认为您应该有三种方法返回字符串,并在每种方法中创建一个新的StringBuilder实例。构建字符串是与状态分离的,只是为了清楚起见,我不同意Computerish的观点。
StringBuilder是一种更有效的构建字符串的方式,而不仅仅是使用连接,但它很容易使用。您可以从创建其实例开始。
StringBuilder builder = new StringBuilder();

然后,您可以通过附加字符串、字符或其他内容来构建字符串:
builder.append('-');
builder.append('w');

完成后,您可以使用 StringBuilder 构造一个 String 实例:
String string = builder.toString();

最后你会得到"-w"这个相当无聊的例子。


请参见Computerish的评论下面发布的具体细节,为什么这非常准确。 - votezdlr
@votezdlr - 谢谢,我可以继续说下去,但希望你已经有足够的信息来继续 :) - willcodejavaforfood
所以对于...private String word; // 在构造函数之前声明的实例变量。public String word() { // 猜测的单词 StringBuilder builder = new StringBuilder(word); // 这个? }还是怎么样?很抱歉,也许现在太早了或者其他什么原因,但我似乎想不出解决这个问题的好策略。 - votezdlr
@votezdlr - 你不必在构造函数中创建StringBuilder。只有在需要它们的方法中才创建它们。将方法视为动词,即您的类可以执行的操作。例如buildGuessedLettersString、buildWordToGuessString等。在这些方法中,您使用StringBuilder来构建正确的字符串。 - willcodejavaforfood

0

一个简短的例子:

StringBuilder helloWorldBuilder = new StringBuilder();
helloWorldBuilder.append("Hello");
helloWorldBuilder.append(" ");
helloWorldBuilder.append("World");
helloWorldBuilder.append("!");
String helloWorld = helloWorldBuilder.toString();

是的,你可以创建任意数量的StringBuilder对象(假设你有无限的堆空间,但实际上说:“任意数量”应该大于3 :-))


0
StringBuilder的目的是在使用之前构建字符串。它们应该每次都新建(这对于即将到来的更困难的问题是一个好习惯)。因此,不要考虑stringbuilder类,而是考虑如何构建所需的字符串。假设您正在将正确的猜测存储在char数组中,您可以有三种方法根据需要构建字符串。在其中一种情况下,您根本不需要StringBuilder。
您的ToBlankFormat方法可能如下所示:
public String toBlankFormat()
{
    char[] format = new char[answer.length()];
    Arrays.fill(format, '-');
    return new String(format);
}

基本上,使用 StringBuilder 只需要追加字符串、字符等,然后调用 ToString() 方法。一个示例看起来像这样:
public String example()
{
    StringBuilder builder = new StringBuilder("Hello"); // initial value

    if (addSpaces)
    {
        builder.append(" ");
    }

    builder.append("World");
    return builder.ToString();
}

-1

这三个 StringBuilder 应该是你的类的实例变量。你可以在类的构造函数中实例化它们,或者在选择要猜测的单词时实例化它们。


我不同意这里的观点。它们可以是实例变量,但说它们应该是有些过头了。 - willcodejavaforfood
这里在美妙大学提供的CS实验室为Hangman类提供了模板,其中包括以下类构造函数: - votezdlr
请提供一个名为“word”的方法:public String word().... - votezdlr
将StringBuilder或StringBuffer作为实例变量使用可能会在处理更复杂的问题(如竞态条件和其他并发问题)时导致不良影响。它们的目的是根据需要创建复杂的字符串,并且对垃圾收集器没有太大压力。简而言之,这只是一种不好的做法。StringBuilder用于表示状态,而不是保留状态。 - Berin Loritsch
当然有很多方法可以实现这个。在我的计算机科学课程经验中,问题的措辞会表明老师正在寻找三个StringBuilders作为实例变量。话虽如此,你的老师可能正在寻找与我的不同的东西。 - Computerish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接