如何解决Java - 围绕 for 循环迭代以创建游戏玩家并设置他们的名字
我编程的时间不长,我花了几个小时试图让这种方法做我需要的事情,所以在这一点上非常感谢帮助。我正在创建一个棋盘游戏,它会提示玩家输入玩游戏的人数,然后依次提示他们输入姓名,然后将创建这些新玩家并设置/存储他们的姓名。我还想确保两个玩家不能同名。
这是我的播放器类的一部分:
public class Player {
private String name;
private int currentPosition;
private int distance;
private boolean quit;
public Player() {
}
public Player(String name,int currentPosition,int distance,boolean quit) {
this.name = name;
this.currentPosition = currentPosition;
this.distance = distance;
this.quit = quit;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我有一个 setNumberOfPlayers 方法,它运行良好,并在调用 getNumberOfPlayers() 时获得正确的玩家数量。
public class SetUpGame {
Scanner sc = new Scanner(System.in);
public void addPlayers() {
String playerName;
ArrayList<Player> players = new ArrayList<Player>();
System.out.println("What are the names of the " + this.numberOfPlayers + " players?\n");
for (int loop = 1; loop <= getNumberOfPlayers(); loop++) {
System.out.println("Player " + loop + " please enter your name");
boolean valid = false;
do {
playerName = sc.nextLine();
Player player = new Player();
for (Player play : players) {
if (players.isEmpty() || !play.getName().equalsIgnoreCase(playerName)) {
player.setName(playerName);
players.add(player);
System.out.println("success,your name is: " +playerName);
valid = true;
} else {
System.out.println("please enter another name");
valid = false;
}
}
} while (valid == false);
}
sc.close();
}
当从 main 调用 add Players 方法时,它给出以下输出:
What are the names of the 2 players?
Player 1 please enter your name
...用户可以输入他们的名字,但扫描器永远不会关闭或循环询问下一个玩家他们的名字。我把代码弄得乱七八糟,以至于我在这一点上把自己弄糊涂了。任何人都可以帮助解决这个问题,以及如何验证/检查玩家是否已经创建并设置了他们的名字?谢谢
解决方法
首先,玩家列表在方法addPlayers
中被定义为一个局部变量,所以当这个方法完成时,所有玩家数据都会丢失。因此有必要修改此方法以将玩家添加到 SetupGame
类的字段或将玩家列表返回给调用方法。后一种方式是填充玩家列表的更简洁的功能方式。
接下来,为了高效检测重名,建议创建并使用Set<String> playerNames
。
最后,如果 Scanner
在 System.in
上打开,它不能关闭,因为之后就不能输入用户输入了。
话虽如此,addPlayers
的代码可能如下所示:
public List<Player> addPlayers() {
List<Player> players = new ArrayList<>();
Set<String> playerNames = new HashSet<>();
Scanner sc = new Scanner(System.in);
System.out.println("What are the names of the " + this.numberOfPlayers + " players?\n");
for (int loop = 1; loop <= this.numberOfPlayers; loop++) {
while (true) {
System.out.println("Player " + loop + " please enter your name");
String playerName = sc.nextLine();
if (playerNames.add(playerName)) {// Set.add returns true if name was added to it
Player p = new Player();
p.setName(playerName);
players.add(p);
break; // input new player
}
}
}
return players;
}
,
您的内部 for 循环正在对玩家数组进行迭代,但它是空的。
也许试试这个:
do {
System.out.println("Please enter name:");
playerName = sc.nextLine();
if(playerName.length()!=0){
valid = true;
for(Player play : players)
if(play.getName().equalsIgnoreCase(playerName))
valid = false;
if(valid){
Player player = new Player();
player.setName(playerName);
players.add(player);
}
}
} while (!valid);
我认为您可能很难调试,因为您所有的变量名称都非常相似。 ('players','player','play')
编辑:更新以检查是否重复
,您错过了 Player 类中的一些 getter 和 setter。
Player.java
public class Player {
private String name;
private int currentPosition;
private double distance;
private boolean quit;
public Player() {
// no-args constructor
}
public Player(String name,int currentPosition,double distance,boolean quit) {
this.name = name;
this.currentPosition = currentPosition;
this.distance = distance;
this.quit = quit;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCurrentPosition() {
return currentPosition;
}
public void setCurrentPosition(int currentPosition) {
this.currentPosition = currentPosition;
}
public double getDistance() {
return distance;
}
public void setDistance(double distance) {
this.distance = distance;
}
public boolean isQuit() {
return quit;
}
public void setQuit(boolean quit) {
this.quit = quit;
}
}
您可以按如下方式实现 SetUpGame 类。
无需创建 do-while 循环。
SetUpGame.java
import java.util.ArrayList;
import java.util.Scanner;
public class SetUpGame {
Scanner sc = new Scanner(System.in);
ArrayList<Player> players = new ArrayList<Player>();
int numberOfPlayers;
public int getNumberOfPlayers() {
return numberOfPlayers;
}
public void setNumberOfPlayers(int numberOfPlayers) {
this.numberOfPlayers = numberOfPlayers;
}
public void addPlayers() {
System.out.print("Enter number of players: ");
numberOfPlayers = sc.nextInt();
System.out.println("What are the names of the " + numberOfPlayers + " players?");
for(int loop = 1; loop <= numberOfPlayers; loop++) {
Player player = new Player();
System.out.print("Enter name for player " + loop + ": ");
player.setName(sc.next());
System.out.print("Enter current position for player " + loop + ": ");
player.setCurrentPosition(sc.nextInt());
System.out.print("Enter distance for player " + loop + ": ");
player.setDistance(sc.nextDouble());
System.out.print("Enter validity for player " + loop + ": ");
player.setQuit(sc.nextBoolean());
players.add(player);
}
sc.close();
}
public void displayAllPlayers() {
System.out.println("Displaying all players...");
for(Player p : players) {
System.out.printf("%s %d %f %b",p.getName(),p.getCurrentPosition(),p.getDistance(),p.isQuit());
}
}
}
最后您可以测试您的 SetUpGame 类。
TestSetUpGame.java
public class TestSetUpGame {
public static void main(String[] args) {
SetUpGame game = new SetUpGame();
game.addPlayers();
game.displayAllPlayers();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。