本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下

需求分析:

对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能:

1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈

2.服务器支持多组用户同时进行对弈

3.用户可以在服务器上创建新游戏或加入已创建的游戏

4.用户在下棋的时候可以进行聊天交流

由上可以知道需要实现的功能:

·提供服务器和客户端的功能

·服务器将监听客户端的登录情况并允许多个客户端进行登录

·用户通过客户端可以登录服务器,之后可以看到服务器当前在线的其他用户,并与他们进行聊天等

·用户登录服务器后,可以创建新的五子棋游戏或加入已创建的五子棋游戏

·用户通过客户端可以像普通五子棋那样与其他用户对弈

根据功能将网络五子棋分为4个模块:即用户面板模块、棋盘面板模块、五子棋服务器模块、五子棋客户端模块

下面我们开始进行编译用户面板模块:

1.开发用户列表面板

import java.awt.*;

/**

* Created by Administrator on 2016/11/21.

*/

//初始状态下将添加10个名称为“无用户“的信息到列表中,说明服务器最多支持10个用户同时在线

//该列表被添加到面板中,使用“BorderLayout”布局格式

public class UserListPad extends Panel{

public List userList=new List(10);

public UserListPad(){

setLayout(new BorderLayout());

for(int i=0;i<10;i++){

userList.add(i+"."+"无用户");

}

add(userList,BorderLayout.CENTER);

}

}

2.开发用户聊天面板

import javax.swing.*;

import java.awt.*;

/**

* Created by Administrator on 2016/11/21.

*/

//聊天面板为一个TextArea视图控件,拥有一个垂直方向的滚动条。

//该TextArea被添加到面板中,使用“BorderLayout”布局格式。

public class UserChatPad extends JPanel{

public JTextArea chatTextArea=new JTextArea("命令区域",18,20);

public UserChatPad(){

setLayout(new BorderLayout());

chatTextArea.setAutoscrolls(true);

chatTextArea.setLineWrap(true);

add(chatTextArea,BorderLayout.CENTER);

}

}

3.开发用户输入面板

import javax.swing.*;

import java.awt.*;

/**

* Created by Administrator on 2016/11/21.

*/

//面板包含两个视图控件

//contentInpitted为TextField控件,用户可以在其中输入聊天信息

public class UserInputPad extends JPanel{

public JTextField contentInputted = new JTextField("",26);

public JComboBox userChoice = new JComboBox();

public UserInputPad(){

setLayout(new FlowLayout(FlowLayout.LEFT));

for(int i=0;i<50;i++){

userChoice.addItem(i+"."+"无用户");

}

userChoice.setSize(60,24);

add(userChoice);

add(contentInputted);

}

}

4.开发用户操作面板

import javax.swing.*;

import java.awt.*;

/**

* Created by Administrator on 2016/11/21.

*/

public class UserControlPad extends JPanel {

public JLabel ipLabel = new JLabel("IP",JLabel.LEFT);

public JTextField ipInputted = new JTextField("localhost",10);

public JButton connectButton = new JButton("连接到服务器");

public JButton createButton = new JButton("创建游戏");

public JButton joinButton = new JButton("加入游戏");

public JButton cancelButton = new JButton("放弃游戏");

public JButton exitButton = new JButton("退出游戏");

public UserControlPad(){

setLayout(new FlowLayout(FlowLayout.LEFT));

setBackground(Color.LIGHT_GRAY);

add(ipLabel);

add(ipInputted);

add(connectButton);

add(createButton);

add(joinButton);

add(cancelButton);

add(exitButton);

}

}

下面开始开发棋盘面板模块

1.开发黑棋类

import java.awt.*;

/**

* Created by Administrator on 2016/11/21.

*/

public class FIRPointBlack extends Canvas {

FIRPad padBelonged; // 黑棋所属的棋盘

public FIRPointBlack(FIRPad padBelonged)

{

setSize(20, 20); // 设置棋子大小

this.padBelonged = padBelonged;

}

public void paint(Graphics g)

{ // 画棋子

g.setColor(Color.black);

g.fillOval(0, 0, 14, 14);

}

}

2.开发白棋类

import java.awt.*;

/**

* Created by Administrator on 2016/11/21.

*/

public class FIRPointWhite extends Canvas{

FIRPad padBelonged; // 白棋所属的棋盘

public FIRPointWhite(FIRPad padBelonged)

{

setSize(20, 20);

this.padBelonged = padBelonged;

}

public void paint(Graphics g)

{ // 画棋子

g.setColor(Color.white);

g.fillOval(0, 0, 14, 14);

}

}

3.开发棋盘面板

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.net.*;

import javax.swing.JTextField;

/**

* Created by Administrator on 2016/11/21.

*/

