📄 gameclient.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.io.*;
import java.net.*;
public class GameClient extends JApplet
implements Runnable, ActionListener, GameConstants
{
private boolean myTurn = false;
private char myToken = ' ';
private char otherToken = ' ';
private Cell[][] cell = new Cell[20][20];
JPanel p = new JPanel();
private JLabel jlblTitle = new JLabel();
private JLabel jlblStatus = new JLabel();
private JMenuBar jmb = new JMenuBar();
private JMenu jmOp = new JMenu("Operation");
private JMenuItem jmiStart = new JMenuItem("Start");
private JMenuItem jmiExit = new JMenuItem("Exit");
private int rowSelected;
private int columnSelected;
Socket connectToServer;
private DataInputStream isFromServer;
private DataOutputStream osToServer;
private boolean continueToPlay = true;
private boolean waiting = true;
public static void main(String args[])
{
JFrame frame = new JFrame("GameClient");
GameClient applet = new GameClient();
frame.getContentPane().add(applet);
applet.init();
applet.start();
frame.setSize(320, 360);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void init()
{
p.setLayout(new GridLayout(20, 20, 0, 0));
for (int i=0; i<20; i++)
for (int j=0; j<20; j++)
p.add(cell[i][j] = new Cell(i, j));
jlblTitle.setHorizontalAlignment(JLabel.CENTER);
jmb.add(jmOp);
jmOp.add(jmiStart);
jmOp.add(jmiExit);
jmiStart.addActionListener(this);
jmiExit.addActionListener(this);
this.setJMenuBar(jmb);
this.getContentPane().add(jlblTitle, BorderLayout.NORTH);
this.getContentPane().add(p, BorderLayout.CENTER);
this.getContentPane().add(jlblStatus, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e)
{
String command = e.getActionCommand();
if ("Start".equals(command))
{
connectToServer();
jmiStart.setEnabled(false);
continueToPlay = true;
for (int i=0; i<20; i++)
for (int j=0; j<20; j++)
cell[i][j].setToken(' ');
}
else if ("Exit".equals(command))
{
try
{
osToServer.writeInt(STOP);
System.exit(0);
}
catch(Exception er)
{
System.err.println(er);
System.exit(0);
}
}
}
//connectToServer()
private void connectToServer()
{
try
{
connectToServer = new Socket("localhost", GAMEPORT);
isFromServer = new DataInputStream(connectToServer.getInputStream());
osToServer = new DataOutputStream(connectToServer.getOutputStream());
}
catch (Exception e)
{
System.err.println(e);
}
Thread thread = new Thread(this);
thread.start();
}
//run()
public void run()
{
try
{
int player = isFromServer.readInt();
if (player == PLAYER1)
{
myToken = 'X';
otherToken = 'O';
jlblTitle.setText("Player 1 ---> 'X'");
jlblStatus.setText("Waiting for player 2 to join");
isFromServer.readInt();
jlblStatus.setText("Player 2 has joined. You start first");
myTurn = true;
}
else if (player == PLAYER2)
{
myToken = 'O';
otherToken = 'X';
jlblTitle.setText("Player 2 ---> 'O'");
jlblStatus.setText("Waiting for player 1 to move");
}
while (continueToPlay)
{
if (player == PLAYER1)
{
waitPlayer();
sendMove();
receiveInfo();
}
else if (player == PLAYER2)
{
receiveInfo();
waitPlayer();
sendMove();
}
}//end while
}
catch (Exception e)
{
System.err.println(e);
}
}
// waitPlayer()
private void waitPlayer() throws InterruptedException
{
while (waiting)
{
Thread.sleep(100);
}
waiting = true;
}
// sendMove()
private void sendMove() throws IOException
{
osToServer.writeInt(rowSelected);
osToServer.writeInt(columnSelected);
}
// Receive info from the server
private void receiveInfo() throws IOException
{
int status = isFromServer.readInt();
if (status == STOP)
{
continueToPlay = false;
jmiStart.setEnabled(true);
jmiExit.setEnabled(true);
jlblStatus.setText("Game stopped,please restart!");
connectToServer.close();
}
if (status == PLAYER1_WON)
{
continueToPlay = false;
jmiStart.setEnabled(true);
jmiExit.setEnabled(true);
if (myToken == 'X')
{
jlblStatus.setText("You won! (X)");
}
else if (myToken == 'O')
{
receiveMove();
jlblStatus.setText("Player 1 (X) has won!");
}
}
else if (status == PLAYER2_WON)
{
continueToPlay = false;
jmiStart.setEnabled(true);
jmiExit.setEnabled(true);
if (myToken == 'O')
{
jlblStatus.setText("You won! (O)");
}
else if (myToken == 'X')
{
receiveMove();
jlblStatus.setText("Player 2 (O) has won!");
}
}
else if (status == DRAW)
{
continueToPlay = false;
jmiStart.setEnabled(true);
jmiExit.setEnabled(true);
if (myToken == 'O')
{
receiveMove();
}
jlblStatus.setText("Game is over!");
}
else
{
jmiExit.setEnabled(true);
receiveMove();
jlblStatus.setText("Your turn");
myTurn = true;
}
}
//receiveMove()
private void receiveMove() throws IOException
{
int row = isFromServer.readInt();
int column = isFromServer.readInt();
cell[row][column].setToken(otherToken);
}
//class Cell
public class Cell extends JPanel implements MouseListener
{
private int row;
private int column;
private char token = ' ';
public Cell(int row, int column)
{
this.row = row;
this.column = column;
setBorder(new LineBorder(Color.black, 1));
addMouseListener(this);
}
//getToken()
public char getToken()
{
return token;
}
//setToken()
public void setToken(char c)
{
token = c;
repaint();
}
//paintComponent()
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (token == 'X')
{
g.drawLine(0, 0, getSize().width, getSize().height);
g.drawLine(getSize().width, 0, 0, getSize().height);
}
else if (token == 'O')
{
g.setColor(Color.black);
g.fillOval(0, 0, getSize().width, getSize().height);
}
}
//implement mouseClicked()
public void mouseClicked(MouseEvent e)
{
if ((token == ' ') && myTurn)
{
setToken(myToken);
myTurn = false;
rowSelected = row;
columnSelected = column;
jlblStatus.setText("Waiting for the other player to move");
waiting = false;
jmiExit.setEnabled(false);
}
}
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mousePressed(MouseEvent e){}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -