对于一个类项目,我们必须用Java创建一个刽子手游戏(我们从面向对象编程开始,所以这让我们习惯了)并且我有类文件然后是主文件。
一切都运行得很好,但是我想在类文件中使用我的一个方法来告诉玩家他们是否已经猜到了一个特定的角色。
基本上,该方法使用for循环将猜测的字符添加到字符数组中,并且每次玩家猜测它都会检查该字符是否存在(如果是,它会突破循环)并且不是,并且索引值为0(这意味着它是不成文的,对吗?)它将写入猜测到该索引值的字符。
我认为在代码中只有自我解释的唯一另一件事是,如果玩家还没有做出任何猜测,它会使第一个值成为猜测,所以它在数组中有一些东西可以开始
任何帮助都将不胜感激,如果有人对如何改进我的代码或任何其他方面有任何意见,我也很高兴听到这一点。非常感谢。 :)
public void makeGuess(char c) {
boolean alreadyGuessed = false, anyMatches = false;
matches = 0;
guesses++;
if (guesses == 1) {
guessedChars[0] = c;
}
for (int i = 0; i < guessedChars.length; i++) { //it goes through it and will see that it was already guessed
if (guessedChars[i] == c) {
alreadyGuessed = true;
break;
}
else if (guessedChars[i] != c && guessedChars[i] == 0) {
guessedChars[i] = c;
}
}
if (alreadyGuessed == false) {
for (int i = 0; i < word.length; i++) {
if (word[i] == c) {
anyMatches = true;
matches++;
disguisedWord[i] = c;
}
}
}
if (anyMatches == true) {
System.out.println("You guessed correctly!");
System.out.println("There were " + matches + " matches.");
}
else if (alreadyGuessed == true) {
System.out.println("You already guessed this letter, derp.");
}
else {
System.out.println("Sorry, that character is not in the word to be guessed.");
wrongGuesses++;
}
// for (int i = 0; i < guessedChars.length; i++) {
// System.out.print(guessedChars[i] + " ");
// }
}
主要方法:
import java.util.Scanner;
class HangmanDemo {
public static void main(String[] args) {
//Object initialization
Scanner keyboard = new Scanner(System.in);
Hangman word = new Hangman("jordan");
//Variable declaration
char letterGuess;
int limit;
//Interact with user
System.out.print("What would you like the limit of guesses to be: ");
limit = keyboard.nextInt();
//BEGIN ZE GAME
while (word.isFound() == false && word.getWrongGuessCount() <= limit) {
System.out.println();
System.out.print("Letter guess: ");
letterGuess = keyboard.next().charAt(0);
word.makeGuess(letterGuess);
System.out.println(word.getDisguisedWord());
}
if (word.getGuessCount() == limit) {
System.out.println("\nSorry, too many guesses.");
}
else {
System.out.println("\nCongratulations! You succesfully solved the word!");
}
}
}
答案 0 :(得分:2)
所以,看看这个:
你第一次调用这个方法时,hasGuessed和anyMatches都会保持错误......这显然不是很好。
第二:OOP不是程序性的P.更具体地说:一种方法不应该像你一样做很多事情。如果计划大于10行,方法应该有很多解释。这是如此充满语言结构,你无法快速完成它。拆分代码...减少局部变量,使用更多方法。
希望有所帮助。
答案 1 :(得分:0)
跟踪猜测的一种方法是使用布尔值或字符数组(对应于猜测的基数字母; a = 0,b = 1等)。
答案 2 :(得分:0)
我看到的主要问题在于你的循环逻辑。
这首次是真的,因为guessedChars [0]将等于添加的第一个条目,并且在检查是否猜到了一个字母之前添加了第一个条目。
if (guessedChars[i] == c) {
alreadyGuessed = true;
break;
}
另外,您没有告诉我们如何定义guessedChars []。根据你如何做到这一点你可能会遇到整个事情的问题,因为循环是从guessedChars.length驱动的,并假设未分配的值是0.我注意到的最重要的事情是你没有破坏确定这封信还没有被猜到。您至少需要这样做,否则guessedChars [i]之后的所有其他元素也将设置为该猜测的字母。我建议也许使用不同类型的循环。
bool searchingForLetter = true;
do
{
//.... Your Logic
//.... searchingForLetter = false when you have either found the letter
//.... or placed the letter in the array
//.... or reached the end of the array
} while(searchingForLetter)
答案 3 :(得分:0)
一种可能的解决方案是使用char
的整数值,因为每个字母都用数字表示。对于ANSI标准,有用的是知道,'A'的公共字母从数字65开始,对于'Z'从90开始。从97到122你会找到小写字母。
你需要一个25的布尔数组,每个值代表一个字母。以下是一些演示功能的代码:
boolean[] guessedChars = new boolean[25];
char[] test = "HELLO".toCharArray();
for (char element : test) {
System.out.println(element);
System.out.println((int) element);
if (guessedChars[element - 65] == false) {
guessedChars[element - 65] = true;
} else {
System.out.println("You already guessed this letter, derp.");
}
}
'Hello'是示例字符串,要在数组中获得正确的位置,您必须从元素整数值中减去66。值为65的“A”将存储在guessedChars [0]中。对于刽子手游戏来说,很容易为小写字母进行扩展,因为在检查之前,您可以使用toUpperCase()
- 方法将字符串更改为大写。