我正在为大学项目开发一个简单的服务器 - 客户端骰子游戏。游戏限制是可以有无限数量的玩家。我正在尝试创建他们的分数列表,但我不知道如何传递玩家的数量,因为每次下一个玩家连接时,服务器接受新的连接,所以我无法阻止下一个线程被启动。
我在考虑像" 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);
}
}
答案 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
这是我对您提供的代码所能做的最好的事情。如果您需要更多帮助,请创建一个新问题并提供更多代码而不是代码段,并更好地解释您需要的内容。希望这会对你有所帮助。