【发布时间】:2013-12-06 00:47:02
【问题描述】:
程序编译并运行。问题是,在播放时,如果我输入了单词中的正确字母,它会发现它是正确的,但不会“承认”,可以这么说。它只是不断重复,除非你打错了字母,在这种情况下它可以正常工作并正确显示,以及计算剩余的猜测并在第 6 次猜测后结束,回到 main。除此之外,对于一个简单的初学者程序来说,它似乎运行良好。我不知道如何让它像它应该的那样工作并且已经花了几个小时试图弄清楚它。任何帮助或建议将不胜感激。
我尽可能少地投入了解决问题所需的内容,再次感谢您的帮助,并为篇幅所长感到抱歉。
主要
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;
public class Hangmangame
{
public static void main( String [] args)
{
Scanner keyBd = new Scanner( System.in );
char selection = ' ';
do{
System.out.printf("\nWelcome to Hangman!\n");
System.out.println("1. Play Game");
System.out.println("2. Rules");
System.out.println("3. Exit");
System.out.print ("Selection: ");
System.out.println();
selection = keyBd.next().charAt(0);
switch (selection)
{
case '1': Play(); break;//Play Game
case '2': Rules(); break;//go to rules
case '3': break;//exit program
default:
System.out.println("\nInvalid selection!");
System.out.println("Press any key+<Enter> to continue...\n");
keyBd.next();
}//end switch
}//end loop
while(selection != '3');
}//end main
public static void Play()
{
Letter guesses = new Letter();
Gallows printGallows = new Gallows();
Word WordtoGuess = new Word();
Hint YourHint = new Hint();
String[] Words = { "armor","dwarf","rogue","remix","shank","toxin","viper","wrath","wreck","zones"};
ArrayList<Hint> Hints = new ArrayList<>();
Hints.add(new Hint("often made out of metal"));
Hints.add(new Hint("a short mythological blacksmith"));
Hints.add(new Hint("a scoundrel or rascal"));
Hints.add(new Hint("edited or changed"));
Hints.add(new Hint("homemade sharpened object"));
Hints.add(new Hint("a poisonous substance"));
Hints.add(new Hint("poisonous reptile or vehicle"));
Hints.add(new Hint("retributary punishment"));
Hints.add(new Hint("scattered debris in an area"));
Hints.add(new Hint("pre-selected designated areas"));
Random rnum = new Random();
int n;
System.out.println("start game");
n = rnum.nextInt(10);
WordtoGuess.setIndex(n);
WordtoGuess.setWord(Words[n]);
String word = Words[n];
Hint hint = Hints.get(n);
System.out.println("You have 6 chances to guess the word, good luck!!");
System.out.println(" --\n |\n |\n |\n_____\n"); //gallows
do{
while( printGallows.hasGuesses() /*&& WordtoGuess.Win()*/) //if this block is commented out the program will continue to play until all 6 attempts are used, ending the game.
{ //if not commented out the program will always tell you that you have won without ever asking for input guesses.
System.out.println(hint);
printGallows.printGallows();
guesses.guessLetter();
if ( WordtoGuess.Contains( guesses.getLetter() ) || WordtoGuess.NotContain( guesses.getLetter() ) )
{
System.out.println( "That letter has already been guessed... Please try another." );
}
else
{
if (WordtoGuess.ContainsGuess( guesses.getLetter() ) )
{
WordtoGuess.CompareGuess( guesses.getLetter() , printGallows );
}
else
{
printGallows.setGuesses();
}
}
}
}
while(WordtoGuess.RefreshGame(printGallows));
}//end Play()
public static void Rules()
{
Scanner keyBd = new Scanner( System.in );
System.out.println("Hangman Rules");
System.out.println("Press any key+<Enter> to return to main menu");
keyBd.next();
}//end Rules()
}//end class hangman
单词
import java.util.ArrayList;
import java.util.Scanner;
public class Word
{
private String word;
private char[] gword = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' }; //meant to be temporary in place of being sent from Letter
private int index;
private ArrayList<String> Words = new ArrayList<String>();
private ArrayList<Character> goodGuess = new ArrayList<Character>();
private ArrayList<Character> badGuess = new ArrayList<Character>();
//constructor
public Word(String word)
{
this.word = word;
}
public Word()
{
String word;
}
//accesor methods
public String getWord()
{
return word;
}
//mutator methods
public void setWord(String word)
{
this.word = word;
}
public void setIndex(int index)
{
this.index = index;
}
public char[] setgword(char letter)
{
word = Words.get( index );
gword = new char[ word.length() ];
for( int i = 0; i < word.length(); i++)
{
gword[i] = '_';
}
return gword;
}
public char[] CompareGuess( char letter , Gallows printGallows )
{
boolean isSame = true;
for ( int i = 0; i < 5; i++ )
{
if ( gword[ i ] == '_' )
{
if ( word.charAt( i ) == letter )
{
gword[ i ] = letter;
}
}
}
return gword;
}
public boolean Win()
{
for(int i=0; i<5;i++)
{
if (gword[i] == '_')
{
return true;
}
}
return false;
}
public boolean ContainsGuess( char letter )
{
for ( int i = 0; i < word.length(); i++ )
{
if ( word.charAt( i ) == letter )
{
goodGuess.add( letter );
return true;
}
}
badGuess.add( letter );
return false;
}
public boolean Contains ( char letter )
{
for (int i = 0; i < goodGuess.size(); i++ )
{
if ( goodGuess.get( i ) == letter )
{
return true;
}
}
return false;
}
public boolean NotContain ( char letter )
{
for (int i = 0; i < badGuess.size(); i++ )
{
if ( badGuess.get( i ) == letter )
{
return true;
}
}
return false;
}
public boolean RefreshGame( Gallows printGallows )
{
if (!Win())
{
System.out.println("Good job you WIN!!!!");
}
else
{
printGallows.printGallows();
}
printGallows.printGallows();
goodGuess.clear();
badGuess.clear();
printGallows.setGuesses( 0 );
System.out.printf("Your word was %s\n ",word);
return false;
}
//other Methods
public String toString()
{
return String.format("your word is %s",word);
}//end toString()
}//end class Word
信
import java.util.Scanner;
public class Letter
{
private char letter;
Word gword = new Word();
//constructor
public Letter()
{
char letter;
}
//accesor methods
public char getLetter()
{
return letter;
}
//mutator methods
public char guessLetter()
{
Scanner input = new Scanner( System.in );
System.out.println( "\nGuess a letter: " );
String letters = input.nextLine();
this.letter = letters.charAt(0);
//gword.setgword(letter); doesnt work properly with sending the input to gword in word file
return letter;
}
//other Methods
public String toString()
{
return String.format("your letter is: %c",letter);
}//end toString()
}//end class Letter
绞刑架
public class Gallows
{
private int badGuess;
public Gallows()
{
int badGuess = 0;
}
public int setGuesses()
{
return badGuess++;
}
public int setGuesses( int badGuess)
{
this.badGuess = badGuess;
return badGuess;
}
public int getGuesses()
{
return badGuess;
}
public boolean hasGuesses()
{
if ( badGuess < 6 )
{
return true;
}
return false;
}
public void printGallows()
{
switch (badGuess)
{
case 1:
System.out.println(" --\n o |\n |\n |\n_____\n"); //head
System.out.println("You only have 5 chances left!");
break;
case 2:
System.out.println(" --\n o |\n/ |\n |\n_____\n"); //head + left arm
System.out.println("You only have 4 chances left!");
break;
case 3:
System.out.println(" --\n o |\n/| |\n |\n_____\n"); //head + left arm + body
System.out.println("You only have 3 chances left!");
break;
case 4:
System.out.println(" --\n o |\n/|\\|\n |\n_____\n"); //head + left arm + body + right arm
System.out.println("You only have 2 chances left!");
break;
case 5:
System.out.println(" --\n o |\n/|\\|\n/ |\n_____\n"); //head + left arm + body + right arm + left leg
System.out.println("You only have 1 chances left!");
break;
case 6:
System.out.println(" --\n o |\n/|\\|\n/ \\|\n_____\n"); //head + left arm + body + right arm + left leg + right leg
System.out.println("you lose! better luck next time!");
break;
}//end switch
}//end printGallows();
}//end class Gallows
【问题讨论】:
-
您究竟希望
setgword()做什么。该方法返回一个 char 数组。此外,您正在该方法中创建一个新的数组空数组。你到底想让那个方法做什么? -
我必须详细阅读您的代码,但请注意,当您按下一个字母时,您不会进入另一行,直到您按下回车键。您将继续阅读第一个字符,直到您有效地跳到下一行。我会使用 nextChar 方法,然后关闭 System.in 管道。
-
setgword() 应该来自用户键入要猜测的字母的 Letter 文件,但是当我使用它时,它会使 gword “null”并导致程序抛出 NullPointerException
-
我猜问题出在 Gallows 上,你能发一下吗?
-
绞刑架已添加,再次感谢大家抽出宝贵时间查看
标签: java