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

时间:2020-04-19 09:06:27

标签: java object constructor

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

我已经创建了这些功能。

  1. 将播放器添加到NimPlayer中的playerList中。
  2. removeplayer
  3. editplayer

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

  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中。

感谢您抽出宝贵的时间来查看我的代码。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在旁注(因为它不会影响程序的执行),标识符的名称应该是不言自明的,例如您的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,因为您将在.length参考上检查null

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

  • 得分记录
  • 玩家玩过的次数。

当前,您在userName类中具有familyNamegivenNameNimPlayer属性。您还需要使用其private int score的getter和setter创建另外两个属性private int numbersOfGamesPlayedpublic。您需要使用这些属性来存储得分值和玩家玩游戏的时间。