2013-07-02 3 views
0

Я пишу случайную случайную игру, чтобы выбрать случайного победителя. Я использую цикл for для ввода игроков в массив, но он не позволяет мне вводить ничего для первого игрока. Вот код:Java For Loop Issue

import java.util.Scanner; 
import java.util.Random; 
public class Run { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Scanner input = new Scanner(System.in); 
    Random rand = new Random(); 

    System.out.println("How many people will play???"); 
    int playernum = input.nextInt(); 

    String players[] = new String[playernum]; 

    for(int i = 0; i < playernum; i++){ 
     System.out.println("Who is player #" + (i+1)+"?"); 
     players[i] = input.nextLine(); 
    } 

    System.out.println("The winner is: " + players[rand.nextInt(playernum)]); 

} 

} 
+1

THINK! Вы создаете 'массив' строки на основе' playernum' как размер, а затем пытаетесь выполнить цикл, который увеличивается ... – Tdorno

+2

Возможный дубликат [Проблема с сканером при использовании nextLine after nextXXX] (http://stackoverflow.com/ вопросы/7056749/scanner-issue-when-use-nextline-after-nextxxx) – acdcjunior

ответ

4

input.nextInt() вызова считывает целое число, но оставляет символ новой строки непрочитанный во входном потоке, поэтому input.nextLine() вызова в цикле просто читает этот символ в первой итерации.

Итак, вам нужно следующее -

int playernum = input.nextInt(); 
input.nextLine(); //read the unread new line character from the input stream 
+0

@downvoter: Не могли бы вы прокомментировать, почему downvote? –

+0

@Besh Я дал ему голосование. Как вы узнали кого-то, кто проголосовал за ваш пост? Есть ли способ рассказать? Я здесь немного новый. –

+0

@HenryHarris Вы можете увидеть свою историю downvote/upvote в профиле <репутация <история – Tdorno

0

Я думаю, что ваш вопрос на этой линии players[i] = input.nextLine();.

Я думаю, что вы ищете есть players[i] = input.next();

«Авансы этого сканера мимо текущей строки и возвращает вклад, который был пропущен. Этот метод возвращает остаток текущей строки, за исключением любого разделителя строки в конец." См. Описание API here.

0

Используйте input.next() вместо input.nextLine() в цикле for. Таким образом, неиспользуемый новый символ линии не будет проблемой, как объясняет @BheshGurung в своем ответе.

2

Используйте следующий код. Комментарии в коде объясняют изменения.

import java.util.Scanner; 
import java.util.Random; 
public class Run { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Scanner input = new Scanner(System.in); 
    Random rand = new Random(); 

    System.out.println("How many people will play???"); 
    int playernum = input.nextInt(); 
    input.nextLine(); //ADDED LINE 

    String players[] = new String[playernum]; 

    for(int i = 0; i < playernum; i++){ 
     System.out.println("Who is player #" + (i+1)+"?"); 
     players[i] = input.nextLine(); 
    } 

    System.out.println("The winner is: " + players[rand.nextInt(playernum)]); 

} 

} 

Мы добавили input.nextLine(); потому что input.nextInt(); оставляет пережиток символ новой строки, что нам нужно очистить. Он помещал этот символ новой строки в качестве плеера 1

-Генри

+0

Не было бы лучше помочь ОП выяснить его проблему и дать ему подход, чтобы исправить проблему, а не просто ее исправлять и двигаться дальше? – Tdorno

+0

@Tdorno Хорошая точка. Я попытался объяснить это, но я думаю, что ему лучше учиться самостоятельно. –