2014-07-25 2 views
-1

Так что программа, которую я пытаюсь написать, - это что-то вроде этого. Противник выбирает номер случайным образом, где каждый номер соответствует человеку. то пользователь делает то же самое. то выход должен показать, что пользователь выбирает, какой противник выбрал и кто выиграл этот матч. его похожий на камень, ножницы для бумаги, но с добавлением еще нескольких вещей. я также должен показать количество раундов и сколько раз выиграл пользователь. Но моя проблема в этом. Независимо от того, что мой вклад, он продолжает говорить, что я сделал недействительный выбор и выбрать его снова. Это то, что у меня есть.Повторяя независимо от того, как я ввожу

public static void main(String[] args) { 
    int game=0; 
    int won = 0; 
    int opponent; 
    Random rand = new Random(); 
    System.out.println("Welcome to the game. Here are the rules:");   
    Scanner in = new Scanner(System.in); 
    rules(); 
    choices(); 
    int choice = selected(in); 
    while (choice !=0) { 
     rules(); 
     choices(); 
     choice = selected(in); 
     opponent = opp(); 
     result(choice, opponent, in); 
     game+=1; 
    } 
    System.out.println("You played " +game+" games."); 
    System.out.println("Quitting"); 
} 
public static void rules(){ 
    System.out.println("\nFlurg beats Stuga and Kvartal"); 
    System.out.println("Stuga beats Kvartal"); 
    System.out.println("Kvartal beats Lerberg"); 
    System.out.println("Lerberg beats Flurg and Stuga"); 
    System.out.println("The computer wins in the event of a tie."); 
    System.out.println(); 
} 
public static int opp(){ 
    Random rand = new Random(); 
    int opponent = rand.nextInt(4)+1; 
    return opponent; 
} 

public static void choices(){ 
    System.out.println("Please select your choice:"); 
    System.out.println("'1' for Flurg "); 
    System.out.println("'2' for Stuga "); 
    System.out.println("'3' for Kvartal "); 
    System.out.println("'4' for Lerberg "); 
    System.out.println("'0' to Quit "); 
    System.out.print("Selection: "); 
} 

public static int selected(Scanner in){ 
    int choice = in.nextInt(); 
    while (choice != 1 && choice != 2 && 
      choice != 3 && choice != 4 && 
      choice != 0) { 
     System.out.println("Invalid choice"); 
    choices(); 
    choice = in.nextInt(); 
} 
    return choice; 
} 

public static int result(int choice, int opponent, Scanner in) { 
    int won=0; 
    System.out.print("You picked:" +choice+". Opponent picked:" +opponent+"."); 
    if(choice == 1 && (opponent == 2) || (opponent == 3)){ 
     System.out.println("You won!"); 
     won+=1; 
    } 
    else if(choice == 2 && opponent == 3){ 
     System.out.println("You won!"); 
     won+=1; 
    } 
    else if(choice == 3 && opponent == 4){ 
     System.out.println("You won!"); 
     won=+1; 
    } 
    else if(choice == 4 && (opponent == 1 || opponent == 2)){ 
     System.out.println("You won!"); 
     won+=1; 
    } 
    else { 
     System.out.println("You lost!"); 
    }   
    return won; 
} 

}    

EDIT Так я установил именно то, что мне сказали о !=1 части. но он снова зацикливается. по какой-то причине, он не хочет, чтобы запустить result()

EDIT # 2 Основное также было зафиксировано с подобной проблемой.

Я добавил несколько строк, основываясь на том, что мне сказали EDIT #.

+1

Вы читаете 'choice' как int, а не char. '1! = '1'', вам нужно удалить одинарные кавычки из своих номеров в этом выражении while. – sgbj

ответ

0

Вы сравниваете найденные значения с символами.

int choice = in.nextInt(); 
while (choice != '1' //... 

Однако это сравнение введенного числового значения в ASCII-код символа, который является 49 для символа '1'. Поэтому ваш цикл будет продолжаться до тех пор, пока вы не введете одно из чисел 48 ('0') в 52 ('4').

Вы должны сравнить с числами вместо:

while (choice != 1 && choice != 2 && choice != 3 && choice != 4 && choice != 0) { 
    System.out.println("Invalid choice"); 
} 

То же самое относится и к

while (choice !='0') { 
    rules(); 
    choices(); 
    selected(in); 
    opp(); 
    result(choice, opponent, in); 
} 

в методе main - изменить это

while (choice != 0) { // change this to 0 instead of '0' 
    rules(); 
    choices(); 
    choice = selected(in); // assign the value to choice 
    opponent = opp(); // assign the value to opponent 
    result(choice, opponent, in); 
} 

Вы также не присвойте возвращаемые значения методам локальным переменным - они никогда не будут ch ange и цикл никогда не кончатся так!

+0

Итак, я исправил ту часть, о которой вы упоминаете. Тем не менее, у меня есть цикл снова. в исправлении вы указываете исправленную недопустимую часть выбора. – Jody

+0

То же самое касается 'while (choice! = '0') {' ... – njzk2

+0

@Jody посмотрите обновление моего ответа. @ njzk2, спасибо за это, я включил эту часть в явном виде. Я не видел этого, потому что исходный вопрос OP только упоминал часть '' Invalid choice ''. – pascalhein

0

изменить это

choice != '1' && choice != '2' && 
choice != '3' && choice != '4' && 
choice != '0' 

к этому

choice != 1 && choice != 2 && 
choice != 3 && choice != 4 && 
choice != 0 

То, что вы пытаетесь сделать, это ИНТ! = Символ и значение '1' в ASCII является 49 SO это было на самом деле не один Вы читаете int из Сканера.

0

Проблема здесь

int choice = in.nextInt(); 
while (choice != '1' && choice != '2' && 
     choice != '3' && choice != '4' && 
     choice != '0') { 
    System.out.println("Invalid choice"); 

nextInt() возвращает десятичное значение типа INT. (int) 1! = (char) '1'.Самое легкое решение, о котором я могу думать, это

while (choice != 1 && choice != 2 && 
     choice != 3 && choice != 4 && 
     choice != 0) { 
Смежные вопросы