Really struggling to find the answer to this.
I'm creating a game where it asks how many players there are and the max number of players the user can enter is 3 (either 1, 2 or 3). Is this creating a for loop or can I just enter a parameter in the scanner function?
Code below:
System.out.println(" How many players are there? ");
int numberOfPlayers = scan.nextInt();
Player[] players = new Player[numberOfPlayers]; //this is where the players scores are stored
int currentPlayer = 0; //because arrays start at 0: +1 is added
for (int i = 0; i < numberOfPlayers; i++) {
System.out.println("What is player " + (i + 1) + " called?");
String playerName = scan.next();
players[i] = new Player(playerName);
You can use Scanner's nextLine() which reads the newline instead of next() as shown below:
System.out.println(" How many players are there? ");
int numberOfPlayers = Integer.parseInt(scan.nextLine());
Player[] players = new Player[numberOfPlayers];
for (int i = 0; i < numberOfPlayers; i++) {
System.out.println("What is player " + (i + 1) + " called?");
String playerName = scan.nextLine();
players[i] = new Player(playerName);
}
I suggest to use Integer.parseInt(scan.nextLine()) with a loop for example :
int numberOfPlayers = 0;
boolean correct = false;
do {
try {
System.out.println(" How many players are there? ");
numberOfPlayers = Integer.parseInt(scan.nextLine());
if (numberOfPlayers >= 1 && numberOfPlayers <= 3) {
correct = true;
}
} catch (NumberFormatException e) {
}
} while (!correct);
So if the user enter incorrect number or a number > 3 or < 1 it will ask the user to enter the number again until the the user enter the correct number 1,2,3
My code does not show the number of wins, losses and numberOfGames I had played.
I've been trying to fix it for the last month and I'm going nowhere!
import java.util.Random;
import java.util.Scanner;
public class HangmanP2 {
public static void main(String[] args) {
Scanner Input = new Scanner(System.in);
String first, reverse = "";
String second, reverse2 = "";
Scanner in = new Scanner(System.in);
System.out.println("Welcome to Hangman!");
System.out.println("Enter your first name.");
first = in.nextLine();
System.out.println("Enter your last name to play.");
second = in.nextLine();
int length = first.length();
int length2 = second.length();
for ( int i = length - 1 ; i >= 0 ; i-- )
reverse = reverse + first.charAt(i);
reverse = reverse.substring(0,1).toUpperCase() + reverse.substring(1).toLowerCase();
for ( int i = length2 - 1 ; i >= 0 ; i-- )
reverse2 = reverse2 + second.charAt(i);
reverse2 = reverse2.substring(0,1).toUpperCase() + reverse2.substring(1).toLowerCase();
System.out.println("Your name entered in reverse is: "+reverse+" "+reverse2);
startGame(reverse,reverse2);
}
public static void startGame(String reverse,String reverse2){
Random rnd = new Random ();
Scanner user = new Scanner (System.in);
String guess = "";
String message = "";
int count = 1;
boolean quit = false;
String fullWord = "";
int wins=0;
int loss=0;
int numberOfGames=0;
int guessC = 5;
String usedLetters ="";
String remainingLetters ="";
String letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int hinter = 0;
int z = rnd.nextInt(10);
int k = rnd.nextInt(2);
String words[][] = {{"earth","stars","light",
"world","about","again",
"stars","light","music",
"happy","water","amber",
"apple","piano","green",
"mouth","suger","stone",
"japan","china","after","lemon",
"grand",
"lives","twice","print"},{"smile",
"puppy","latin","vegan","phone","april",
"south","house","hangs","woman",
"power","today","india","night","candy",
"forum","birth","other","chris","irish",
"paste","queen","grace","crazy","plant",
"knife","spike","darth","vader","eagle",
"egypt","range","fists","fight","glory",
"March","smart","magic","codes","rolls",
"match","honor","glass","board","teams",
"bully","zebra","under","mango","brain",
"dirty","eight","zeros","train","cycle",
"break","necks","terms","slide","large"},{"stake","guess","wrong","anime","stick","outer","input"},{ "thing","write","white","black"}};
//Prints info of the game and topic that as been selected
System.out.println("Welcome to Hangman"+" "+reverse+" "+reverse2);
//This prints the '-' and spaces for the first run of the game only
for(int index = 0; index < words[z][k].length();index++)
{
Character variableInt = words[z][k].charAt(index);
if(variableInt != ' ')
{
message += "-";
}
else
{
message += " ";
}
}
//Nothing will change, this prints information to the user about his current status in-game.
System.out.println("Secret word: \t\t" + message);
System.out.println("Letters Remaining: " + letters);
System.out.println("Letters Used: ");
System.out.println("Guesses Remaining: " + guessC);
//The loop that will continuously run the game, until the user fails or does not want to play again.
do{
//The following variable's make sure there is not stacking from previous data when the loop runs again.
remainingLetters = "";
count = 0;
//Ask the user for a letter to guess
System.out.println("\nEnter a letter to guess the word): ");
guess = user.nextLine();
//The following for-loop converts ASCII table [A-Z] to actually characters and if the player used a letter it will not show up or add to the string each run of the do-loop.
for(int x = 65; x < 91;x++){
Character current = new Character ((char)x);
String current2 = current.toString();
if(!usedLetters.contains(current2)){
remainingLetters += current;
}
}
//Converts the user's first character to a string which is converted into another character and again converted into a String (Seem's useless) but i used it this way cause i was getting an error.
Character convert = new Character (guess.charAt(0));
Character conv = new Character (convert);
String converted = convert.toString();
//The letters the player uses will be added to a string, if it has not already been added and only if it is a letter.
if(!usedLetters.contains(converted) && conv.isLetter(convert)){
usedLetters+=guess.charAt(0);
}
//Inside this for-loop it turns our word into a String and the user's first character into a string.
for(int index = 0; index < words[z][k].length();index++){
//This is a helper
count++;
//Conversion of variables
Character current2 = new Character ( words[z][k].charAt(index));
String current = current2.toString();
Character current3 = new Character (guess.charAt(0));
String current4 = current3.toString();
String current5 = current4.toUpperCase();
String current6 = words[z][k].toUpperCase();
//If the players gets a letter correct, do the following.
if(current4.equalsIgnoreCase(current))
{
//Add's on to the previous string from where the player got it correct and change it to the correct letter instead of a '-'.
message = message.substring(0,index) + guess + message.substring(index + 1);
}
//If the player gets it wrong and the helper variable is equal to 1 (so that it does not follow the loop of the for-loop and it is not one of the special characters in the game('!' or '?').
if(!current6.contains(current5) && count == 1 && guess.charAt(0) != '?' && guess.charAt(0) != '!'){
guessC--;
}
}
//Prints information to the user of their current topic
//The secret word the player has to guess
System.out.println("Secret word: \t\t" + message.toUpperCase());
//The letters in the alphabet that have not been used yet
System.out.print("\nLetters remaining: ");
System.out.print(remainingLetters.toUpperCase() + "\n\n");
//This will print a message to the user, telling them information on using a hint or the hint itself.
//Letters the user has used since the game session has been running
System.out.print("\nLetters Used: ");
System.out.print(usedLetters.toUpperCase() + "\n");
//The amount of guesses the player has left
System.out.println("\nGuesses Remaining: " +guessC );
//If the player enters a '?' it will do the following.
if(guess.charAt(0) == '?'){
if(hinter <2){
//Displays what is in the array and information about the delay, while losing guesses.
hinter++;
System.out.print("\nHint will appear after next guess! \n");
guessC -=2;
}
}
//If the user guesses the word correct
if(message.equalsIgnoreCase(words[z][k])){
System.out.println("YOU ARE CORRECT! " + words[z][k] + " is correct!");
wins++;
quit = true;
}
//If the user ask to guess the entire word it is stored in a separate variable and make quit equal to true.
if(guess.charAt(0) == '!')
{
System.out.print("\nEnter the secret word: ");
fullWord = user.nextLine();
//if the user guesses the word correct then it will tell the user they are correct and make quit equal to true.
if(fullWord.equalsIgnoreCase(words[z][k])){
System.out.println("YOU ARE CORRECT! " + words[z][k] + " is correct!");
wins++;
quit = true;
}
//If the user does not get it right it will tell the user they are wrong and make quit equal to true.
else{
System.out.println("YOU ARE INCORRECT! the word is: " + words[z][k] + " ");
loss++;
quit = true;
}
}
//If the guesses counter equal 0 then it will tell them that they have lost and make quit equal to true.
if(guessC == 0){
System.out.println("GAME OVER! The secret word was [ " + words[z][k] + " ]!");
loss++;
quit = true;
}
//This is what happens when quit eventually becomes true, the user is asked if they would like to play again.
if(quit == true){
System.out.println("\nWould you like to play again (Y or quit)? ");
System.out.println("\nOr type [stats] to check your work");
guess = user.nextLine();
//If they do want to play again, they will need to enter Y and if they do it will give them another word to guess and resets there information so that there will be no overlap.
if(guess.equalsIgnoreCase("Y")){
quit = false;
z = rnd.nextInt(10);
k = rnd.nextInt(2);
guess = " ";
guessC = 6;
message = "";
usedLetters = "";
hinter = 0;
for(int index = 0; index < words[z][k].length();index++)
{
Character variableInt = words[z][k].charAt(index);
if(variableInt != ' ')
{
message += "-";
}
else
{
message += " ";
}
}
System.out.println("Secret word: \t\t" + message);
System.out.println("Letters Remaining: " + letters);
System.out.println("Letters Used: ");
System.out.println("Guesses Remaining: " + guessC);
}
if(guess.equals("stats")){
printGameStats(wins,loss,numberOfGames);
}
else{
//If the user enters 'N' then they will be told the following and the scanner will be closed.
System.out.println("THANK YOU FOR PLAYING HAVE A GOOD DAY!");
user.close();
}
}
//end of the while loop which will only stop if quit equals true.
}while(quit != true );
}
private static void printGameStats(int wins,int loss,int numberOfGames) {
// Line
System.out.print("+");
printDashes(37);
System.out.println("+");
// Print titles
System.out.printf("| %6s | %6s | %12s |\n",
"WINS", "LOSSES", "GAMES PLAYED");
// Line
System.out.print("|");
printDashes(10);
System.out.print("+");
printDashes(10);
System.out.print("+");
printDashes(10);
System.out.print("+");
printDashes(16);
System.out.print("+");
printDashes(18);
System.out.println("|");
// Print values
System.out.printf("| %6d | %6d | %12d |\n",
wins, loss, numberOfGames);
// Line
System.out.print("+");
printDashes(37);
System.out.println("+");
}
private static void printDashes(int numberOfDashes) {
for (int i = 0; i < numberOfDashes; i++) {
System.out.print("-");
}
}
}
This is simple Hangman game:
public static void main(String[] args) {
String[] words = {"writer", "that", "program"};
int wordNumber = (int) (Math.random() * words.length);
System.out.print("Enter a letter in word ");
for (int i = 0; i < words[wordNumber].length(); i++)
System.out.print('*');
System.out.print(" > ");
Scanner input = new Scanner(System.in);
char letter;
do {
letter = input.nextLine().charAt(0);
boolean asterisksInWord = false;
String[] discoveredElements = new String[words[wordNumber].length()];
int countOfTries = 0;
int arrayCount = 0;
int asteriskCount = 0;
System.out.print("Enter a letter in word ");
do {
asterisksInWord = false;
boolean contain;
if (asteriskCount != 1) {
asteriskCount = 0;
for (char item : words[wordNumber].toCharArray()) {
contain = Arrays.asList(discoveredElements).contains(String.valueOf(item));
if (contain) {
System.out.print(item);
} else if (item == letter) {
System.out.print(item);
discoveredElements[arrayCount] = String.valueOf(item);
arrayCount++;
} else {
System.out.print('*');
asterisksInWord = true;
asteriskCount++;
}
}
}
if (asterisksInWord) {
System.out.print(" > ");
letter = input.nextLine().charAt(0);
if (asteriskCount != 1)
System.out.print("Enter a letter in word ");
} else
System.out.println("The word is " + words[wordNumber] +
" You missed " + (countOfTries + 2 - words[wordNumber].length()) + " time(s)");
countOfTries++;
} while (asterisksInWord);
System.out.print("Do you want to guess another word? Enter y or n >");
} while (input.nextLine().charAt(0) == 'y');
}
The log of it's run is
Enter a letter in word **** > t
Enter a letter in word t**t > h
Enter a letter in word th*t > a
The word is that You missed 0 time(s)
Do you want to guess another word? Enter y or n >y
y
Enter a letter in word **** >
My question is why does it ignores first symbol 'y' when asking "Do you want to guess another word?".
I'tried to create some test programs with same do-while conditions but they don't ask for character 2 times like that program.
The program asks for your input two times, because you have programmed it like that. After printing - "Do you want to guess another word? Enter y or n >" - you do input.nextLine() inside the while condition as well as as the first statement after do , so it asks for input twice.
Maybe you can move the question Enter the letter in the word to the inner do loop instead of doing that in the if condition if (asterisksInWord) { .
Also, according to your current logic, it does not ignore your first symbol, that is the real one that decides whether to exit the loop or not, the next input is actually your first guess.
I have a small hang man type game in which the user guesses a letter and tries to determine one of the random words from a string array. The issue is that once the user wants to play again with a new random word, the old word still shows up along side with it ?
import java.util.Random;
import java.util.Scanner;
import java.lang.Character;
public class Game
{
public static void main(String[] args)
{
String[] words = {"Computer", "Software" , "Program" ,
"Algorithms", "Unix" , "Mathematics" ,
"Quick" , "Bubble" , "Graph" };
Random rnd = new Random();
Scanner sc = new Scanner(System.in);
int index;
String word = "",
invisibleWord = "",
newString = "",
guess,
status;
while(true)
{
index = rnd.nextInt(words.length);
word = words[index];
for(int i = 0; i < word.length(); ++i)
invisibleWord += "*";
while(true){
System.out.print("(Guess) Enter a letter in word "
+ invisibleWord + " > ");
guess = sc.nextLine();
for(int j = 0; j < word.length(); ++j)
if(guess.toUpperCase().equals(Character.toString(word.charAt(j)).toUpperCase())){
if(j == 0){
newString = invisibleWord.substring(0,j) + guess.toUpperCase() + invisibleWord.substring(j + 1);
invisibleWord = newString;
} else {
newString = invisibleWord.substring(0,j) + guess + invisibleWord.substring(j + 1);
invisibleWord = newString;
}
}
if(invisibleWord.contains("*")) continue;
else break;
}
System.out.println("The word is " + word);
System.out.print("Do you want to guess another word ? " +
"Enter y or n > ");
status = sc.nextLine();
if(status.toUpperCase().equals("Y")) continue;
else if(status.toUpperCase().equals("N")) break;
}
}
}
SAMPLE RUN:
(Guess) Enter a letter in word ****** > a
(Guess) Enter a letter in word ****** > e
(Guess) Enter a letter in word *****e > i
(Guess) Enter a letter in word *****e > o
(Guess) Enter a letter in word *****e > u
(Guess) Enter a letter in word *u***e > b
(Guess) Enter a letter in word Bubb*e > l
The word is Bubble
Do you want to guess another word ? Enter y or n > y
(Guess) Enter a letter in word Bubble******** >
The problem occurs in the last line, why is Bubble still showing up as a word when it is supposed to be reset to a new random word ?
your question itself answers it! you need to reset the variable. try following
if(status.toUpperCase().equals("Y"))
{
invisibleWord = "";
continue;
}
You are not resetting invisibleWord after each iteration.
while(true)
{
invisibleWord="";
index = rnd.nextInt(words.length);
word = words[index];
for(int i = 0; i < word.length(); ++i)
invisibleWord += "*";
while(true){
System.out.print("(Guess) Enter a letter in word "
+ invisibleWord + " > ");
guess = sc.nextLine();
for(int j = 0; j < word.length(); ++j)
if(guess.toUpperCase().equals(Character.toString(word.charAt(j)).toUpperCase())){
if(j == 0){
newString = invisibleWord.substring(0,j) + guess.toUpperCase() + invisibleWord.substring(j + 1);
invisibleWord = newString;
} else {
newString = invisibleWord.substring(0,j) + guess + invisibleWord.substring(j + 1);
invisibleWord = newString;
}
}
if(invisibleWord.contains("*")) continue;
else break;
}
System.out.println("The word is " + word);
System.out.print("Do you want to guess another word ? " +
"Enter y or n > ");
status = sc.nextLine();
if(status.toUpperCase().equals("Y")) continue;
else if(status.toUpperCase().equals("N")) break;
}
}
}
why do i keep getting an error on "int numLength = palNum1.length();?" im trying to finish this lab that im doing for my java class and im stuck on this part. any help would be appreciated.
import java.util.*;
public class Lab6
{
public static void main (String [] args)
{
String pal1, pal2="";
int palNum1, palNum2, choice;
Scanner in = new Scanner(System.in);
System.out.println("Word(w) or Number(n)?");
choice = in.nextLine().charAt(0);
if (choice == 'w') {
System.out.println("Enter a word: ");
pal1= in.nextLine();
int length = pal1.length();
for ( int i = length - 1 ; i >= 0 ; i-- )
pal2 = pal2 + pal1.charAt(i);
if (pal1.equals(pal2))
System.out.println("The word you entered is a palindrome.");
else
System.out.println("The word you entered is not a palindrome.");
}
else{
System.out.println("Enter a bunch of numbers: ");
palNum1 = in.nextInt();
int numLength = palNum1.length();
for ( int j = numLength - 1 ; j >= 0 ; j-- )
palNum2 = palNum2 + palNum1.charAt(j);
if (palNum1.equals(palNum2))
System.out.println("The numbers you entered is a palindrome.");
else
System.out.println("The numbers you entered is not a palindrome.");
}
}
}
As dasblink said, primitave types don't have methods.
Given what you're trying to do if they enter an integer, you should convert it to a String then basically repeat the code from the first part. Instead of:
System.out.println("Enter a bunch of numbers: ");
palNum1 = in.nextInt();
int numLength = palNum1.length();
for ( int j = numLength - 1 ; j >= 0 ; j-- )
palNum2 = palNum2 + palNum1.charAt(j);
Easy thing to do is convert the int they enter into a String, then repeat code from before:
System.out.println("Enter a bunch of numbers: ");
palNum1 = in.nextInt();
// Conver it to String to allow you to easily check if its a palindrome.
pal1 = Integer.parseInt(palNum1);
int numLength = pal1.length();
for ( int j = numLength - 1 ; j >= 0 ; j-- )
pal2 = pal2 + pal1.charAt(j);
palNum2 is never needed.
EDIT:
Sorry if I confused you, I meant that you read in the palindrome as an int(same as you originally did), but then you convert it to a String, then treat it as before.
complete code for the else:
else{
// If you are here, user is entering an int.
System.out.println("Enter a bunch of numbers: ");
palNum1 = in.nextInt();
pal1 = Integer.parseInt(palNum1);
int numLength = pal1.length();
for ( int j = numLength - 1 ; j >= 0 ; j-- )
pal2 = pal2 + pal1.charAt(j);
if (pa1.equals(pal2))
System.out.println("The numbers you entered is a palindrome.");
else
System.out.println("The numbers you entered is not a palindrome.");
}