java - 如何选择玩家加入游戏并开始游戏

标签 java object constructor

我是 Java 初学者,我一直在为游戏创建练习项目。为此,我已经在这个项目中添加了一些功能,并将整个项目分成三个文件:Nimsys、NimPlayer、NimGame。

我创建了这些功能。

  1. 将player添加到NimPlayer中的playerList中。
  2. 删除玩家
  3. 编辑播放器

现在,我希望两名玩家加入游戏,并执行以下操作:

  • 分数记录
  • 玩家玩过的次数。
  • 我所做的是尝试存储提示输入中的用户数据(addplayer),并带来要玩的游戏(不完整代码的最后一部分)。

    import java.util.Scanner;
    
    public class Nimsys {
    
    public static String[] splitName(String inName) {
        String[] splittedLine = inName.split(",");
        String[] name = null;
        if (splittedLine.length==3) {
            String userName = splittedLine[0].trim();
            String familyName = splittedLine[1].trim();
            String givenName = splittedLine[2].trim();
            name = new String[3];
            name[0] = userName;
            name[1] = familyName;
            name[2] = givenName;
        }
        return name;
    }
    
    public static String [] splitData(String dataIn) {
        String[] splittedLine = dataIn.split(",");
        String[] data = null;
        if (splittedLine.length==4) {
            String initialStone = splittedLine[0];
            String stoneRemoval = splittedLine[1];
            String player1 = splittedLine[2].trim();
            String player2 = splittedLine[3].trim();
            data = new String[4];
            data[0] = initialStone;
            data[1] = stoneRemoval;
            data[2] = player1;
            data[3] = player2;
        }
        return data;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (true) {
            System.out.print('$');
            String commandin = in.next();
    
            if (commandin.equals("addplayer")) { 
                String inName = in.nextLine();
                String[] name = splitName(inName);
    
                //Make sure the vadality of in name
                if (name!=null && name.length==3) {
                    for (int i = 0; i < NimPlayer.getId(); i ++) {
                        String userCheck = NimPlayer.getPlayer()[i].getUserName();
                        if (userCheck.contains(name[0])) {
                            System.out.println("The player already exist");//Test if player has been created
                        } 
                }
                    NimPlayer.createPlayer(name[0], name[1], name[2]);
                    System.out.println("The player has been created.");
                } else {
                    System.out.println("Not Valid! Please enter again!");
                }          
            }
    
            if (commandin.equals("removeplayer")) {
                //cannot loop through the entire null array, would be NullPointerException
                String removeUserName = in.nextLine().trim();
    
    
                /*System.out.println("Are you sure you want to remove all players? (y/n) \n");
                //System.out.print('$');
                commandin = in.next();
                    if (commandin.equals("y")) {
                        for (int i = 0; i < NimPlayer.getId(); i++) {
                            NimPlayer.getPlayer()[i] = null;
                            System.out.println("Remove all the players");
                        }
                    } else {
                        System.out.print('$');
                    }*/
                //commandin = in.next();
                for (int i = 0; i < NimPlayer.getId(); i++) {
                    String userName = NimPlayer.getPlayer()[i].getUserName().trim();
                    if (removeUserName != null && userName.equals(removeUserName)) {
                        NimPlayer.getPlayer()[i] = null;
                        System.out.println("Remove successfully!");// A test to see if the code runs
    
                    } else {
                        System.out.println("The player does not exist");   
                    }
                } 
            }
    
            if (commandin.equals("editplayer")) {
                String inName = in.nextLine();
    
                String[] splittedLine = inName.split(",");
                if (splittedLine!=null && splittedLine.length==3) {
                    String userName = splittedLine[0].trim();
                    String familyName = splittedLine[1].trim();
                    String givenName = splittedLine[2].trim();
                    //System.out.println(userName+","+familyName+","+givenName);//Test if in name in the if loop
                    for (int i = 0; i < NimPlayer.getId(); i++) {
                        String userCheck = NimPlayer.getPlayer()[i].getUserName().trim();
                        if (userName != null && userCheck.equals(userName)) {
                            NimPlayer.getPlayer()[i].setFamilyName(familyName);
                            NimPlayer.getPlayer()[i].setGivenName(givenName);
    
                            System.out.println("Edit successfully");
    
                        } else {
                            System.out.println("The player does not exist.");
                        }
                    }            
                } else {
                    System.out.println("Invalid in! Please enter again.");
                }      
            }
    
            if (commandin.equals("displayplayer")) {
                for (int i = 0; i < NimPlayer.getId(); i++) {
                    String userName = NimPlayer.getPlayer()[i].getUserName();
                    String familyName = NimPlayer.getPlayer()[i].getfamilyName();
                    String givenName = NimPlayer.getPlayer()[i].getGivenName();
    
                    System.out.println(userName+","+familyName+""+givenName);
                }
            }
    
            if (commandin.equals("startgame")) {
                String dataIn = in.nextLine();
                String [] data = splitData(dataIn);
                //Check if player in the array
                if (data.length==4 && data !=null) {
                    for (int i = 0; i < NimPlayer.getId(); i++) {
                        for (int j = i + 1; j < NimPlayer.getId(); j++) {
                            String player1 = NimPlayer.getPlayer()[i].getUserName();
                            String player2 = NimPlayer.getPlayer()[j].getUserName();
                            if (player1==null || player2==null) {
                                System.out.println("One of the players does not exist. Please enter again");
                            } else {
                                System.out.println("Data built successfully.Game starts!");
                                break;
                            }
                        } 
                    }
                    dataIn = in.nextLine();
                }
                int dataStone = Integer.parseInt(data[0]);
                int dataRemoval = Integer.parseInt(data[1]);
    
        }
    }}
    
    
    
    //username, given name, family name, number of game played, number of games won
    public class NimPlayer {
    private String userName;
    private String familyName;
    private String givenName;
    
    static NimPlayer[] playerList = new NimPlayer[10]; // set an array here
    static int id;
    
    //define NimPlayer data type
    public NimPlayer(String userName,String surName, String givenName) {
        this.userName = userName;
        this.familyName = surName;
        this.givenName = givenName;
    }
    // create new data using NimPlayer data type
    public static void createPlayer(String userName, String familyName, String givenName) {
        if (id<10) {
            playerList[id++] = new NimPlayer(userName, familyName, givenName);
        } else {
            System.out.println("Cannot add more players.");
        }
    }
    public static int getId() {
        return id;
    }
    public static NimPlayer [] getPlayer() {
        return playerList;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }
    public void setGivenName(String givenName) {
        this.givenName = givenName;
    }    
    public String getUserName() {
        return userName;
    }
    public String getfamilyName() {
        return familyName;
    }
    public String getGivenName() {
        return givenName;
    }
    
    
    }
    

    上面是我的 Nimsys 和 NimPlayers 类。到目前为止,我有一个问题:

    在Nimplayer中操纵玩家是不是错了? 或者如果我想存储记录和玩游戏的次数,最好在 Nimsys 中创建一个对象?

    public class NimGame {
    
    int stoneBalance;
    int stars;
    
    public int initializeStone(int startStones) {
        stoneBalance = startStones;
        return stoneBalance;
    }
    
    public void removeStones(int stonesTaken) {
        int updatedBalance = stoneBalance - stonesTaken;
        stoneBalance = updatedBalance;
    }
    
    public void printStar(int star) {
        stars = star;
        stars = stoneBalance;
        for (int stars = 1; stars <= star; stars++) {
            System.out.print(" *");
        }
        System.out.println();
    }
    Scanner in = new Scanner(System.in);
    String playOrNot;
    do {
        System.out.println("Initial stone count: "+datastone);
        System.out.println("Maximum stone removal: "+dataRemoval);
        System.out.println("Player 1: "+player1.getUserName());
        System.out.println("Player 2: "+player2.getUserName());
    
        // while stoneBalance > 0, two players keep playing the game
        while (stoneBalance > 0) {
            System.out.print(initialStone + " stones left:");
            printStar(initialStone);
            // player1's turn and remove the stones; decision of winning
    
            System.out.println(player1 + "'s turn - remove how many?\n");
            int takeStone = in.nextInt();
            while (takeStone > dataRemoval || takeStone <= 0) {
                System.out.println(
                        "Invalid, you need to remove stones under upper "+ 
                        "bound limit or above 0. \n Please enter again.");
                takeStone = in.nextInt();
            }
            removeStones(takeStone); //remove the stone
    
            if (stoneBalance > 0) {
                //show the remaining stones
                System.out.print(stoneBalance + " stones left:"); 
                printStar(stoneBalance);
            } else if (stoneBalance <= 0) {
                System.out.println("Game Over\n" + player2 + " wins!\n");
                break;
            }
    
            // player2's turn and remove the stones; decision of winning
    
            System.out.println(player2 + "'s turn - remove how many?\n");
            takeStone = in.nextInt();
            while (takeStone > dataRemoval || takeStone <= 0) {
                System.out.println(
                        "Invalid, you need to remove stones under upper " + 
                        "bound limit or above 0. \n Please enter again.");
                takeStone = in.nextInt();
            }
            removeStones(takeStone);
    
            if (stoneBalance > 0) {
                System.out.print(stoneBalance + " stones left:");
                printStar(stoneBalance);
            } else if (stoneBalance <= 0) {
                System.out.println("Game Over\n" + player1 + " wins!\n");
                break;
            }
        }
        // ask players to play again
        in.nextLine();
        System.out.println("Do you want to play again (Y/N):");
        playOrNot = in.nextLine();
    
    } while (playOrNot.equals("Y"));
    }
    

    上面是我的 NimGame 类。这是经典的 Nim 游戏的过程。我应该做什么来介绍玩家?我在 Nimsys 中所做的只是检查玩家是否在 playerList 内。

    感谢您花时间检查我的代码。非常感谢任何帮助!

    最佳答案

    附带说明(因为它不会影响程序的执行),标识符的名称应该是不言自明的,例如您的 getPlayer 方法应命名为 getPlayerList,因为它返回的是 playerList,而不是单个玩家。

    您的startgame逻辑应如下所示:

    if (commandin.equals("startgame")) {
        String dataIn = null, player1 = null, player2 = null;
        do {
            dataIn = in.nextLine();
            String [] data = splitData(dataIn);
            //Check if player in the array
            if (data !=null && data.length==4) {
                NimPlayer[] players = NimPlayer.getPlayerList();
                for (int i = 0; i < players.length; i++) { 
                    if(players[i].getUserName().equals(data[2])) {// Checking player1         
                        player1 = players[i].getUserName();
                        break;
                    } 
                }
                for (int i = 0; i < players.length; i++) { 
                    if(players[i].getUserName().equals(data[3])) {// Checking player2       
                        player2 = players[i].getUserName();
                        break;
                    } 
                }
            } 
        } while(player1 == null || player2 == null)
        //...
    }
    

    您可以将重复的代码放在一个函数中以使您的程序模块化,例如

    String findPlayerByName(String name){
        String player = null;
        NimPlayer[] players = NimPlayer.getPlayerList();
        for (int i = 0; i < players.length; i++) { 
            if(players[i].getUserName().equals(name)) {        
                player = players[i].getUserName();
                break;
            } 
        }
        return player;
    }
    

    然后,startgame的逻辑将简化为:

    if (commandin.equals("startgame")) {
        String dataIn = null, player1 = null, player2 = null;
        do {
            dataIn = in.nextLine();
            String [] data = splitData(dataIn);
            //Check if player in the array
            if (data !=null && data.length==4) {
                player1 = findPlayerByName(data[2]);
                player2 = findPlayerByName(data[3]);
            } 
        } while(player1 == null || player2 == null)
        //...
    }
    

    我希望您了解的另一件事是以下行的问题:

    if (data.length==4 && data !=null)
    

    应该是

    if (data !=null && data.length==4)
    

    这样,如果datanull,则不会检查条件data.length==4,因为&& 运算符仅当其左侧的条件计算结果为 true 时才允许继续进行。

    您的行的问题是,如果datanull,您将得到NullPointerException,因为您将检查null 引用上的长度

    Now, I want two of the players to join the game, and do the following:

    • Score record
    • The times the player has played.

    目前,NimPlayer 类中有 userNamefamilyNamegivenName 属性。您还需要创建另外两个属性:private int Scoreprivate int numberOfGamesPlayed 及其 public getter 和 setter。您需要使用这些属性来存储分数值和玩家玩游戏的时间。

    关于java - 如何选择玩家加入游戏并开始游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61301889/

    相关文章:

    java - 简单的 JSP 页面未加载

    ios - 如何映射一个我不知道参数个数的json

    c++ - 内置类型(int,char等)的析构函数

    java - 调试 Eclipse 中来自 .properties 文件 null 的 Spring @Value

    java - 如何合并相似对象的列表,但用 Java 8 总结一些属性

    python - 如何构建一个基本的迭代器?

    java - 一种获取多种类型的方法

    c++ - 可重用的构造函数 C++

    java - JPA OneToMany,在控制台或Web应用程序中打印时如何忽略字段ManyToOne

    Javascript 使用 Object.create 和属性指针未从原型(prototype)中取消引用