gpt4 book ai didi

java - 我的 Hangman 代码不会立即记录错误的猜测,而是打印双下划线等等

转载 作者:搜寻专家 更新时间:2023-11-01 03:18:54 26 4
gpt4 key购买 nike

我在复制 Hangman 游戏时遇到三个主要问题:

“填写”部分随机打印两次,正确的猜测随机记录为错误
enter image description here

并且不正确的猜测并不总是被计算在内
enter image description here这是主类的代码:

    public class Main 
{

public static void main(String[] args)
{
Hangman manHang = new Hangman();
}

}

The Hangman class:

import java.util.Random;


public class Hangman
{
Random r;
GetData get;
String[] Bank = {"consider","minute","accord","evident","practice","intend","concern","commit","issue","approach","establish","utter","conduct","engage","obtain","scarce","policy","straight","stock","apparent","property","fancy","concept","court","appoint","ambiguous","arbitrary","alliteration","arrogant","benevolent","belligerent","boycott","cynical","connotation","cessation","contemporary","craving","grandiose","gratuitous","guile","harbinger","impetuous","incandescent","indigent","inexorable","injunction","insipid","insurgent","languish","magnate","abjure","abrogate","abstemious", "acumen", "antebellum","auspicious","belie","bellicose","bowdlerize","chicanery","chromosome","churlish","circumlocution","circumnavigate","deciduous","deleterious","diffident","enervate","enfranchise","epiphany","equinox","evanescent","expurgate","facetious", "fallacious"};
String word;//Stores the random word used
boolean finished = false;
int incGuessCount = 0;
boolean[] lettersFound;//Used to mark which letters have been found
String guessedLetter=" ";//Used to store guesses
boolean playerHasWon = false;

public Hangman()
{
r = new Random();
get = new GetData();
word=Bank[r.nextInt(Bank.length)]; //Selects a random word and assigns word the value
lettersFound = new boolean[word.length()]; //Creates a boolean array the length of the word
int incGuessCount = 0;

while(incGuessCount<5 && playerHasWon == false)
{
drawGallows(); //Show the Gallows depending on how many incorrect guesses there are
displayWord();
getGuess();
checkGuess();
//checkVictory();

}

if (incGuessCount>=5)
{
System.out.print('\u000C');//Clears the screen
fiveWrong();//Displays full Hangman
System.out.println("You have lost! The word was "+word);
}
}

public void getGuess()
{
System.out.println("\u000C");
System.out.println(" ");
System.out.println("What letter do you guess?");
System.out.println("You have "+(5-incGuessCount)+" guesses left.");
System.out.print("Enter guess:");
guessedLetter = get.aWord();//Uses scanners to take in the guesses
}


public boolean displayWord()
{
boolean goodGuess = false;//Assumes guess is bad automatically
char letter = guessedLetter.charAt(0);

for(int i = 0;i<word.length();i++)//Goes through all the letters to check guess's status
if (lettersFound[i]==true)//Checks if a letter was already revealed at that position
{
System.out.print(word.charAt(i)+" ");
}

else if (word.charAt(i)==letter)//Prints the correctly guessed letter at the position
{
System.out.print(word.charAt(i)+" ");
lettersFound[i] = true;
goodGuess = true;
}
else//Fills in non-applicable spaces with an underscore
System.out.print("_ ");


return goodGuess;
}

public void checkGuess()
{
if(!displayWord() && incGuessCount==5)
fiveWrong();
else if(!displayWord() && incGuessCount<5)
{
incGuessCount++;
drawGallows();
getGuess();
displayWord();
}

else
{
drawGallows();
getGuess();
displayWord();
}
}

public void defaultMan()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void oneWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void twoWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | / \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void threeWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | /| ");
System.out.println(" | / \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void fourWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | /|\\ ");
System.out.println(" | / \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void fiveWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | ( ) ");
System.out.println(" | /|\\ ");
System.out.println(" | / \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
System.out.println("You have lost! The word was "+word+".");
System.out.println("Rerun the program to try again.");
finished=true;
}

public void drawGallows()
{
if(incGuessCount==0)
{
defaultMan();
}

if(incGuessCount==1)
{
oneWrong();
}

if(incGuessCount==2)
{
twoWrong();
}

if(incGuessCount==3)
{
threeWrong();
}

if(incGuessCount==4)
{
fourWrong();
}

if(incGuessCount==5)
{
fiveWrong();

}

}
}

