在我的代码中,我有一个变量,点,该变量根据输入字符串中的缺点和元音而增加。方法parseSentence
可以增加每个单词的分数,但也可以忽略空格。
我尝试运行调试器以查看问题出在哪里,但是当调试器到达parseSentence
中的for循环时,它就会死掉。该方法使点变量的值成为单词的点值,而不是将其添加到变量中。可能是什么原因造成的?
import java.util.*;
public class WordGolf1 {
public static int points = 1;
public static void main(String[] args) {
String Input;
System.out.println("Enter word: ");
Scanner sc = new Scanner(System.in);
Input = sc.nextLine();
System.out.println("Not enough points. " + (100 - points) + " needed.");
while (points < 100) {
System.out.println("Enter word: ");
Input = sc.nextLine();
parseSentence(Input);
System.out.println(points + ": points");
System.out.println("Not enough points. " + (100 - points) + " needed.");
}
boolean overshot = true;
Loop:
while (overshot = true) {
if (points == 100) {
overshot = false;
break Loop;
}
points = 100 - (points - 100);
System.out.println("Overshot by " + (points - 100) + " points.");
Input = sc.nextLine();
parseSentence(Input);
}
System.out.println("Congratulations you win!");
sc.close();
}
public static int parseSentence(String input) {
String[] pieces = input.split("\\s+");
for (int y = 0; y < pieces.length; y++) {
if (pieces.length > 1) {
if (y == 0) {
parseWord(input);
} else {
parseWord(input, y);
}
} else {
parseWord(input);
}
}
return points;
}
public static int parseWord(String input) {
String[] pieces = input.split("\\s+");
String charList = "aeiouyAEIOUY";
String consanantList
= "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ";
int pointsTemp = 1;
for (int x = 0; x < pieces[0].length(); x++) {
if (charList.indexOf(pieces[0].charAt(x)) != -1) {
pointsTemp *= 2;
} else if (consanantList.indexOf(pieces[0].charAt(x))
!= -1) {
pointsTemp++;
}
}
points = pointsTemp;
return points;
}
public static int parseWord(String input, int number) {
String[] pieces = input.split("\\s+");
String charList = "aeiouyAEIOUY";
String consanantList
= "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ";
int pointsTemp = 1;
for (int x = 0; x < pieces[number].length(); x++) {
if (charList.indexOf(pieces[number].charAt(x)) != -1) {
pointsTemp *= 2;
} else if (consanantList.indexOf(pieces[number].charAt(x)) != -1) {
pointsTemp++;
}
}
points += pointsTemp;
return points;
}
}
答案 0 :(得分:0)
您没有使用parseSentence
方法返回的值。
答案 1 :(得分:0)
编辑:我尝试通过进行必要的更改来重写此代码,以使其接近原始代码。
现在很明显,您的老师有要求,我们不能反对这一要求,但是您应该牢记一些兴趣点。
多次拆分
在您的示例中,您拆分了文本以获取单词数量。然后,而不是循环已拆分的文本。您正在发送原始输入,然后再次拆分。 “双重”拆分是您需要“三种”方法的原因。如果不进行双分割,则可以简单地从单分割开始循环长度,而只需使用一个ParseWord方法。
扣除值
在您的示例中,如果玩家过头,您将赢走100。问题是,假设该人获得了200分。然后,它将循环两次以降低两次提交“ You overshot message”的值。但是,我们可以说以一种神奇的方式获得了100,000,000分。然后,如您所见,我们将循环一百万次以扣除此值,从而创建一个非无限循环,但也可能是无限循环。
要解决此问题,我们只需执行以下操作即可。
Value = Value % 100.
这将使我们的剩余值在0到99之间。 167等于67 , 12384等于84。
使用字符串(IndexOf)
此操作是采用您提供的 Character (字符)并循环遍历提供的String。最坏的情况是12个循环。 String和IndexOf还有很多其他的东西,这些都是额外的工作,如果可以的话,我建议不要使用它。
我做的另一种解决方案是使用字符并在其上使用“ | 32”。我不会深入研究位的工作原理,但是基本上这些字符是8位值,但是我们只使用了7位,从32到127。位的数量就像2的幂。所以2 ^ 7 = 128和2 ^ 8 =256。当我们执行“ |”时我们会稍微打开一点,以便如果已经打开就不会更改该值。
因此在我们的示例中,我们假设值为64。
这是打开的位6。现在,我们想将位5设置为“ 32”,以使该值变为96,但是如果我们已经有了值96,并且将其设置为32,则仍为32。
ASCII字符的完整列表。
游戏循环
在您的示例中,您创建的“ TWO”游戏循环是从头开始的,第一个是循环,但是一旦您的得分超过极限,便进入第二个循环而忘记了第一个循环。现在的问题是,不再使用您的“输入单词”和“您的下注”代码。因此,所有人所看到的就是一行输入文本的信息,该文本不包含有关操作或发生的信息,除非他们超调,然后他们收到超调的消息。
为解决此问题,我制作了一个游戏循环,直到代码通过SCORE == 100结束为止。您可以在代码中看到,每个游戏循环都以“ Enter Words:”开始并解析句子。然后,我们加总得分并进行比较。如果我们未达到要求,我们只需重新启动循环,然后重试即可。如果我们超调了,我们会降低分数,然后重试。如果成功,我们会提示用户是否要再次玩或结束游戏。再次播放会将SCORE设置为0并重新开始循环。结束游戏将“破坏”循环并使其结束。
具有建议更改的完整工作代码
如果需要其他帮助,请随时发表评论。
import java.util.*;
public class WordGolf1
{
private static int SCORE = 0;
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while (true)
{
System.out.print("\n\nEnter word: ");
ParseSentence(sc.nextLine());
if (SCORE == 100)
{
System.out.print("\nYou Won! Would you like to play again: Y/N?");
if ((sc.nextLine().charAt(0) | 32) == 'y')
{
SCORE = 0;
System.out.print("\nResetting Game...");
} else {
break;
}
}
else
{
if (SCORE > 100)
{
int overshot = SCORE - 100;
SCORE = SCORE % 100;
System.out.print("\nYou Overshot By " + overshot + " Points. You now have " + SCORE + " points.");
} else {
System.out.print("\nYou currently have " + SCORE + " points you need " + (100 - SCORE) + " more.");
}
}
}
}
private static int ParseSentence(String input)
{
String[] split = input.split(" ");
for (Strng s : input)
SCORE += ParseWord(s);
}
private static int ParseWord(String word)
{
int value = 1;
for (int i = 0; i < word.length(); ++i)
{
int c = (int)word.charAt(i) | 32;
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
{
value *= 2;
} else {
value += 1;
}
}
return value;
}
}