public class FIRPad extends Panel implements MouseListener,ActionListener{

// 鼠标是否能使用

public boolean isMouseEnabled = false;

// 是否胜利

public boolean isWinned = false;

// 是否在下棋中

public boolean isGaming = false;

// 棋子的x轴坐标位

public int chessX_POS = -1;

// 棋子的y轴坐标位

public int chessY_POS = -1;

// 棋子的颜色

public int chessColor = 1;

// 黑棋x轴坐标位数组

public int chessBlack_XPOS[] = new int[200];

// 黑棋y轴坐标位数组

public int chessBlack_YPOS[] = new int[200];

// 白棋x轴坐标位数组

public int chessWhite_XPOS[] = new int[200];

// 白棋y轴坐标位数组

public int chessWhite_YPOS[] = new int[200];

// 黑棋数量

public int chessBlackCount = 0;

// 白棋数量

public int chessWhiteCount = 0;

// 黑棋获胜次数

public int chessBlackVicTimes = 0;

// 白棋获胜次数

public int chessWhiteVicTimes = 0;

// 套接口

public Socket chessSocket;

public DataInputStream inputData;

public DataOutputStream outputData;

public String chessSelfName = null;

public String chessPeerName = null;

public String host = null;

public int port = 4331;

public TextField statusText = new TextField("请连接服务器!");

public FIRThread firThread = new FIRThread(this);

public FIRPad()

{

setSize(440, 440);

setLayout(null);

setBackground(Color.LIGHT_GRAY);

addMouseListener(this);

add(statusText);

statusText.setBounds(new Rectangle(40, 5, 360, 24));

statusText.setEditable(false);

}

// 连接到主机

public boolean connectServer(String ServerIP, int ServerPort) throws Exception

{

try

{

// 取得主机端口

chessSocket = new Socket(ServerIP, ServerPort);

// 取得输入流

inputData = new DataInputStream(chessSocket.getInputStream());

// 取得输出流

outputData = new DataOutputStream(chessSocket.getOutputStream());

firThread.start();

return true;

}

catch (IOException ex)

{

statusText.setText("连接失败! \n");

}

return false;

}

// 设定胜利时的棋盘状态

public void setVicStatus(int vicChessColor)

{

// 清空棋盘

this.removeAll();

// 将黑棋的位置设置到零点

for (int i = 0; i <= chessBlackCount; i++)

{

chessBlack_XPOS[i] = 0;

chessBlack_YPOS[i] = 0;

}

// 将白棋的位置设置到零点

for (int i = 0; i <= chessWhiteCount; i++)

{

chessWhite_XPOS[i] = 0;

chessWhite_YPOS[i] = 0;

}

// 清空棋盘上的黑棋数

chessBlackCount = 0;

// 清空棋盘上的白棋数

chessWhiteCount = 0;

add(statusText);

statusText.setBounds(40, 5, 360, 24);

if (vicChessColor == 1)

{ // 黑棋胜

chessBlackVicTimes++;

statusText.setText("黑方胜,黑:白 " + chessBlackVicTimes + ":" + chessWhiteVicTimes

+ ",游戏重启,等待白方...");

}

else if (vicChessColor == -1)

{ // 白棋胜

chessWhiteVicTimes++;

statusText.setText("白方胜,黑:白 " + chessBlackVicTimes + ":" + chessWhiteVicTimes

+ ",游戏重启,等待黑方...");

}

}

// 取得指定棋子的位置

public void setLocation(int xPos, int yPos, int chessColor)

{

if (chessColor == 1)

{ // 棋子为黑棋时

chessBlack_XPOS[chessBlackCount] = xPos * 20;

chessBlack_YPOS[chessBlackCount] = yPos * 20;

chessBlackCount++;

}

else if (chessColor == -1)

{ // 棋子为白棋时

chessWhite_XPOS[chessWhiteCount] = xPos * 20;

chessWhite_YPOS[chessWhiteCount] = yPos * 20;

chessWhiteCount++;

}

}

// 判断当前状态是否为胜利状态

public boolean checkVicStatus(int xPos, int yPos, int chessColor)

{

int chessLinkedCount = 1; // 连接棋子数

int chessLinkedCompare = 1; // 用于比较是否要继续遍历一个棋子的相邻网格

int chessToCompareIndex = 0; // 要比较的棋子在数组中的索引位置

int closeGrid = 1; // 相邻网格的位置

if (chessColor == 1)

{ // 黑棋时

chessLinkedCount = 1; // 将该棋子自身算入的话,初始连接数为1

//以下每对for循环语句为一组,因为下期的位置能位于中间而非两端

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{ // 遍历相邻4个网格

for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++)

{ // 遍历棋盘上所有黑棋子

if (((xPos + closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex])

&& ((yPos * 20) == chessBlack_YPOS[chessToCompareIndex]))

{ // 判断当前下的棋子的右边4个棋子是否都为黑棋

chessLinkedCount = chessLinkedCount + 1; // 连接数加1

if (chessLinkedCount == 5)

{ // 五子相连时,胜利

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {// 若中间有一个棋子非黑棋,则会进入此分支,此时无需再遍历

break;

}

}

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++)

{

if (((xPos - closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex])

&& (yPos * 20 == chessBlack_YPOS[chessToCompareIndex]))

{ // 判断当前下的棋子的左边4个棋子是否都为黑棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

// 进入新的一组for循环时要将连接数等重置

chessLinkedCount = 1;

chessLinkedCompare = 1;

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++)

{

if ((xPos * 20 == chessBlack_XPOS[chessToCompareIndex])

&& ((yPos + closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex]))

{ // 判断当前下的棋子的上边4个棋子是否都为黑棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++)

{

if ((xPos * 20 == chessBlack_XPOS[chessToCompareIndex])

&& ((yPos - closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex]))

{ // 判断当前下的棋子的下边4个棋子是否都为黑棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

chessLinkedCount = 1;

chessLinkedCompare = 1;

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++)

{

if (((xPos - closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex])

&& ((yPos + closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex]))

{ // 判断当前下的棋子的左上方向4个棋子是否都为黑棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++)

{

if (((xPos + closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex])

&& ((yPos - closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex]))

{ // 判断当前下的棋子的右下方向4个棋子是否都为黑棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

chessLinkedCount = 1;

chessLinkedCompare = 1;

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++)

{

if (((xPos + closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex])

&& ((yPos + closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex]))

{ // 判断当前下的棋子的右上方向4个棋子是否都为黑棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++)

{

if (((xPos - closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex])

&& ((yPos - closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex]))

{ // 判断当前下的棋子的左下方向4个棋子是否都为黑棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

}

else if (chessColor == -1)

{ // 白棋时

chessLinkedCount = 1;

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++)

{

if (((xPos + closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex])

&& (yPos * 20 == chessWhite_YPOS[chessToCompareIndex]))

{// 判断当前下的棋子的右边4个棋子是否都为白棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++)

{

if (((xPos - closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex])

&& (yPos * 20 == chessWhite_YPOS[chessToCompareIndex]))

{// 判断当前下的棋子的左边4个棋子是否都为白棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

chessLinkedCount = 1;

chessLinkedCompare = 1;

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++)

{

if ((xPos * 20 == chessWhite_XPOS[chessToCompareIndex])

&& ((yPos + closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex]))

{// 判断当前下的棋子的上边4个棋子是否都为白棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++)

{

if ((xPos * 20 == chessWhite_XPOS[chessToCompareIndex])

&& ((yPos - closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex]))

{// 判断当前下的棋子的下边4个棋子是否都为白棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

chessLinkedCount = 1;

chessLinkedCompare = 1;

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++)

{

if (((xPos - closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex])

&& ((yPos + closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex]))

{// 判断当前下的棋子的左上方向4个棋子是否都为白棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++)

{

if (((xPos + closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex])

&& ((yPos - closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex]))

{// 判断当前下的棋子的右下方向4个棋子是否都为白棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

chessLinkedCount = 1;

chessLinkedCompare = 1;

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++)

{

if (((xPos + closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex])

&& ((yPos + closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex]))

{// 判断当前下的棋子的右上方向4个棋子是否都为白棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return true;

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

for (closeGrid = 1; closeGrid <= 4; closeGrid++)

{

for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++)

{

if (((xPos - closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex])

&& ((yPos - closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex]))

{// 判断当前下的棋子的左下方向4个棋子是否都为白棋

chessLinkedCount++;

if (chessLinkedCount == 5)

{

return (true);

}

}

}

if (chessLinkedCount == (chessLinkedCompare + 1)) {

chessLinkedCompare++;

}

else {

break;

}

}

}

return false;

}

// 画棋盘

public void paint(Graphics g)

{

for (int i = 40; i <= 380; i = i + 20)

{

g.drawLine(40, i, 400, i);

}

g.drawLine(40, 400, 400, 400);

for (int j = 40; j <= 380; j = j + 20)

{

g.drawLine(j, 40, j, 400);

}

g.drawLine(400, 40, 400, 400);

g.fillOval(97, 97, 6, 6);

g.fillOval(337, 97, 6, 6);

g.fillOval(97, 337, 6, 6);

g.fillOval(337, 337, 6, 6);

g.fillOval(217, 217, 6, 6);

}

// 画棋子

public void paintFirPoint(int xPos, int yPos, int chessColor)

{

FIRPointBlack firPBlack = new FIRPointBlack(this);

FIRPointWhite firPWhite = new FIRPointWhite(this);

if (chessColor == 1 && isMouseEnabled)

{ // 黑棋

// 设置棋子的位置

setLocation(xPos, yPos, chessColor);

// 取得当前局面状态

isWinned = checkVicStatus(xPos, yPos, chessColor);

if (isWinned == false)

{ // 非胜利状态

firThread.sendMessage("/" + chessPeerName + " /chess "

+ xPos + " " + yPos + " " + chessColor);

this.add(firPBlack); // 将棋子添加到棋盘中

firPBlack.setBounds(xPos * 20 - 7,

yPos * 20 - 7, 16, 16); // 设置棋子边界

statusText.setText("黑(第" + chessBlackCount + "步)"

+ xPos + " " + yPos + ",轮到白方.");

isMouseEnabled = false; // 将鼠标设为不可用

}

else

{ // 胜利状态

firThread.sendMessage("/" + chessPeerName + " /chess "

+ xPos + " " + yPos + " " + chessColor);

this.add(firPBlack);

firPBlack.setBounds(xPos * 20 - 7,

yPos * 20 - 7, 16, 16);

setVicStatus(1); // 调用胜利方法,传入参数为黑棋胜利

isMouseEnabled = false;

}

}

else if (chessColor == -1 && isMouseEnabled)

{ // 白棋

setLocation(xPos, yPos, chessColor);

isWinned = checkVicStatus(xPos, yPos, chessColor);

if (isWinned == false)

{

firThread.sendMessage("/" + chessPeerName + " /chess "

+ xPos + " " + yPos + " " + chessColor);

this.add(firPWhite);

firPWhite.setBounds(xPos * 20 - 7,

yPos * 20 - 7, 16, 16);

statusText.setText("白(第" + chessWhiteCount + "步)"

+ xPos + " " + yPos + ",轮到黑方.");

isMouseEnabled = false;

}

else

{

firThread.sendMessage("/" + chessPeerName + " /chess "

+ xPos + " " + yPos + " " + chessColor);

this.add(firPWhite);

firPWhite.setBounds(xPos * 20 - 7,

yPos * 20 - 7, 16, 16);

setVicStatus(-1); // 调用胜利方法,传入参数为白棋

isMouseEnabled = false;

}

}

}

// 画网络棋盘

public void paintNetFirPoint(int xPos, int yPos, int chessColor)

{

FIRPointBlack firPBlack = new FIRPointBlack(this);

FIRPointWhite firPWhite = new FIRPointWhite(this);

setLocation(xPos, yPos, chessColor);

if (chessColor == 1)

{

isWinned = checkVicStatus(xPos, yPos, chessColor);

if (isWinned == false)

{

this.add(firPBlack);

firPBlack.setBounds(xPos * 20 - 7,

yPos * 20 - 7, 16, 16);

statusText.setText("黑(第" + chessBlackCount + "步)"

+ xPos + " " + yPos + ",轮到白方.");

isMouseEnabled = true;

}

else

{

firThread.sendMessage("/" + chessPeerName + " /victory "

+ chessColor);//djr

this.add(firPBlack);

firPBlack.setBounds(xPos * 20 - 7,

yPos * 20 - 7, 16, 16);

setVicStatus(1);

isMouseEnabled = true;

}

}

else if (chessColor == -1)

{

isWinned = checkVicStatus(xPos, yPos, chessColor);

if (isWinned == false)

{

this.add(firPWhite);

firPWhite.setBounds(xPos * 20 - 7,

yPos * 20 - 7, 16, 16);

statusText.setText("白(第" + chessWhiteCount + "步)"

+ xPos + " " + yPos + ",轮到黑方.");

isMouseEnabled = true;

}

else

{

firThread.sendMessage("/" + chessPeerName + " /victory "

+ chessColor);

this.add(firPWhite);

firPWhite.setBounds(xPos * 20 - 7,

yPos * 20 - 7, 16, 16);

setVicStatus(-1);

isMouseEnabled = true;

}

}

}

// 捕获下棋事件

public void mousePressed(MouseEvent e)

{

if (e.getModifiers() == InputEvent.BUTTON1_MASK)

{

chessX_POS = (int) e.getX();

chessY_POS = (int) e.getY();

int a = (chessX_POS + 10) / 20, b = (chessY_POS + 10) / 20;

if (chessX_POS / 20 < 2 || chessY_POS / 20 < 2

|| chessX_POS / 20 > 19 || chessY_POS / 20 > 19)

{

// 下棋位置不正确时,不执行任何操作

}

else

{

paintFirPoint(a, b, chessColor); // 画棋子

}

}

}

public void mouseReleased(MouseEvent e){}

public void mouseEntered(MouseEvent e){}

public void mouseExited(MouseEvent e){}

public void mouseClicked(MouseEvent e){}

public void actionPerformed(ActionEvent e){}

}

4.开发棋盘线程

import java.util.StringTokenizer;

import java.io.IOException;

/**

* Created by Administrator on 2016/11/21.

*/

public class FIRThread extends Thread{

FIRPad currPad; // 当前线程的棋盘

public FIRThread(FIRPad currPad)

{

this.currPad = currPad;

}

// 处理取得的信息

public void dealWithMsg(String msgReceived)

{

if (msgReceived.startsWith("/chess "))

{ // 收到的信息为下棋

StringTokenizer userMsgToken = new StringTokenizer(msgReceived, " ");

// 表示棋子信息的数组、0索引为:x坐标;1索引位:y坐标;2索引位:棋子颜色

String[] chessInfo = { "-1", "-1", "0" };

int i = 0; // 标志位

String chessInfoToken;

while (userMsgToken.hasMoreTokens())

{

chessInfoToken = (String) userMsgToken.nextToken(" ");

if (i >= 1 && i <= 3)

{

chessInfo[i - 1] = chessInfoToken;

}

i++;

}

currPad.paintNetFirPoint(Integer.parseInt(chessInfo[0]), Integer

.parseInt(chessInfo[1]), Integer.parseInt(chessInfo[2]));

}

else if (msgReceived.startsWith("/yourname "))

{ // 收到的信息为改名

currPad.chessSelfName = msgReceived.substring(10);

}

else if (msgReceived.equals("/error"))

{ // 收到的为错误信息

currPad.statusText.setText("用户不存在,请重新加入!");

}

}

// 发送信息

public void sendMessage(String sndMessage)

{

try

{

currPad.outputData.writeUTF(sndMessage);

}

catch (Exception ea)

{

ea.printStackTrace();;

}

}

public void run()

{

String msgReceived = "";

try

{

while (true)

{ // 等待信息输入

msgReceived = currPad.inputData.readUTF();

dealWithMsg(msgReceived);

}

}

catch (IOException es){}

}

}

下面开始开发服务器模块

1.开发服务器信息面板

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.Label;

import java.awt.Panel;

import java.awt.TextArea;

import javax.swing.JLabel;

/**

* Created by Administrator on 2016/11/21.

*/

public class ServerMsgPanel extends Panel {

public TextArea msgTextArea = new TextArea("", 22, 50,

TextArea.SCROLLBARS_VERTICAL_ONLY);

public JLabel statusLabel = new JLabel("当前连接数:", Label.LEFT);

public Panel msgPanel = new Panel();

public Panel statusPanel = new Panel();

public ServerMsgPanel()

{

setSize(350, 300);

setBackground(Color.LIGHT_GRAY);

setLayout(new BorderLayout());

msgPanel.setLayout(new FlowLayout());

msgPanel.setSize(210, 210);

statusPanel.setLayout(new BorderLayout());

statusPanel.setSize(210, 50);

msgPanel.add(msgTextArea);

statusPanel.add(statusLabel, BorderLayout.WEST);

add(msgPanel, BorderLayout.CENTER);

add(statusPanel, BorderLayout.NORTH);

}

}

2.开发服务器进程

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.Socket;

import java.util.Enumeration;

import java.util.Hashtable;

import java.util.StringTokenizer;

/**

* Created by Administrator on 2016/11/21.

*/

public class FIRServerThread extends Thread{

Socket clientSocket; // 保存客户端套接口信息

Hashtable clientDataHash; // 保存客户端端口与输出流对应的Hash

Hashtable clientNameHash; // 保存客户端套接口和客户名对应的Hash

Hashtable chessPeerHash; // 保存游戏创建者和游戏加入者对应的Hash

ServerMsgPanel serverMsgPanel;

boolean isClientClosed = false;

public FIRServerThread(Socket clientSocket, Hashtable clientDataHash,

Hashtable clientNameHash, Hashtable chessPeerHash,

ServerMsgPanel server)

{

this.clientSocket = clientSocket;

this.clientDataHash = clientDataHash;

this.clientNameHash = clientNameHash;

this.chessPeerHash = chessPeerHash;

this.serverMsgPanel = server;

}

public void dealWithMsg(String msgReceived)

{

String clientName;

String peerName;

if (msgReceived.startsWith("/"))

{

if (msgReceived.equals("/list"))

{ // 收到的信息为更新用户列表

Feedback(getUserList());

}

else if (msgReceived.startsWith("/creatgame [inchess]"))

{ // 收到的信息为创建游戏

String gameCreaterName = msgReceived.substring(20); //取得服务器名

synchronized (clientNameHash)

{ // 将用户端口放到用户列表中

clientNameHash.put(clientSocket, msgReceived.substring(11));

}

synchronized (chessPeerHash)

{ // 将主机设置为等待状态

chessPeerHash.put(gameCreaterName, "wait");

}

Feedback("/yourname " + clientNameHash.get(clientSocket));

sendGamePeerMsg(gameCreaterName, "/OK");

sendPublicMsg(getUserList());

}

else if (msgReceived.startsWith("/joingame "))

{ // 收到的信息为加入游戏时

StringTokenizer userTokens = new StringTokenizer(msgReceived, " ");

String userToken;

String gameCreatorName;

String gamePaticipantName;

String[] playerNames = { "0", "0" };

int nameIndex = 0;

while (userTokens.hasMoreTokens())

{

userToken = (String) userTokens.nextToken(" ");

if (nameIndex >= 1 && nameIndex <= 2)

{

playerNames[nameIndex - 1] = userToken; // 取得游戏者命

}

nameIndex++;

}

gameCreatorName = playerNames[0];

gamePaticipantName = playerNames[1];

if (chessPeerHash.containsKey(gameCreatorName)

&& chessPeerHash.get(gameCreatorName).equals("wait"))

{ // 游戏已创建

synchronized (clientNameHash)

{ // 增加游戏加入者的套接口与名称的对应

clientNameHash.put(clientSocket,

("[inchess]" + gamePaticipantName));

}

synchronized (chessPeerHash)

{ // 增加或修改游戏创建者与游戏加入者的名称的对应

chessPeerHash.put(gameCreatorName, gamePaticipantName);

}

sendPublicMsg(getUserList());

// 发送信息给游戏加入者

sendGamePeerMsg(gamePaticipantName,

("/peer " + "[inchess]" + gameCreatorName));

// 发送游戏给游戏创建者

sendGamePeerMsg(gameCreatorName,

("/peer " + "[inchess]" + gamePaticipantName));

}

else

{ // 若游戏未创建则拒绝加入游戏

sendGamePeerMsg(gamePaticipantName, "/reject");

try

{

closeClient();

}

catch (Exception ez)

{

ez.printStackTrace();

}

}

}

else if (msgReceived.startsWith("/[inchess]"))

{ // 收到的信息为游戏中时

int firstLocation = 0, lastLocation;

lastLocation = msgReceived.indexOf(" ", 0);

peerName = msgReceived.substring((firstLocation + 1), lastLocation);

msgReceived = msgReceived.substring((lastLocation + 1));

if (sendGamePeerMsg(peerName, msgReceived))

{

Feedback("/error");

}

}

else if (msgReceived.startsWith("/giveup "))

{ // 收到的信息为放弃游戏时

String chessClientName = msgReceived.substring(8);

if (chessPeerHash.containsKey(chessClientName)

&& !((String) chessPeerHash.get(chessClientName))

.equals("wait"))

{ // 胜利方为游戏加入者,发送胜利信息

sendGamePeerMsg((String) chessPeerHash.get(chessClientName),

"/youwin");

synchronized (chessPeerHash)

{ // 删除退出游戏的用户

chessPeerHash.remove(chessClientName);

}

}

if (chessPeerHash.containsValue(chessClientName))

{ // 胜利方为游戏创建者,发送胜利信息

sendGamePeerMsg((String) getHashKey(chessPeerHash,

chessClientName), "/youwin");

synchronized (chessPeerHash)

{// 删除退出游戏的用户

chessPeerHash.remove((String) getHashKey(chessPeerHash,

chessClientName));

}

}

}

else

{ // 收到的信息为其它信息时

int lastLocation = msgReceived.indexOf(" ", 0);

if (lastLocation == -1)

{

Feedback("无效命令");

return;

}

}

}

else

{

msgReceived = clientNameHash.get(clientSocket) + ">" + msgReceived;

serverMsgPanel.msgTextArea.append(msgReceived + "\n");

sendPublicMsg(msgReceived);

serverMsgPanel.msgTextArea.setCaretPosition(serverMsgPanel.msgTextArea.getText()

.length());

}

}

// 发送公开信息

public void sendPublicMsg(String publicMsg)

{

synchronized (clientDataHash)

{

for (Enumeration enu = clientDataHash.elements(); enu

.hasMoreElements();)

{

DataOutputStream outputData = (DataOutputStream) enu.nextElement();

try

{

outputData.writeUTF(publicMsg);

}

catch (IOException es)

{

es.printStackTrace();

}

}

}

}

// 发送信息给指定的游戏中的用户

public boolean sendGamePeerMsg(String gamePeerTarget, String gamePeerMsg)

{

for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();)

{ // 遍历以取得游戏中的用户的套接口

Socket userClient = (Socket) enu.nextElement();

if (gamePeerTarget.equals((String) clientNameHash.get(userClient))

&& !gamePeerTarget.equals((String) clientNameHash

.get(clientSocket)))

{ // 找到要发送信息的用户时

synchronized (clientDataHash)

{

// 建立输出流

DataOutputStream peerOutData = (DataOutputStream) clientDataHash

.get(userClient);

try

{

// 发送信息

peerOutData.writeUTF(gamePeerMsg);

}

catch (IOException es)

{

es.printStackTrace();

}

}

return false;

}

}

return true;

}

// 发送反馈信息给连接到主机的人

public void Feedback(String feedBackMsg)

{

synchronized (clientDataHash)

{

DataOutputStream outputData = (DataOutputStream) clientDataHash

.get(clientSocket);

try

{

outputData.writeUTF(feedBackMsg);

}

catch (Exception eb)

{

eb.printStackTrace();

}

}

}

// 取得用户列表

public String getUserList()

{

String userList = "/userlist";

for (Enumeration enu = clientNameHash.elements(); enu.hasMoreElements();)

{

userList = userList + " " + (String) enu.nextElement();

}

return userList;

}

// 根据value值从Hashtable中取得相应的key

public Object getHashKey(Hashtable targetHash, Object hashValue)

{

Object hashKey;

for (Enumeration enu = targetHash.keys(); enu.hasMoreElements();)

{

hashKey = (Object) enu.nextElement();

if (hashValue.equals((Object) targetHash.get(hashKey)))

return hashKey;

}

return null;

}

// 刚连接到主机时执行的方法

public void sendInitMsg()

{

sendPublicMsg(getUserList());

Feedback("/yourname " + (String) clientNameHash.get(clientSocket));

Feedback("Java 五子棋客户端");

Feedback("/list --更新用户列表");

Feedback("/ --私聊");

Feedback("注意:命令必须对所有用户发送");

}

public void closeClient()

{

serverMsgPanel.msgTextArea.append("用户断开连接:" + clientSocket + "\n");

synchronized (chessPeerHash)

{ //如果是游戏客户端主机

if (chessPeerHash.containsKey(clientNameHash.get(clientSocket)))

{

chessPeerHash.remove((String) clientNameHash.get(clientSocket));

}

if (chessPeerHash.containsValue(clientNameHash.get(clientSocket)))

{

chessPeerHash.put((String) getHashKey(chessPeerHash,

(String) clientNameHash.get(clientSocket)),

"tobeclosed");

}

}

synchronized (clientDataHash)

{ // 删除客户数据

clientDataHash.remove(clientSocket);

}

synchronized (clientNameHash)

{ // 删除客户数据

clientNameHash.remove(clientSocket);

}

sendPublicMsg(getUserList());

serverMsgPanel.statusLabel.setText("当前连接数:" + clientDataHash.size());

try

{

clientSocket.close();

}

catch (IOException exx)

{

exx.printStackTrace();

}

isClientClosed = true;

}

public void run()

{

DataInputStream inputData;

synchronized (clientDataHash)

{

serverMsgPanel.statusLabel.setText("当前连接数:" + clientDataHash.size());

}

try

{ // 等待连接到主机的信息

inputData = new DataInputStream(clientSocket.getInputStream());

sendInitMsg();

while (true)

{

String message = inputData.readUTF();

dealWithMsg(message);

}

}

catch (IOException esx){}

finally

{

if (!isClientClosed)

{

closeClient();

}

}

}

}

3.开发服务器端

import java.io.*;

import java.net.*;

import java.awt.*;

import java.util.*;

import java.awt.event.*;

import javax.swing.JButton;

/**

* Created by Administrator on 2016/11/21.

*/

public class FIRServer extends Frame implements ActionListener{

JButton clearMsgButton = new JButton("清空列表");

JButton serverStatusButton = new JButton("服务器状态");

JButton closeServerButton = new JButton("关闭服务器");

Panel buttonPanel = new Panel();

ServerMsgPanel serverMsgPanel = new ServerMsgPanel();

ServerSocket serverSocket;

Hashtable clientDataHash = new Hashtable(50); //将客户端套接口和输出流绑定

Hashtable clientNameHash = new Hashtable(50); //将客户端套接口和客户名绑定

Hashtable chessPeerHash = new Hashtable(50); //将游戏创建者和游戏加入者绑定

public FIRServer()

{

super("Java 五子棋服务器");

setBackground(Color.LIGHT_GRAY);

buttonPanel.setLayout(new FlowLayout());

clearMsgButton.setSize(60, 25);

buttonPanel.add(clearMsgButton);

clearMsgButton.addActionListener(this);

serverStatusButton.setSize(75, 25);

buttonPanel.add(serverStatusButton);

serverStatusButton.addActionListener(this);

closeServerButton.setSize(75, 25);

buttonPanel.add(closeServerButton);

closeServerButton.addActionListener(this);

add(serverMsgPanel, BorderLayout.CENTER);

add(buttonPanel, BorderLayout.SOUTH);

addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

});

pack();

setVisible(true);

setSize(400, 300);

setResizable(false);

validate();

try

{

createServer(4331, serverMsgPanel);

}

catch (Exception e)

{

e.printStackTrace();

}

}

// 用指定端口和面板创建服务器

public void createServer(int port, ServerMsgPanel serverMsgPanel) throws IOException

{

Socket clientSocket; // 客户端套接口

long clientAccessNumber = 1; // 连接到主机的客户数量

this.serverMsgPanel = serverMsgPanel; // 设定当前主机

try

{

serverSocket = new ServerSocket(port);

serverMsgPanel.msgTextArea.setText("服务器启动于:"

+ InetAddress.getLocalHost() + ":" //djr

+ serverSocket.getLocalPort() + "\n");

while (true)

{

// 监听客户端套接口的信息

clientSocket = serverSocket.accept();

serverMsgPanel.msgTextArea.append("已连接用户:" + clientSocket + "\n");

// 建立客户端输出流

DataOutputStream outputData = new DataOutputStream(clientSocket

.getOutputStream());

// 将客户端套接口和输出流绑定

clientDataHash.put(clientSocket, outputData);

// 将客户端套接口和客户名绑定

clientNameHash

.put(clientSocket, ("新玩家" + clientAccessNumber++));

// 创建并运行服务器端线程

FIRServerThread thread = new FIRServerThread(clientSocket,

clientDataHash, clientNameHash, chessPeerHash, serverMsgPanel);

thread.start();

}

}

catch (IOException ex)

{

ex.printStackTrace();

}

}

public void actionPerformed(ActionEvent e)

{

if (e.getSource() == clearMsgButton)

{ // 清空服务器信息

serverMsgPanel.msgTextArea.setText("");

}

if (e.getSource() == serverStatusButton)

{ // 显示服务器信息

try

{

serverMsgPanel.msgTextArea.append("服务器信息:"

+ InetAddress.getLocalHost() + ":"

+ serverSocket.getLocalPort() + "\n");

}

catch (Exception ee)

{

ee.printStackTrace();

}

}

if (e.getSource() == closeServerButton)

{ // 关闭服务器

System.exit(0);

}

}

public static void main(String args[])

{

FIRServer firServer = new FIRServer();

}

}

下面开始编写客户端模块

1.开发客户端

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.net.*;

import javax.swing.JFrame;

import djr.chess.gui.UserChatPad;

import djr.chess.gui.UserControlPad;

import djr.chess.gui.UserInputPad;

import djr.chess.gui.UserListPad;

import djr.chess.pad.FIRPad;

/**

* Created by Administrator on 2016/11/21.

*/

public class FIRClient extends Frame implements ActionListener,KeyListener {

// 客户端套接口

Socket clientSocket;

// 数据输入流

DataInputStream inputStream;

// 数据输出流

DataOutputStream outputStream;

// 用户名

String chessClientName = null;

// 主机地址

String host = null;

// 主机端口

int port = 4331;

// 是否在聊天

boolean isOnChat = false;

// 是否在下棋

boolean isOnChess = false;

// 游戏是否进行中

boolean isGameConnected = false;

// 是否为游戏创建者

boolean isCreator = false;

// 是否为游戏加入者

boolean isParticipant = false;

// 用户列表区

UserListPad userListPad = new UserListPad();

// 用户聊天区

UserChatPad userChatPad = new UserChatPad();

// 用户操作区

UserControlPad userControlPad = new UserControlPad();

// 用户输入区

UserInputPad userInputPad = new UserInputPad();

// 下棋区

FIRPad firPad = new FIRPad();

// 面板区

Panel southPanel = new Panel();

Panel northPanel = new Panel();

Panel centerPanel = new Panel();

Panel eastPanel = new Panel();

// 构造方法,创建界面

public FIRClient()

{

super("Java 五子棋客户端");

setLayout(new BorderLayout());

host = userControlPad.ipInputted.getText();

eastPanel.setLayout(new BorderLayout());

eastPanel.add(userListPad, BorderLayout.NORTH);

eastPanel.add(userChatPad, BorderLayout.CENTER);

eastPanel.setBackground(Color.LIGHT_GRAY);

userInputPad.contentInputted.addKeyListener(this);

firPad.host = userControlPad.ipInputted.getText();

centerPanel.add(firPad, BorderLayout.CENTER);

centerPanel.add(userInputPad, BorderLayout.SOUTH);

centerPanel.setBackground(Color.LIGHT_GRAY);

userControlPad.connectButton.addActionListener(this);

userControlPad.createButton.addActionListener(this);

userControlPad.joinButton.addActionListener(this);

userControlPad.cancelButton.addActionListener(this);

userControlPad.exitButton.addActionListener(this);

userControlPad.createButton.setEnabled(false);

userControlPad.joinButton.setEnabled(false);

userControlPad.cancelButton.setEnabled(false);

southPanel.add(userControlPad, BorderLayout.CENTER);

southPanel.setBackground(Color.LIGHT_GRAY);

addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

if (isOnChat)

{ // 聊天中

try

{ // 关闭客户端套接口

clientSocket.close();

}

catch (Exception ed){}

}

if (isOnChess || isGameConnected)

{ // 下棋中

try

{ // 关闭下棋端口

firPad.chessSocket.close();

}

catch (Exception ee){}

}

System.exit(0);

}

});

add(eastPanel, BorderLayout.EAST);

add(centerPanel, BorderLayout.CENTER);

add(southPanel, BorderLayout.SOUTH);

pack();

setSize(670, 560);

setVisible(true);

setResizable(false);

this.validate();

}

// 按指定的IP地址和端口连接到服务器

public boolean connectToServer(String serverIP, int serverPort) throws Exception

{

try

{

// 创建客户端套接口

clientSocket = new Socket(serverIP, serverPort);

// 创建输入流

inputStream = new DataInputStream(clientSocket.getInputStream());

// 创建输出流

outputStream = new DataOutputStream(clientSocket.getOutputStream());

// 创建客户端线程

FIRClientThread clientthread = new FIRClientThread(this);

// 启动线程,等待聊天信息

clientthread.start();

isOnChat = true;

return true;

}

catch (IOException ex)

{

userChatPad.chatTextArea

.setText("不能连接!\n");

}

return false;

}

// 客户端事件处理

public void actionPerformed(ActionEvent e)

{

if (e.getSource() == userControlPad.connectButton)

{ // 连接到主机按钮单击事件

host = firPad.host = userControlPad.ipInputted.getText(); // 取得主机地址

try

{

if (connectToServer(host, port))

{ // 成功连接到主机时,设置客户端相应的界面状态

userChatPad.chatTextArea.setText("");

userControlPad.connectButton.setEnabled(false);

userControlPad.createButton.setEnabled(true);

userControlPad.joinButton.setEnabled(true);

firPad.statusText.setText("连接成功,请等待!");

}

}

catch (Exception ei)

{

userChatPad.chatTextArea

.setText("不能连接!\n");

}

}

if (e.getSource() == userControlPad.exitButton)

{ // 离开游戏按钮单击事件

if (isOnChat)

{ // 若用户处于聊天状态中

try

{ // 关闭客户端套接口

clientSocket.close();

}

catch (Exception ed){}

}

if (isOnChess || isGameConnected)

{ // 若用户处于游戏状态中

try

{ // 关闭游戏端口

firPad.chessSocket.close();

}

catch (Exception ee){}

}

System.exit(0);

}

if (e.getSource() == userControlPad.joinButton)

{ // 加入游戏按钮单击事件

String selectedUser = (String)userListPad.userList.getSelectedItem(); // 取得要加入的游戏

if (selectedUser == null || selectedUser.startsWith("[inchess]") ||

selectedUser.equals(chessClientName))

{ // 若未选中要加入的用户,或选中的用户已经在游戏,则给出提示信息

firPad.statusText.setText("必须选择一个用户!");

}

else

{ // 执行加入游戏的操作

try

{

if (!isGameConnected)

{ // 若游戏套接口未连接

if (firPad.connectServer(firPad.host, firPad.port))

{ // 若连接到主机成功

isGameConnected = true;

isOnChess = true;

isParticipant = true;

userControlPad.createButton.setEnabled(false);

userControlPad.joinButton.setEnabled(false);

userControlPad.cancelButton.setEnabled(true);

firPad.firThread.sendMessage("/joingame "

+ (String)userListPad.userList.getSelectedItem() + " "

+ chessClientName);

}

}

else

{ // 若游戏端口连接中

isOnChess = true;

isParticipant = true;

userControlPad.createButton.setEnabled(false);

userControlPad.joinButton.setEnabled(false);

userControlPad.cancelButton.setEnabled(true);

firPad.firThread.sendMessage("/joingame "

+ (String)userListPad.userList.getSelectedItem() + " "

+ chessClientName);

}

}

catch (Exception ee)

{

isGameConnected = false;

isOnChess = false;

isParticipant = false;

userControlPad.createButton.setEnabled(true);

userControlPad.joinButton.setEnabled(true);

userControlPad.cancelButton.setEnabled(false);

userChatPad.chatTextArea

.setText("不能连接: \n" + ee);

}

}

}

if (e.getSource() == userControlPad.createButton)

{ // 创建游戏按钮单击事件

try

{

if (!isGameConnected)

{ // 若游戏端口未连接

if (firPad.connectServer(firPad.host, firPad.port))

{ // 若连接到主机成功

isGameConnected = true;

isOnChess = true;

isCreator = true;

userControlPad.createButton.setEnabled(false);

userControlPad.joinButton.setEnabled(false);

userControlPad.cancelButton.setEnabled(true);

firPad.firThread.sendMessage("/creatgame "

+ "[inchess]" + chessClientName);

}

}

else

{ // 若游戏端口连接中

isOnChess = true;

isCreator = true;

userControlPad.createButton.setEnabled(false);

userControlPad.joinButton.setEnabled(false);

userControlPad.cancelButton.setEnabled(true);

firPad.firThread.sendMessage("/creatgame "

+ "[inchess]" + chessClientName);

}

}

catch (Exception ec)

{

isGameConnected = false;

isOnChess = false;

isCreator = false;

userControlPad.createButton.setEnabled(true);

userControlPad.joinButton.setEnabled(true);

userControlPad.cancelButton.setEnabled(false);

ec.printStackTrace();

userChatPad.chatTextArea.setText("不能连接: \n"

+ ec);

}

}

if (e.getSource() == userControlPad.cancelButton)

{ // 退出游戏按钮单击事件

if (isOnChess)

{ // 游戏中

firPad.firThread.sendMessage("/giveup " + chessClientName);

firPad.setVicStatus(-1 * firPad.chessColor);

userControlPad.createButton.setEnabled(true);

userControlPad.joinButton.setEnabled(true);

userControlPad.cancelButton.setEnabled(false);

firPad.statusText.setText("请创建或加入游戏!");

}

if (!isOnChess)

{ // 非游戏中

userControlPad.createButton.setEnabled(true);

userControlPad.joinButton.setEnabled(true);

userControlPad.cancelButton.setEnabled(false);

firPad.statusText.setText("请创建或加入游戏!");

}

isParticipant = isCreator = false;

}

}

public void keyPressed(KeyEvent e)

{

TextField inputwords = (TextField) e.getSource();

if (e.getKeyCode() == KeyEvent.VK_ENTER)

{ // 处理回车按键事件

if (userInputPad.userChoice.getSelectedItem().equals("所有用户"))

{ // 给所有人发信息

try

{

// 发送信息

outputStream.writeUTF(inputwords.getText());

inputwords.setText("");

}

catch (Exception ea)

{

userChatPad.chatTextArea

.setText("不能连接到服务器!\n");

userListPad.userList.removeAll();

userInputPad.userChoice.removeAll();

inputwords.setText("");

userControlPad.connectButton.setEnabled(true);

}

}

else

{ // 给指定人发信息

try

{

outputStream.writeUTF("/" + userInputPad.userChoice.getSelectedItem()

+ " " + inputwords.getText());

inputwords.setText("");

}

catch (Exception ea)

{

userChatPad.chatTextArea

.setText("不能连接到服务器!\n");

userListPad.userList.removeAll();

userInputPad.userChoice.removeAll();

inputwords.setText("");

userControlPad.connectButton.setEnabled(true);

}

}

}

}

public void keyTyped(KeyEvent e) {}

public void keyReleased(KeyEvent e) {}

public static void main(String args[])

{

FIRClient chessClient = new FIRClient();

}

}

2.开发客户端线程

import java.io.IOException;

import java.util.StringTokenizer;

import javax.swing.DefaultListModel;

import javax.swing.ListModel;

/**

* Created by Administrator on 2016/11/21.

*/

public class FIRClientThread extends Thread{

public FIRClient firClient;

public FIRClientThread(FIRClient firClient)

{

this.firClient = firClient;

}

public void dealWithMsg(String msgReceived)

{

if (msgReceived.startsWith("/userlist "))

{ // 若取得的信息为用户列表

StringTokenizer userToken = new StringTokenizer(msgReceived, " ");

int userNumber = 0;

// 清空客户端用户列表

firClient.userListPad.userList.removeAll();

// 清空客户端用户下拉框

firClient.userInputPad.userChoice.removeAll();

// 给客户端用户下拉框添加一个选项

firClient.userInputPad.userChoice.addItem("所有用户");

while (userToken.hasMoreTokens())

{ // 当收到的用户信息列表中存在数据时

String user = (String) userToken.nextToken(" "); // 取得用户信息

if (userNumber > 0 && !user.startsWith("[inchess]"))

{ // 用户信息有效时

firClient.userListPad.userList.add(user);// 将用户信息添加到用户列表中

firClient.userInputPad.userChoice.addItem(user); // 将用户信息添加到用户下拉框中

}

userNumber++;

}

firClient.userInputPad.userChoice.setSelectedIndex(0);// 下拉框默认选中所有人

}

else if (msgReceived.startsWith("/yourname "))

{ // 收到的信息为用户本名时

firClient.chessClientName = msgReceived.substring(10); // 取得用户本名

firClient.setTitle("Java 五子棋客户端 " + "用户名:"

+ firClient.chessClientName); // 设置程序Frame的标题

}

else if (msgReceived.equals("/reject"))

{ // 收到的信息为拒绝用户时

try

{

firClient.firPad.statusText.setText("不能加入游戏!");

firClient.userControlPad.cancelButton.setEnabled(false);

firClient.userControlPad.joinButton.setEnabled(true);

firClient.userControlPad.createButton.setEnabled(true);

}

catch (Exception ef)

{

firClient.userChatPad.chatTextArea

.setText("Cannot close!");

}

firClient.userControlPad.joinButton.setEnabled(true);

}

else if (msgReceived.startsWith("/peer "))

{ // 收到信息为游戏中的等待时

firClient.firPad.chessPeerName = msgReceived.substring(6);

if (firClient.isCreator)

{ // 若用户为游戏建立者

firClient.firPad.chessColor = 1; // 设定其为黑棋先行

firClient.firPad.isMouseEnabled = true;

firClient.firPad.statusText.setText("黑方下...");

}

else if (firClient.isParticipant)

{ // 若用户为游戏加入者

firClient.firPad.chessColor = -1; // 设定其为白棋后性

firClient.firPad.statusText.setText("游戏加入,等待对手.");

}

}

else if (msgReceived.equals("/youwin"))

{ // 收到信息为胜利信息

firClient.isOnChess = false;

firClient.firPad.setVicStatus(firClient.firPad.chessColor);

firClient.firPad.statusText.setText("对手退出");

firClient.firPad.isMouseEnabled = false;

}

else if (msgReceived.equals("/OK"))

{ // 收到信息为成功创建游戏

firClient.firPad.statusText.setText("游戏创建等待对手");

}

else if (msgReceived.equals("/error"))

{ // 收到信息错误

firClient.userChatPad.chatTextArea.append("错误,退出程序.\n");

}

else

{

firClient.userChatPad.chatTextArea.append(msgReceived + "\n");

firClient.userChatPad.chatTextArea.setCaretPosition(

firClient.userChatPad.chatTextArea.getText().length());

}

}

public void run()

{

String message = "";

try

{

while (true)

{

// 等待聊天信息,进入wait状态

message = firClient.inputStream.readUTF();

dealWithMsg(message);

}

}

catch (IOException es){}

}

}

至此,网络版五子棋就算是开发完成了。关于这么多类和包的关系如下图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java 网络五子棋_Java实现五子棋网络版相关推荐

  1. java网络编程_Java网络编程进阶:通过JSSE创建安全的数据通信

    小编说:本文作者孙卫琴,知名IT作家和Java专家.本文将通过一个范例向大家介绍JSSE是如何实现安全的网络通信的. 在网络上,信息在由源主机到目标主机的传输过程中会经过其他计算机.一般情况下,中间的 ...

  2. java 网络实验_java网络聊天室实验

    使用java写的一个网络聊天小程序,采用UDP协议.将左下角的ip改为目标地址即可发送信息.作为java网络编程入门的一个参考.最后一幅图为程序中所使用图片,来自仙剑奇侠传五的壁纸. 1.[文件] C ...

  3. java网络高级_Java高级-增高

    1.java泛型 泛型 提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型 泛型本质是参数化类型 extends T>表示该通配符所代表的类型是T类型的子类 super T& ...

  4. java绘制棋盘_java绘制五子棋棋盘

    本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下 源码: import javax.imageio.ImageIO; import javax.swing.*; impo ...

  5. java五子棋_java实现五子棋

    一.需求分析 1.画一个15x15的棋盘版面 2.功能按钮:开始游戏,悔棋,认输 3.单选按钮:人人对战.人机对战 4.要求:在棋盘上下棋子,棋子必须要在交叉点上:同一个位置上不能有再下棋子:棋子不能 ...

  6. java绘制五子棋_java绘制五子棋棋盘

    免费资源网,https://freexyz.cn/ 本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下 源码: import javax.imageio.ImageIO; ...

  7. java实现五子棋_java实现五子棋

    [java]代码库import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Tool ...

  8. java中五子棋_Java简单五子棋的实现

    在经过了几天的学习后,已经可以实现一个简单的五子棋游戏了,下面我就写一下编写程序 的过程和自己在这个过程中的心得体会. 第一步:绘制棋盘和实现落子 具体的过程就不写了,我是绘制了一个15*15的棋盘, ...

  9. java 控制台五子棋_java控制台五子棋

    package frank; import java.io.*; public class App { //棋盘 private String[][] board; //棋盘大小 private st ...

最新文章

  1. MOSS2007 实现单点登陆
  2. fedora如何隐藏顶部状态栏_如何使用PDF Arranger来对PDF文件进行排版和修改
  3. XAMPP维基百科,自由的百科全书
  4. 文件头_常见文件文件头
  5. Android 图片加载框架Coil使用总结
  6. WinForm C#全局错误捕捉处理【整理】
  7. mysql查到库怎么进入表_mysql如何进入数据库查看所有表
  8. Maven学习总结(1)——Maven入门
  9. Java面向对象编程之三大特性
  10. 调用百度图像识别api处理网络图片(文字识别)
  11. 基于web的网上书城网站设计与实现(SpringBoot ,Vue,MySQL )
  12. python电影名称词云_python爬虫——词云分析最热门电影《后来的我们》
  13. HDU5855 Less Time, More profit(最大权闭合图)
  14. ES stored fields作用
  15. 深入理解Nginx:高顿教育java开发
  16. 编写python代码实现打开并登录网页、对网页进行点击、输入信息等操作
  17. 1241. 外卖店优先级 Java题解 (模拟)【第十届蓝桥杯省赛C++A/C组,JAVA A/B/C组】
  18. Unity中打开文件窗口(OpenFileDialog)的几种方法对比
  19. Cadence Allegro倒角图文教程及视频演示
  20. HTML基础第十二讲---链接标志

热门文章

  1. 微信多开txt_电脑上登录多个微信(微信多开)教程
  2. Windows 3.0 下载
  3. 【转】传递函数中拉普拉斯变换的s是用来干什么的?
  4. jQuery流程图制作插件
  5. 一切领先皆为序章,看AI产业融合新浪潮
  6. Python实现的深度学习技术在水文水质领域应用
  7. oppo云服务器网站,开启OPPO云服务 个人数据轻松管理
  8. 6端口车载以太网交换机
  9. 幸存者偏差Survivorship Bias
  10. vue 引入avue