#java #loops #arraylist
#java #циклы #arraylist
Вопрос:
У меня есть программа, которая запрашивает у пользователя его имя и т.д. Затем он спрашивает, сколько раз вы хотите, чтобы числа повторялись (поэтому моя программа генерирует 3 случайных числа от 7 до 13, и если в сумме получается 31, они являются победителями), и моя проблема в том, что я хочу, чтобы учитывалось только последнее напечатанное число, если игрок выигрывает или проигрывает, тоя думаю, другие цифры просто для показа или дразнить. проблема в том, что независимо от того, выигрывает игрок или проигрывает, оператор losing всегда выводится. Ниже приведен весь мой код.
import java.util.InputMismatchException;
import java.util.Scanner;
import java.io.IOException;
import java.util.Random;
public class StringVariables {
public static void main(String[] args) throws NumberFormatException,
IOException {
// user inputs their name in this section
Scanner user_input = new Scanner(System.in);
//enter their first name
String first_name;
System.out.print("Enter Your First Name: ");
while
(!user_input.hasNext("[A-Za-z] ")) {
System.out.println("Please only enter alphabet characters. Try again.");
user_input.next();
}
first_name = user_input.next();
//enter their last name
String last_name;
System.out.print("Enter Your Last Name: ");
while
(!user_input.hasNext("[A-Za-z] ")) {
System.out.println("Please only enter alphabet characters. Try again.");
user_input.next();
}
last_name = user_input.next();
//full name printed together
String full_name;
full_name = first_name " " last_name;
System.out.println(full_name " Is Now Playing");
// this is the shuffle portion as well as something to see if a number
int numShuffles = -1;
while (numShuffles < 0) {
System.out.println("How many times do you want the numbers shuffled? ");
try {
numShuffles = user_input.nextInt();
} catch (InputMismatchException inputException) {
System.out.print("Please enter a valid number. n");
//this is the buffer that resets if the user types a letter instead of a number, or any other character
user_input.next();
}
}
// here is going to be the loop for shuffles
// we are now going to generate their random number and add a delay
// after completing their name fields
delay(3000);
System.out
.println(" You will be given " numShuffles " hand(s) of 3 random numbers between 7-13" );
delay(2000);
System.out
.println(" Then, the computer will add the random numbers and if it is equal to 31, you win!");
/*
* end of explanation of the game, next i will create a new screen with
* the user's name and numbers
*/
delay(4000);
// printing 25 blank lines
for (int i = 0; i < 25; i )
System.out.println(" ");
System.out.println("User playing: " full_name);
System.out.println("Number of times shuffled: " numShuffles);
System.out.println("Your lucky numbers are...");
// random number generator
Random random = new Random();
while (true) {
// the shuffle loop
Arraylist numberStore = new Arraylist();
boolean isWinner = false;
for (int i = 0; i < numShuffles; i ) {
int num1 = 7 random.nextInt(7);
int num2 = 7 random.nextInt(7);
int num3 = 7 random.nextInt(7);
System.out.println(num1 " " num2 " " num3 " = " (num1 num2 num3));
numberStore.add(num1 num2 num3);
int lastNumber = (numberStore.size() - 1);
if (lastNumber == 31) {
isWinner = true;
System.out.println("Congratulations !! You are the Lucky Winner !!!!");
break;
//if you loose every shuffle
}
}
if (!isWinner) {
System.out.println("Better Luck Next Time");
}
// play again prompt
System.out
.println(" Do you want to play again? (If you do enter y or yes) n To exit press any other key ");
String input = user_input.next();
if (!"y".equalsIgnoreCase(input) amp;amp; !"yes".equalsIgnoreCase(input)) {
break;
}
}
// if pressed y or yes the program will run again with the same number of shuffles entered from before
user_input.close();
}
// delay field
public static void delay(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException exp) {
// delay field
}
}
}
Комментарии:
1. Um?
int lastNumber = (numberStore.size() - 1);
2. Прежде всего, это ArrayList, а не Arraylist … Я думаю, опечатка…
Ответ №1:
int lastNumber = (numberStore.size() - 1);
if (lastNumber == 31) {
вы, вероятно, хотите что-то вроде
int lastNumber = numberStore.get(numberStore.size() - 1);
if (lastNumber == 31) {
чтобы убедиться, что это ошибка, попробуйте изменить эту строку на
int lastNumber = num1 num2 num3;
Редактировать на основе дальнейших сообщений:
Похоже, вы действительно хотите этого:
for (int i = 0; i < numShuffles; i ) {
int num1 = 7 random.nextInt(7);
int num2 = 7 random.nextInt(7);
int num3 = 7 random.nextInt(7);
System.out.println(num1 " " num2 " " num3 " = " (num1 num2 num3));
numberStore.add(num1 num2 num3);
int lastNumber = num1 num2 num3;
boolean lastShuffle = (i == (numShuffles - 1));
if (lastShuffle) {
if (lastNumber == 31) {
System.out.println("Congratulations !! You are the Lucky Winner !!!!");
} else {
System.out.println("Better Luck Next Time");
}
}
}
// play again prompt
System.out
.println(" Do you want to play again? (If you do enter y or yes) n To exit press any other key ");
String input = user_input.next();
if (!"y".equalsIgnoreCase(input) amp;amp; !"yes".equalsIgnoreCase(input)) {
break;
}
Просто общее предложение: избегайте использования break, если это возможно, это затрудняет отслеживание потока управления и не является хорошей практикой программирования.
Комментарии:
1. да, но мне нужны только последние 3 числа для подсчета, а не если одно из них в цикле выполняется. распечатаны только последние 3 числа
2. Добавьте это: if (lastNumber == 31 amp;amp; i==(numShuffles=1))
3. он по-прежнему выводит строку проигравшего, даже если последние 3 числа равны 31. я полностью в тупике по этому поводу
4. вы пробовали использовать int lastNumber = num1 num2 num3; и if (lastNumber == 31 amp;amp; i==(numShuffles-1)) ? (обратите внимание, что в комментарии выше есть опечатка)
5. это работает… у меня есть еще одна вещь, которую я должен спросить у вас. можно ли сделать так, чтобы он не выводил код проигравшего в каждом цикле чисел?
Ответ №2:
Здесь нужно сделать несколько замечаний. Во-первых, ваш код довольно запутанный и его трудно читать. Это полезно, когда вы просите о помощи (и вообще в любом случае) для правильного отступа вашего кода. Это хорошая практика, и если вы используете другие языки, такие как Python, это может вам очень помочь. Кроме того, зачем проверять!isWinner? Полностью удалите переменную isWinner и просто проверьте число, равное 31, а затем создайте оператор else для оператора losing. Вот так:
if (lastNumber == 31) {
System.out.println("Congratulations !! You are the Lucky Winner !!!!");
break;
//if you loose every shuffle
}
else {
System.out.println("Better Luck Next Time");
}
Кроме того, выполните несколько шагов, чтобы найти ошибку. Распечатайте каждое число по мере его получения и используйте
int lastNumber = num1 num2 num3;
вместо
int lastNumber = (numberStore.size() - 1);
Также для всех, кто это компилирует, это ArrayList, а не Arraylist … просто небольшая ошибка.
Комментарии:
1. проблема с этим заключается в том, что после каждой строки из 3 распечатанных чисел она сообщает мне, проигравший он или нет, и если он победитель, он полностью останавливает цикл, введенный пользователем. я помню, что был на этом этапе раньше, но я не могу понять, как просто заставить последнее число считаться победителем или проигравшим
2. Позвольте мне посмотреть, смогу ли я получить то, что вы просите здесь (я нахожу вашу формулировку немного неясной). Вы хотите, чтобы только последнее из 3 добавляемых чисел учитывалось при выигрыше / проигрыше?
3. да. извините, я знаю, что мою формулировку трудно понять. только последние 3 числа цикла должны учитываться при выигрыше или проигрыше. остальные просто «для показухи», как если бы вы сделали только 4 перетасовки, вы бы выиграли, чтобы представить это в более выгодном свете.
4. вы знаете, как это сделать? @brld
5. Хорошо, по какой-то причине он не компилируется для меня в моей IDE, поэтому я попытаюсь отладить это с вами. Сначала выполните цикл, который генерирует числа, до тех пор, пока он не станет меньше 3, а не количество перетасовок. А также переместите следующий код, который устанавливает сумму и проверяет, выиграли ли вы, за пределы цикла. Это только для отладки. Дайте мне знать ваши результаты.
Ответ №3:
Извините, возможно, мне придется сказать, что ваши коды немного запутаны. небольшая фабрика с решением, которое вы запрашиваете, надеюсь, это может вам немного помочь
public static void main(String[] args) throws NumberFormatException,
IOException {
Scanner user_input = new Scanner(System.in);
String full_name = registeGamePlayer(user_input);
int numShuffles = initGame(user_input);
showTheGameInfo(full_name, numShuffles);
runningGame(user_input, numShuffles);
user_input.close();
}
/**
* @param user_input
* @param numShuffles
*/
private static void runningGame(Scanner user_input, int numShuffles) {
// random number generator
Random random = new Random();
while (true) {
// the shuffle loop
boolean isWinner = false;
for (int i = 0; i < numShuffles; i ) {
int num1 = 7 random.nextInt(7);
int num2 = 7 random.nextInt(7);
int num3 = 7 random.nextInt(7);
int amount = num1 num2 num3;
System.out.printf("%d %d %d = %d n", num1,num2,num3,amount);
if (amount == 31) {
isWinner = true;
System.out.println("Congratulations !! You are the Lucky Winner !!!!");
break;
// if you loose every shuffle
}
}
if (!isWinner) {
System.out.println("Better Luck Next Time");
}
// play again prompt
System.out.println(" Do you want to play again? (If you do enter y or yes) n To exit press any other key ");
String input = user_input.next();
if (!"y".equalsIgnoreCase(input) amp;amp; !"yes".equalsIgnoreCase(input)) {
break;
}
}
}
/**
* @param full_name
* @param numShuffles
*/
private static void showTheGameInfo(String full_name, int numShuffles) {
// printing 25 blank lines
for (int i = 0; i < 25; i )
System.out.println(" ");
System.out.println("User playing: " full_name);
System.out.println("Number of times shuffled: " numShuffles);
System.out.println("Your lucky numbers are...");
}
// delay field
public static void delay(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException exp) {
// delay field
}
}
private static String registeGamePlayer(Scanner user_input){
String first_name;
System.out.print("Enter Your First Name: ");
while (!user_input.hasNext("[A-Za-z] ")) {
System.out
.println("Please only enter alphabet characters. Try again.");
user_input.next();
}
first_name = user_input.next();
// enter their last name
String last_name;
System.out.print("Enter Your Last Name: ");
while (!user_input.hasNext("[A-Za-z] ")) {
System.out
.println("Please only enter alphabet characters. Try again.");
user_input.next();
}
last_name = user_input.next();
// full name printed together
String full_name;
full_name = first_name " " last_name;
System.out.println(full_name " Is Now Playing");
return full_name;
}
private static int initGame(Scanner user_input){
// this is the shuffle portion as well as something to see if a number
int numShuffles = -1;
while (numShuffles < 0) {
System.out.println("How many times do you want the numbers shuffled? ");
try {
numShuffles = user_input.nextInt();
} catch (InputMismatchException inputException) {
System.out.print("Please enter a valid number. n");
// this is the buffer that resets if the user types a letter
// instead of a number, or any other character
user_input.next();
}
}
// here is going to be the loop for shuffles
// we are now going to generate their random number and add a delay
// after completing their name fields
delay(3000);
System.out.println(" You will be given " numShuffles " hand(s) of 3 random numbers between 7-13");
delay(2000);
System.out.println(" Then, the computer will add the random numbers and if it is equal to 31, you win!");
/*
* end of explanation of the game, next i will create a new screen with
* the user's name and numbers
*/
delay(4000);
return numShuffles;
}
Комментарии:
1. я попытался вставить этот код в eclipse, но в итоге получил кучу ошибок, неправильно ли отформатировал код overflow или какая-то ошибка?
2. вам нужно импортировать необходимый класс: import java.io.IOException; import java.util. Исключение InputMismatchException; импортируйте java.util. Случайный; импортируйте java.util. Сканер; пожалуйста, создайте новый класс, а затем перенесите приведенные выше коды в свой класс с помощью импорта, который я только что прикрепил
3. проблема возникает, поскольку я хочу, чтобы только последние 3 числа считались либо победителем, либо проигравшим, если он является победителем до завершения цикла, созданного пользователем, и не выполнит полное количество карт, которые они хотели извлечь. я знаю, что это сложно. но только последнее число, которое печатается, должно учитываться как выигрыш или проигрыш. кстати, ваша кодировка выглядит красиво.
4. что вы имеете в виду, что последние 3 числа, не могли бы вы привести наглядный пример? Я сбиваю с толку
5. Я думаю, что я могу получить то, что вы хотите, если число numShuffles равно 1, последними тремя числами будут num1, num2 и num3 из цикла. если число numShuffles равно 2, последние три числа будут числом из второго цикла. это правильно?