Varför printar den inte ut namnet?
Hej!
Jag försöker skapa ett program som printar ut namnet och poängen för en spelare/spelarna så att det ser ut som sådan: "name: hercules points: 20". Såhär ser min kod ut
void program() {
Player[] players = inputPlayers();
outPlayers(players);
}
//This class captures the concept of a Player
class Player {
String name; // A Player has a name and...
int points; // ... and points
// TODO Add a constructor
Player(String name, int points) {
this.name = name;
this.points = points;
}
}
// ---------- Methods -------------------
Player[] inputPlayers() {
out.println("How many players?");
int nplayers = sc.nextInt();
Player[] players = new Player[nplayers];
for (int i = 0; i < nplayers; i++){
int index = i + 1;
out.println("Whats the name of player" + " " + index +" ?");
String name = sc.nextLine();
sc.nextLine();
out.println("How many points does player" + " "+ index + "?");
int points = sc.nextInt();
Player p = new Player(name,points);
players[i] = p;
sc.nextLine();
}
return players; // For now
}
void outPlayers(Player[] players){
// TODO
for (int i = 0; i < players.length; i++){
out.println("Players are:");
out.println("Name:" + " " + players[i].name + " " +"Points:"+ " " +players[i].points );
}
}
}
Mitt problem är att såsom koden ser ut nu så printar den inte ut namnet på den första spelaren, alltså player[0].name. Vad är det jag gör fel? Kan någon ge mig en ledtråd?
Jag vet inte riktigt, men kan du visa en exempelkörning med fyra spelare?
Det är lite för många nextLine(), tycker jag.
Hur såg det ut i början av körningen? De första fem raderna.
Angående nextLine() så stod i instruktionerna att man skulle lägga en extra sc.readLine() eftersom det har något med ENTER och att man användaer både text och siffer input, men jag tycker också att inte alla nextLine() jag har är nödvändiga.
Jag föreslår att du skriver ut vad varje sc.nextLine() returnerar, så vet vi om nån text försvinner genom att den blir inläst vid fel tillfälle. Jag minns att sådant här förvirrade mig i början, tills jag hittade rätt sätt att tänka (i olika språk), nämligen att läsa in en hel rad i taget och sedan bearbeta den som sträng. Men det borde gå att göra rätt enligt dina instruktioner också.
Det har nog nånting att göra med att nextInt (kanske) läser (inklusive tomma rader) tills det finns något som kan vara ett heltal, medan nextLine bara läser en ny rad.
Vad säger dokumentationen om nextInt()?
Det står ingenting om nextInt() i dokumentationen.
Man ska inte behöva programmera utan dokumentation. Klaga hos din lärare.
För att fortsätta debugga: byt ut alla rader som ser ut som
sc.nextLine();
mot
out.println("[" + sc.nextLine() + "]");
Stoppa dessutom in
out.println("[name = " + name + "]");
precis efter att du har läst in 'name'.
(Typsnittet från koden verkar ha fastnat på min vanliga text också.)
Jag tror att jag har hittat problemet. När jag kör programmet via debugger så verkar det som att den inte sparar namnet på den första spelaren.
Jag vet inte har jag ska fixa det här problemet, kan du ge mig ett tips?
nextInt och nextLine verkar interagera på nåt konstigt sätt. Om du skriver ett kort program där du bara utför lite olika kombinationer av dem och ser vad som läses in så kanske du kommer på hur det fungerar. Jag kan inte riktigt tänka ut det.
Troligen behöver den första inläsningen av heltal efterföljas av inläsning/konsumption av nyradstecknet. Prova lägga in:
int nplayers = sc.nextInt();
sc.nextLine(); // consume newline
Tack!