Java - 迭代 for 循环以创建游戏玩家并设置他们的名字

Java - Iterating around for-loop to create players for game and setting their name

提问人:illustriouscake 提问时间:4/11/2021 更新时间:4/11/2021 访问量:1407

问:

我编程的时间不长,我花了几个小时试图让这种方法做我需要的事情,所以在这一点上,我们将不胜感激。我正在创建一个棋盘游戏,它会提示玩家输入玩游戏的玩家数量,然后依次提示他们输入他们的名字,这些新玩家将被创建并设置/存储他们的名字。我还想确保两个玩家不能有相同的名字。

这是我的球员职业的一部分:

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

...用户可以输入他们的名字,但扫描仪永远不会关闭或循环询问下一个玩家他们的名字。我把代码搞得一团糟,以至于在这一点上我弄糊涂了自己。谁能帮忙解决这个问题,以及如何验证/检查球员是否已创建并设置了他们的名称?谢谢

java for-loop oop java.util.scanner do-while

评论


答:

1赞 SequenceToSequence 4/11/2021 #1

您的内部 for 循环正在迭代 players 数组,但它是空的。

也许可以试试这个:

       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);

我认为您可能很难进行调试,因为您的所有变量名称都非常相似。('玩家','玩家','玩')

编辑:更新以检查是否重复

评论

0赞 illustriouscake 4/11/2021
谢谢,这可以设置名称。但是,如果在 if 语句中创建了新的 Player 实例,我如何确保用户没有输入重复的名称呢?
0赞 Tim 4/11/2021 #2

你错过了玩家类中的一些吸气者和二传手。

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();
    }
}
1赞 Nowhere Man 4/11/2021 #3

首先,玩家列表在方法中被定义为局部变量,因此当此方法完成时,所有玩家数据都会丢失。因此,有必要修改此方法以将玩家添加到类字段或将玩家列表返回到调用方法。后一种方式是填充玩家列表的更简洁的功能方式。addPlayersSetupGame

接下来,为了有效地检测重复名称,建议创建并使用 .Set<String> playerNames

最后一个,如果打开,则不能关闭,因为在那之后不能输入任何用户输入。ScannerSystem.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;
}