Редактировать: я пытался переписать это, чтобы максимально приблизить ваш исходный код к внесению изменений, которые я чувствую, где это необходимо.
Теперь, очевидно, у вашего учителя есть требования, и мы не можем идти против этого, но некоторые моменты, которые вы должны учитывать.
Мульти-разделение
В вашем примере вы разбили текст, чтобы получить количество слов. Тогда вместо зацикливания уже разбитого текста. Вы отправляете исходный ввод, а затем снова разделяете его. «Двойное» разбиение - вот почему вам нужны «три» метода. Если вы не делите двойное разделение, вы можете просто зациклить длину от одного разделения и просто использовать один метод ParseWord.
Значения удержания
В вашем примере вы забираете 100, если игрок промахнулся. Проблема с этим, скажем, в том, что человек получил оценку около 200. Затем он дважды зациклился бы, чтобы уменьшить значение, дважды передав «Сообщение о превышении». Однако, скажем, каким-то волшебным способом был получен счет в 100 000 000. Тогда, как вы можете видеть, мы вывели бы цикл 1 миллион раз, чтобы вычесть это значение, по существу создавая бесконечный, но вполне мог бы быть бесконечный цикл.
Чтобы решить эту проблему, мы просто делаем следующее.
Value = Value % 100.
Это даст нам остаток нашей Ценности от 0 до 99. Т.е. 167 будет равно 67 , а 12384 будет равно 84.
Использование строки (IndexOf)
Для этого требуется Символ , который вы указали, и цикл перебирает указанную вами строку. Худший случай - 12 петель. Есть также много других вещей, которые String и IndexOf делают, это дополнительная работа, и я рекомендую держаться подальше от этого, если можете.
Альтернативное решение, которое я сделал, это взять символ и использовать «| 32» на нем. Я не буду вдаваться в подробности того, как работают биты, но в основном эти символы представляют собой 8-битные значения, но мы используем только 7 битов в диапазоне от 32 до 127. Количество битов равно степени 2, поэтому 2 ^ 7 = 128 и 2 ^ 8 = 256. Когда мы выполняем «|» мы немного включаем, поэтому, если он уже включен, это не изменит значение.
Итак, в нашем примере, скажем, у нас есть значение 64.
Это бит 6 включен. Теперь мы хотим включить бит 5 «32», чтобы значение стало 96, но если у нас уже было значение 96, и мы включили бит 32, оно все равно будет 32.
Полный список символов ASCII ..
https://www.ascii -code.com /
Игровой цикл
В вашем примере вы создали "ДВУХ" игровых циклов, первый - когда вы начинаете, но как только вы переиграли свой счет, вы входите во второй цикл и забываете первый. Теперь проблема заключается в том, что ваш код «Ввод слов» и «Вы поняли» больше не используются. Таким образом, все, что кто-то увидит, - это строка для ввода текста без информации о том, что делать или что произошло, если они не промахнулись, тогда они получили сообщение об ошибке.
Чтобы исправить это, я создал один игровой цикл, который обрабатывает до тех пор, пока код не завершится через 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;
}
}