【问题标题】:how to select players join the game and start a game如何选择玩家加入游戏并开始游戏
【发布时间】:2020-04-19 09:06:27
【问题描述】:

我是 Java 初学者,我一直在为游戏创建一个练习项目。为此,我已经在这个项目中放了一些特性,我把整个项目分成三个文件:Nimsys、NimPlayer、NimGame。

我已经创建了这些功能。

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

现在,我想让两个玩家加入游戏,然后执行以下操作:

  1. 成绩记录
  2. 玩家玩过的次数。

我所做的是尝试从提示输入中存储用户数据(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 中。

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

【问题讨论】:

    标签: java object constructor


    【解决方案1】:

    附带说明(因为它不会影响程序的执行),标识符的名称应该是不言自明的,例如您的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,因为&amp;&amp; 运算符仅在其左侧的条件计算为true 时才允许继续进行。

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

    现在,我想让两个玩家加入游戏,然后执行以下操作:

    • 成绩记录
    • 玩家玩过的次数。

    目前,NimPlayer 类中有userNamefamilyNamegivenName 属性。您需要再创建两个属性,private int scoreprivate int numbersOfGamesPlayed 及其 public getter 和 setter。您需要使用这些属性来存储得分值和玩家玩游戏的次数。

    【讨论】:

    • 很高兴再次见到您,先生。在检查两个玩家的有效性时,我清楚地理解了您的代码,并再次感谢您指出问题。但是,如果我想输入每个球员的得分和比赛次数。这是否意味着我必须重写代码来保存这两个属性?或者更改在 Nimsys 中构建对象的方式。
    • @Woden - 不客气。我已更新我的答案以包含这些问题的解决方案。
    • 这个时候不要太担心。你已经在正确的轨道上。你编码的越多,你就会变得越好,好主意就会开始在你的脑海中浮现。您应该将Nimsys 视为引擎,将NimPlayerNimGame 等视为引擎的组件。这些组件中的每一个都应该具有最相关的属性,例如namescorenumbersOfGamesPlayed 等是玩家的相关属性,因此这些属性必须是NimPlayer 的一部分。在Nimsys中操作玩家或游戏的数据没有问题。
    • 添加另一条评论,因为空间不足,我无法完成我的最后一条评论。 正如我已经提到的,此时不要太担心。随着您的进步,您将获得更好的想法。在这个阶段返工没有坏处。经过几个项目后,您将能够在开始进行项目之前想到好的设计。祝你成功!
    • 谢谢您,先生。我知道如何加载到游戏中真的很令人兴奋!!!我做了我在 NimPlayer 上所做的事情,定义 NimGame 数据类型并将 NimGame 包装成一个函数供 Nimsys 使用。祝你有美好的一天,先生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多