And the GetData class:

import java.util.Scanner;

public class GetData
{
private Scanner input;

public GetData()//Produces a scanner to take in input
{ input = new Scanner(System.in); }

public String aWord()//Gets the input as a guess/string
{ return input.next(); }

public int aNumber()//Gets the input as a number
{ return input.nextInt(); }

}

抱歉组织不力,我是编码新手。在多人的帮助下,我已经研究了我的代码数小时,但我们就是无法弄清楚我的逻辑在哪里失败了,而且显然至少在几个方面是这样。感谢任何帮助,即使它只是指出更多次要的逻辑缺陷或无用变量。谢谢。

更新:非常感谢那些做出贡献的人,这些答案帮助我修复了程序的所有错误。现在,我的获胜检测又遇到了一个问题。我创建了一个变量 gameOver,当用户超过他的错误猜测次数时它存储 true 并且我还让它在打印字母而不是下划线时递增。然后我创建了两个 if 语句:

if(corLetters == word.length())
gameOver = true;

if (incGuessCount<5 && gameOver)
{
System.out.println("\u000c");
System.out.println("Congratulations!");
System.out.println("You have won!");
System.out.println("Rerun the program to try again.");
}

但游戏并未记录获胜。再次感谢您的所有帮助,如果您有任何建议来修复或改进我的获胜检测,我们将不胜感激 :)

这是我在此线程中解决问题后的新 Hangman 类(class):

import java.util.Random;


public class Hangman
{
Random r;
GetData get;
String[] Bank = {"consider","minute","accord","evident","practice","intend","concern","commit","issue","approach","establish","utter","conduct","engage","obtain","scarce","policy","straight","stock","apparent","property","fancy","concept","court","appoint","ambiguous","arbitrary","alliteration","arrogant","benevolent","belligerent","boycott","cynical","connotation","cessation","contemporary","craving","grandiose","gratuitous","guile","harbinger","impetuous","incandescent","indigent","inexorable","injunction","insipid","insurgent","languish","magnate","abjure","abrogate","abstemious", "acumen", "antebellum","auspicious","belie","bellicose","bowdlerize","chicanery","chromosome","churlish","circumlocution","circumnavigate","deciduous","deleterious","diffident","enervate","enfranchise","epiphany","equinox","evanescent","expurgate","facetious", "fallacious"};
String word;//Stores the random word used
boolean finished = false;
int incGuessCount = 0;
int corLetters = 0;
boolean[] lettersFound;//Used to mark which letters have been found
String guessedLetter=" ";//Used to store guesses
boolean gameOver = false;


public Hangman()
{
r = new Random();
get = new GetData();
word=Bank[r.nextInt(Bank.length)]; //Selects a random word and assigns word the value
lettersFound = new boolean[word.length()]; //Creates a boolean array the length of the word


do
{
drawGallows(); //Show the Gallows depending on how many incorrect guesses there are
displayWord();
getGuess();
checkGuess();

}
while(incGuessCount<5 && gameOver == false);

if (incGuessCount>=5)
{

fiveWrong();//Displays full Hangman

}

if(corLetters == word.length())
gameOver = true;

if (incGuessCount<5 && gameOver)
{
System.out.println("\u000c");
System.out.println("Congratulations!");
System.out.println("You have won!");
System.out.println("Rerun the program to try again.");
}


}

public void getGuess()
{
System.out.println("\u000C");
System.out.println(" ");
System.out.println("What letter do you guess?");
System.out.println("You have "+(5-incGuessCount)+" guesses left.");
System.out.print("Enter guess:");
guessedLetter = get.aWord();//Uses scanners to take in the guesses
}


public boolean displayWord()
{
boolean goodGuess = false;//Assumes guess is bad automatically
char letter = guessedLetter.charAt(0);

for(int i = 0;i<word.length();i++)//Goes through all the letters to check guess's status
if (lettersFound[i]==true)//Checks if a letter was already revealed at that position
{
System.out.print(word.charAt(i)+" ");
corLetters++;
}

else if (word.charAt(i)==letter)//Prints the correctly guessed letter at the position
{
System.out.print(word.charAt(i)+" ");
lettersFound[i] = true;
goodGuess = true;
corLetters++;
}
else//Fills in non-applicable spaces with an underscore
System.out.print("_ ");


return goodGuess;
}

public void checkGuess() {
boolean disW = displayWord();

if (!disW && incGuessCount == 5)
fiveWrong();
else if (!disW && incGuessCount < 5) {
incGuessCount++;

}
}


public void defaultMan()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void oneWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void twoWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | / \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void threeWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | /| ");
System.out.println(" | / \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void fourWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | | ");
System.out.println(" | /|\\ ");
System.out.println(" | / \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
}

public void fiveWrong()
{
System.out.println('\u000C');
System.out.println(" ________");
System.out.println(" | | ");
System.out.println(" | ( ) ");
System.out.println(" | /|\\ ");
System.out.println(" | / \\ ");
System.out.println(" |_________ ");
System.out.println(" ");
System.out.println("You have lost! The word was "+word+".");
System.out.println("Rerun the program to try again.");
gameOver=true;
}

public void drawGallows()
{
if(incGuessCount==0)
{
defaultMan();
}

if(incGuessCount==1)
{
oneWrong();
}

if(incGuessCount==2)
{
twoWrong();
}

if(incGuessCount==3)
{
threeWrong();
}

if(incGuessCount==4)
{
fourWrong();
}

if(incGuessCount==5)
{
fiveWrong();

}

}
}

