10 private static final int PORT = 8901;
13 private static char[][]
board =
new char[3][3];
21 public static void main(String[] args)
throws Exception {
22 ServerSocket listener =
new ServerSocket(
PORT);
23 System.out.println(
"Tic-Tac-Toe Server is Running...");
26 Socket socket = listener.accept();
28 playerX =
new PlayerHandler(socket,
'X');
29 System.out.println(
"Player X connected.");
31 playerX_Thread.start();
33 playerO =
new PlayerHandler(socket,
'O');
34 System.out.println(
"Player O connected.");
36 playerO_Thread.start();
39 PrintWriter out =
new PrintWriter(socket.getOutputStream(),
true);
40 out.println(
"SERVERFULL");
56 private synchronized static boolean makeMove(
int row,
int col,
char symbol) {
57 if (
board[row][col] ==
'\0') {
58 board[row][col] = symbol;
70 for (
int i = 0; i < 3; i++) {
73 board[i][0] !=
'\0') {
78 for (
int i = 0; i < 3; i++) {
81 board[0][i] !=
'\0') {
88 board[0][0] !=
'\0') {
93 board[0][2] !=
'\0') {
98 for (
int i = 0; i < 3 && draw; i++) {
99 for (
int j = 0; j < 3 && draw; j++) {
100 if (
board[i][j] ==
'\0') {
105 if (draw)
return 'D';
112 private static class PlayerHandler
implements Runnable {
113 private Socket socket;
115 private BufferedReader in;
116 private PrintWriter out;
117 private String playerName;
118 private boolean nameSubmitted =
false;
125 public PlayerHandler(Socket socket,
char symbol) {
126 this.socket = socket;
127 this.symbol = symbol;
137 in =
new BufferedReader(
138 new InputStreamReader(socket.getInputStream()));
139 out =
new PrintWriter(socket.getOutputStream(),
true);
142 out.println(
"SUBMITNAME");
143 playerName = in.readLine();
144 if (playerName ==
null || playerName.trim().isEmpty()) {
145 out.println(
"INVALIDNAME");
149 nameSubmitted =
true;
150 out.println(
"NAMEACCEPTED " + playerName);
151 System.out.println(
"Player " + symbol +
": " + playerName +
" has joined.");
161 while ((command = in.readLine()) !=
null) {
162 if (command.startsWith(
"MOVE")) {
163 String[] parts = command.split(
" ");
164 if (parts.length != 3) {
165 out.println(
"INVALID");
170 row = Integer.parseInt(parts[1]);
171 col = Integer.parseInt(parts[2]);
172 }
catch (NumberFormatException e) {
173 out.println(
"INVALID");
177 if ((symbol ==
'X' &&
this ==
playerX) ||
178 (symbol ==
'O' &&
this ==
playerO)) {
179 boolean valid =
makeMove(row, col, symbol);
181 broadcast(
"MOVE " + symbol +
" " + row +
" " + col);
183 if (result == symbol) {
184 out.println(
"VICTORY");
185 getOpponent().out.println(
"DEFEAT");
187 }
else if (result ==
'D') {
192 getOpponent().out.println(
"YOURMOVE");
193 this.out.println(
"WAIT");
196 out.println(
"INVALID");
200 }
else if (command.startsWith(
"RESET")) {
208 }
catch (IOException e) {
209 System.out.println(
"Error handling player " + symbol +
": " + e);
211 try { socket.close(); }
catch (IOException e) {}
213 if (symbol ==
'X')
playerX =
null;
216 broadcast(
"OTHERLEFT");
226 private void initializeGame() {
227 broadcast(
"GAMESTART " +
playerX.playerName +
" " +
playerO.playerName);
228 playerX.out.println(
"YOURMOVE");
230 System.out.println(
"Game started between " +
playerX.playerName +
" (X) and " +
playerO.playerName +
" (O).");
236 private void resetGame() {
237 board =
new char[3][3];
241 playerX.out.println(
"YOURMOVE");
243 System.out.println(
"Game has been reset.");
250 private PlayerHandler getOpponent() {
258 private void broadcast(String message) {