-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGameServer.java
More file actions
159 lines (140 loc) · 4.13 KB
/
GameServer.java
File metadata and controls
159 lines (140 loc) · 4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import java.awt.Canvas;
import java.awt.Graphics;
import java.net.*;
import java.io.*;
import java.util.*;
public class GameServer implements Runnable{
/**
*
*/
private final int WAITING = 1;
private final int GAME_START = 2;
private final int IN_PROGRESS = 3;
private final int END_GAME = 4;
private static final long serialVersionUID = 1L;
ArrayList plist; //player list
int playerCount;
int numOfPlayers;
String data;
static int port = 4444;
HashMap<String, RaceCar> gameState = null;
DatagramSocket serverSocket = null;
int gameStage;
int startX, startY;
public GameServer(int numOfPlayers){
//GameServer
this.numOfPlayers = numOfPlayers;
plist = new ArrayList();
try {
serverSocket = new DatagramSocket(port);
serverSocket.setSoTimeout(100);
} catch (IOException e) {
System.err.println("Could not listen on port: "+port);
System.exit(-1);
}catch(Exception e){}
gameState = new HashMap<String, RaceCar>();
gameStage = WAITING;
new Thread(this).start();
}
public void setPort(int port){
GameServer.port = port;
}
public void broadcast(String msg){
for(String key : gameState.keySet()){
RaceCar player= gameState.get(key);
player.message = msg;
gameState.put(player.getName(), player);
}
for(String key : gameState.keySet()){
RaceCar player= gameState.get(key);
send(player);
}
}
public void send(RaceCar player){
try{
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(5000);
ObjectOutputStream os = new ObjectOutputStream(byteStream);
os.flush();
os.writeObject(gameState);
os.flush();
//retrieves byte array
byte[] sendBuf = byteStream.toByteArray();
DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length, player.getAddress(),player.getPort());
serverSocket.send(packet);
}catch(IOException ioe){
ioe.printStackTrace();
}
}
public String getPlayer(int pcount){
return plist.get(pcount).toString();
}
public String stringify(){
String retval="";
for(String key : gameState.keySet()){
retval += gameState.get(key).toString() + ":";
}
return retval;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.print("starting...");
playerCount = 0;
while(true){
byte[] buf = new byte[5000];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
RaceCar racecar = new RaceCar("qwe", 10,10, "launcha");
try{
serverSocket.receive(packet);
ByteArrayInputStream byteStream = new ByteArrayInputStream(buf);
ObjectInputStream is = new ObjectInputStream(byteStream);
racecar = (RaceCar)is.readObject();
racecar.setAddress(packet.getAddress());
racecar.setPort(packet.getPort());
}catch(Exception ioe){ }
data = new String(buf).trim();
switch(gameStage){
case WAITING :
if(racecar.gameStage == 1){
if(gameState.containsKey(racecar.getName()))
continue;
plist.add(racecar.getName());
gameState.put(racecar.getName(),racecar);
broadcast("CONNECTED "+racecar.getName());
System.out.println(racecar.getName()+" CONNECTED");
playerCount++;
//System.out.println(playerCount);
if (playerCount==numOfPlayers){
gameStage=GAME_START;
}
}
String temp="NAMES "+playerCount+" ";
for(int i=0; i<plist.size(); i++){
temp += plist.get(i) + " ";
}
broadcast(temp);
break;
case GAME_START:
broadcast("START");
System.out.println("GAME START");
gameStage=IN_PROGRESS;
break;
case IN_PROGRESS:
if(racecar.message!=null && racecar.message.startsWith("PLAYER")){
if(racecar.getHealth() <= 0)
gameState.remove(racecar.getName());
else
gameState.put(racecar.getName(), racecar);
//1Send to all the updated game state
broadcast("PLAYER "+racecar.getName());
} else if(racecar.message!=null && racecar.message.startsWith("GameOver")){
broadcast("GameOver " + racecar.getName());
gameStage = END_GAME;
}
break;
case END_GAME:
return;
}
}
}
}