最佳答案

“填充”部分可以打印两次的原因是因为您正在使用来打印单词并确定字符是否正确。我的意思是当你在 checkGuess() 中有这个时:

if(!displayWord() && incGuessCount==5)
fiveWrong();
else if(!displayWord() && incGuessCount<5)

您正在 if 语句的决策部分调用 displayWord()(打印单词并在猜测正确时返回 true)。这会导致单词打印在您的 checkGuess() 方法中。这可以通过制作 checkWord() 来解决,例如:

public boolean checkWord()            
{
boolean goodGuess = false;//Assumes guess is bad automatically
char letter = guessedLetter.charAt(0);
for(int i = 0;i<word.length();i++){//Goes through all the letters to check guess's status
if (word.charAt(i)==letter)
{
lettersFound[i] = true;
goodGuess = true;
}
}

return goodGuess;
}

这将用于 if 语句的决策部分。

导致图表未及时更新的第二件事是您在 checkGuess() 中做的太多。 您要求他们提供新的猜测,而这实际上应该由主要的 while{}。编辑后的版本可能如下所示:

public void checkGuess()
{
if(!checkWord() && incGuessCount==5)
fiveWrong();
else if(!checkWord() && incGuessCount<5)
{
incGuessCount++;
}
}

此外,在您的构造函数中,您创建了另一个计数器,这使得循环在玩家失败后无法结束(因为在全局变量之前使用了同名的局部变量)请参见以下代码:

 r = new Random();
get = new GetData();
word=Bank[r.nextInt(Bank.length)];
lettersFound = new boolean[word.length()];
int incGuessCount = 0; // <<< This shouldn't be here

剩下的唯一事情就是进行获胜检测,我认为你已经准备好了!

编辑:

对于您的获胜检测,我喜欢您决定计算用户猜对的字符数的方式。唯一的问题是,在您的 displayWord() 中,每次打印单词时都会添加正确字母的数量,而不是仅在添加新的正确字符时添加。此更改将:

if (lettersFound[i]==true)//Checks if a letter was already revealed at that position
{
System.out.print(word.charAt(i)+" ");
corLetters++;
}
else if (word.charAt(i)==letter)//Prints the correctly guessed letter at the position
{
System.out.print(word.charAt(i)+" ");
lettersFound[i] = true;
goodGuess = true;
corLetters++;
}

进入这个:

if (lettersFound[i]==true)//Checks if a letter was already revealed at that position
{
System.out.print(word.charAt(i)+" ");
//Deleted line here
}
else if (word.charAt(i)==letter)//Prints the correctly guessed letter at the position
{
System.out.print(word.charAt(i)+" ");
lettersFound[i] = true;
goodGuess = true;
corLetters++;
}

另一个问题是您只检查游戏是否从用户赢主要do while。这可以通过将 if 语句移动到 checkGuess() 中来解决。如:

public void checkGuess() {
boolean disW = displayWord();

if (!disW && incGuessCount == 5)
fiveWrong();
else if (!disW && incGuessCount < 5) {
incGuessCount++;

}

if (corLetters == word.length()){
gameOver = true;
}
}

关于java - 我的 Hangman 代码不会立即记录错误的猜测,而是打印双下划线等等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37581445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com