public class Hangman {
public static void ttt(String inputWord) { //setting up the game and declaring the secret word to be the input
int wordLength = inputWord.length(); //making new integer variable for length of word
String blanks = ""; //creating blanks string
for(int i = 0; i < wordLength; i++) { //making one blank for every letter of the word
blanks = blanks.concat("_ ");
}
System.out.println(blanks); //initially just to show user how many blanks/letters there are to guess
int points = 0; //setting up points int, one is awarded for each correct letter
int counter = 0; //setting up counter int, used to keep track of lives, reference lines 58+
ArrayList<String> usedChars = new ArrayList<String>(); //creating new array to store used letters
ArrayList<String> allChars = new ArrayList<String>(); //creating new array to store all letters
for(int i = 0; i < wordLength; i++) { //filling allChars with all the letters
allChars.add(inputWord.substring(i, i + 1));
}
while(points < wordLength) { //the entire game is run off of the points system, user needs as many points as number of letters to exit the while loop
Scanner reader = new Scanner(System.in); //making scanner thing
System.out.println("Guess: "); //asking user to guess a letter
String guess = reader.nextLine(); //string guess is set to the input
int checker = 0; //setting up checker int, used to check for duplicate answers
for(int k = 0; k < usedChars.size(); k++) { //for loop iterates through every item in usedChars and checks them against the user guess
if(!usedChars.get(k).equals(guess)) { //if the guess is different from that used letter
checker = checker + 1; //add one to the checker
}
else {} //or else nothing happens, this probably isn't necessary
}
if(checker == usedChars.size()) { //if statement protects the for loop inside, only runs if the checker got a point for every used letter (proving the guess was unique)
for(int i = 0; i < wordLength; i++) { //for loop iterates through every letter of the secret word, checking each against the guess
if(guess.equals(inputWord.substring(i, i + 1))) {
points = points + 1; //one point is added for every matching letter, refer back to line 20
System.out.println("Correct!"); //prints correct for every matching letter
}
else {} //again this probably isn't necessary
}
usedChars.add(guess); //after the guess is checked against the secret word, the guess is added to the used letters array
ArrayList<String> tempList = new ArrayList<String>(); //a temporary list is created to store the letters that haven't yet been guessed
for(int i = 0; i < allChars.size(); i++) { //for loop iterates through every string in the all letters array
for(int k = 0; k < usedChars.size(); k++) { //nested for loop iterates through every string in the used letters array
if(!allChars.get(i).equals(usedChars.get(k))) { //every string in allChars is checked against every string in usedChars
tempList.add(allChars.get(i)); //the temporary list is filled with the letters in allChars that were not found in usedChars
}
}
}
String inputWord2 = inputWord; //inputWord is duplicated, the copy will be manipulated but the original is still used in the above code
for(int i = 0; i < tempList.size(); i++) { //for loop iterates through every string in tempList (the list with the letters the user hasn't guessed yet)
inputWord2 = inputWord2.replace(tempList.get(i), "_"); //the full word has every letter it shares with tempList replaced with _ for the user to guess
}
System.out.println(inputWord2); //the word censored for any letters not guessed yet is printed
System.out.println("Used letters: " + usedChars); //the user is reminded which letters have already been used
}
else {
System.out.print("Sorry, that letter has already been used\n"); //if the checker didn't end up being equal to the number of items in usedChars then the guess was a repeat (found in usedChars)
}
counter = counter + 1; //tracking lives by adding one to counter after each guess
if(counter == 5) { //when the counter reaches x tries, user runs out of lives
points = wordLength; //this forcibly exits the while loop by satisfying the condition of points being equal to the number of letters
}
}
System.out.println("The word was " + inputWord); //prints the secret word
System.out.println("Game over"); //prints game over
}
public static void main(String[] args) {
ttt("barbarian");
}
}
Run Code Online (Sandbox Code Playgroud)
我知道通过人们的代码需要付出很多努力,尤其是我的代码因为它太长而且非常业余,所以我尽我所能来评论我的所有代码以试图解释我在想什么.刽子手游戏非常精致,我只是想让它打印空白,但填写了猜测的字母.
例如,秘密词是java
我猜j
输出:j___
我的代码实际上已经达到了这一点,但是对于更多的猜测,输出只是:______
我的问题基本上是,如何在第一次更换循环后实际继续工作?
再次,我要感谢大家提前回答,明天早上我再读一遍.
你的构建方式是错误的tempList。
在第二个 for 循环中,对于每个使用的字符,它将添加allChars与tempList该特定使用的字符不匹配的所有字符。除了在循环的下一次迭代中添加重复项的效果之外,这还可能添加 中已有的字符usedChars。
改变
ArrayList<String> tempList = new ArrayList<String>();
for(int i = 0; i < allChars.size(); i++) {
for(int k = 0; k < usedChars.size(); k++) {
if(!allChars.get(i).equals(usedChars.get(k))) {
tempList.add(allChars.get(i));
}
}
}
Run Code Online (Sandbox Code Playgroud)
到
ArrayList<String> tempList = new ArrayList<String>();
for(int i = 0; i < allChars.size(); i++) {
if (!usedChars.contains(allChars.get(i))) {
tempList.add(allChars.get(i));
}
}
Run Code Online (Sandbox Code Playgroud)