java中的多线程 - 未知数量的球员得分列表

时间:2016-12-26 15:31:55

标签: java multithreading

我正在为大学项目开发​​一个简单的服务器 - 客户端骰子游戏。游戏限制是可以有无限数量的玩家。我正在尝试创建他们的分数列表,但我不知道如何传递玩家的数量,因为每次下一个玩家连接时,服务器接受新的连接,所以我无法阻止下一个线程被启动。

我在考虑像" PLAY"在等待玩家时按钮/布尔变量,在游戏开始后,下一个线程将无法启动。但是,我不知道如何实现它。有什么建议?另一个想法也是一个很好的建议:)

以下是服务器的代码段:

 public void initializeResultList(int amountOfPlayers){
    final ArrayList<Object> resultDescription = new ArrayList();
    ArrayList<Object> zeros = new ArrayList(); 
    resultDescription.add("Player");
    resultDescription.add("One Pair");
    resultDescription.add("Two Pairs");
    resultDescription.add("Three of a kind");
    resultDescription.add("Full House");
    resultDescription.add("Four of a kind");
    resultDescription.add("Five of a kind");
    for (int j = 0; j < resultDescription.size(); j++){
        zeros.add(null);
    }
    resultList.add(resultDescription);
    //fill with nulls, then there will be player Scores
    for (int i = 1; i <= amountOfPlayers; i++){
        resultList.add(zeros);
    }

}

 public static void main(String args[]) throws IOException {


    int portNumber = 444;

    ServerSocket serverSocket = null;


    try {
        serverSocket = new ServerSocket(portNumber);
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Error finding port");
        System.exit(1);
    }

    // program loop
    do {
        Server server = new Server(serverSocket.accept());

        //HERE IS THE PROBLEM!
        server.initializeResultList(2); // here should be passed the amount
        server.start();
    } while (true);

}

@Override
public void run(){
    System.out.println("Connection accepted");
    System.out.println("Client has successfully connected");
}

以下是来自Player类的代码(现在不是问题,但也许你想知道服务器和播放器是如何通信的):

  public static void main (String args[]) throws IOException {
    //Connect to the server
    Socket socket = null;
    int portNumber = 444;
    String str;
    BufferedReader br = null;
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    PrintWriter out = null;

    try {
        socket = new Socket(InetAddress.getLocalHost(), portNumber);
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(socket.getOutputStream(), true);
    } catch (UnknownHostException uhe) {
        System.out.println("Unknown Host");
        System.exit(0);
    }


    boolean quit = false;

    while (!quit) {

        str = input.readLine();
        out.println(str);
    }


}

1 个答案:

答案 0 :(得分:0)

有几种可能的实现方式。想到的一个,包括一队球员。因此,无论何时连接新玩家,它都会排在队列中,直到您的应用程序选择它为止。可以将队列大小添加到本地计数器以获得玩家总数。拉完玩家后,他就从队列中走了出来。 例如,您可以通过以下方式初始化队列:

Queue<YourObject> queue = new ConcurrentLinkedQueue<YourObject>();

我们选择并发链接队列,因为它可以检查here的属性。添加新用户后,您可以将Player放入队列中:

queue.offer(myObject);

在你的servlet中,例如在每轮结束时或者你需要新玩家时,你可以打电话:

YourObject myObject = queue.poll();

或者您可以获得新玩家的数量:

int nrNewPlayers = queue.size();

如果您需要Player对象,还包含有关播放器本身的信息和统计信息,这是一个很好的解决方案。但是,如果你真的只需要玩家的总数,那么队列就太过分了,你可以按照以下方式使用A tomic integer

//Initialize the integer in constructor
public static AtomicInteger userCounter = new AtomicInteger(0);

//Increment number of users when a new user is added ()
userCounter.incrementAndGet();

//Decrement the number of users when a user disconnects
userCounter.decrementAndGet();

//Get number of users from within your code
int counter = userCounter.intValue();

所以你的服务器代码是:

//HERE IS THE PROBLEM!
int counter = userCounter.intValue();
server.initializeResultList(counter); // here should be passed the amount

这是我对您提供的代码所能做的最好的事情。如果您需要更多帮助,请创建一个新问题并提供更多代码而不是代码段,并更好地解释您需要的内容。希望这会对你有所帮助。