📄 gameserver.java
字号:
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.util.Date;
public class GameServer extends JFrame
implements GameConstants
{
//main()
public static void main(String args[])
{
GameServer frame = new GameServer();
}
//Construct GameServer()
public GameServer()
{
JTextArea jtaLog = new JTextArea();
JScrollPane scrollPane = new JScrollPane(jtaLog);
getContentPane().add(scrollPane, BorderLayout.CENTER);
setSize(300, 250);
setTitle("GameServer");
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try
{
ServerSocket serverSocket = new ServerSocket(GAMEPORT);
jtaLog.append(new Date() + ": Server started at port " + GAMEPORT + '\n');
int gameNo = 1;
while(true)
{
jtaLog.append(new Date() + ": Waiting for players to join game " + gameNo + '\n');
// Connect to player1
Socket player1 = serverSocket.accept();
jtaLog.append(new Date() + ": Player 1 joined game " + gameNo + '\n');
jtaLog.append("Player 1's IP address" + player1.getInetAddress().getHostAddress() + '\n');
new DataOutputStream(player1.getOutputStream()).writeInt(PLAYER1);
// Conncet to player2
Socket player2 = serverSocket.accept();
jtaLog.append(new Date() + ": Player 2 joined game " + gameNo + '\n');
jtaLog.append("Player 2's IP address" + player2.getInetAddress().getHostAddress() + '\n');
new DataOutputStream(player2.getOutputStream()).writeInt(PLAYER2);
// Start a thread
jtaLog.append(new Date() + ": Start a Thread for Game " + gameNo++ + '\n');
HandleGame thread = new HandleGame(player1, player2);
thread.start();
}//end while
}
catch(IOException e)
{
System.err.println(e);
}
}
}
class HandleGame extends Thread
implements GameConstants
{
private Socket player1;
private Socket player2;
private char[][] cell = new char[30][30];
private DataInputStream isFromPlayer1;
private DataOutputStream osToPlayer1;
private DataInputStream isFromPlayer2;
private DataOutputStream osToPlayer2;
public HandleGame(Socket player1, Socket player2)
{
this.player1 = player1;
this.player2 = player2;
for (int i=0; i<30; i++)
for (int j=0; j<30; j++)
cell[i][j] = ' ';
}
public void run()
{
try
{
DataInputStream isFromPlayer1 = new DataInputStream(player1.getInputStream());
DataOutputStream osToPlayer1 = new DataOutputStream(player1.getOutputStream());
DataInputStream isFromPlayer2 = new DataInputStream(player2.getInputStream());
DataOutputStream osToPlayer2 = new DataOutputStream(player2.getOutputStream());
// Send to Start
osToPlayer1.writeInt(1);
while(true)
{
//player 1
int row = isFromPlayer1.readInt();
if(row == STOP)
{
osToPlayer2.writeInt(STOP);
osToPlayer1.writeInt(STOP);
break;
}
int column = isFromPlayer1.readInt();
cell[row + 5][column + 5] = 'X';
if (isWon(row + 5,column + 5,'X'))
{
osToPlayer1.writeInt(PLAYER1_WON);
osToPlayer2.writeInt(PLAYER1_WON);
sendMove(osToPlayer2, row, column);
break;
}
else if (isFull())
{
osToPlayer1.writeInt(DRAW);
osToPlayer2.writeInt(DRAW);
sendMove(osToPlayer2, row, column);
break;
}
else
{
osToPlayer2.writeInt(CONTINUE);
sendMove(osToPlayer2, row, column);
}
//Player 2
row = isFromPlayer2.readInt();
if(row == STOP)
{
osToPlayer1.writeInt(STOP);
osToPlayer2.writeInt(STOP);
break;
}
column = isFromPlayer2.readInt();
cell[row + 5][column + 5] = 'O';
if (isWon(row + 5,column + 5,'O'))
{
osToPlayer1.writeInt(PLAYER2_WON);
osToPlayer2.writeInt(PLAYER2_WON);
sendMove(osToPlayer1, row, column);
break;
}
else
{
osToPlayer1.writeInt(CONTINUE);
sendMove(osToPlayer1, row, column);
}
}//end while
}
catch(IOException e)
{
System.err.println(e);
}
}
// Send message
private void sendMove(DataOutputStream out, int row, int column)
throws IOException
{
out.writeInt(row);
out.writeInt(column);
}
// isFull()
private boolean isFull()
{
for (int i=5; i<25; i++)
for (int j=5; j<25; j++)
if (cell[i][j] == ' ')
return false;
return true;
}
// isWon()
private boolean isWon(int row,int column,char token)
{
for (int i=0; i<5; i++)
if ((cell[row][column+i] == token) && (cell[row][column+i-1] == token) && (cell[row][column+i-2] == token) && (cell[row][column+i-3] == token) &&(cell[row][column+i-4] == token))
return true;
for (int i=0; i<5; i++)
if ((cell[row+i][column] == token) && (cell[row+i-1][column] == token) && (cell[row+i-2][column] == token) && (cell[row+i-3][column] == token) && (cell[row+i-4][column] == token))
return true;
for (int i=0; i<5; i++)
if ((cell[row+i][column+i] == token) && (cell[row+i-1][column+i-1] == token) && (cell[row+i-2][column+i-2] == token) && (cell[row+i-3][column+i-3] == token) && (cell[row+i-4][column+i-4] == token))
return true;
for (int i=0; i<5; i++)
if ((cell[row+i][column-i] == token) && (cell[row+i-1][column-i+1] == token) && (cell[row+i-2][column-i+2] == token) && (cell[row+i-3][column-i+3] == token) && (cell[row+i-4][column-i+4] == token))
return true;
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -