JAVA 实现《五子棋》游戏|CSDN创作打卡
Posted 毅慎
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 实现《五子棋》游戏|CSDN创作打卡相关的知识,希望对你有一定的参考价值。
前言
五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。
棋具与围棋通用,起源于中国上古时代的传统黑白棋种之一。主要流行于华人和汉字文化圈的国家以及欧美一些地区,是世界上最古老的棋。
容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。
主要需求
1、对局双方各执一色棋子。
2、空棋盘开局。
3、黑先、白后,交替下子,每次只能下一子。
4、棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
5、黑方的第一枚棋子可下在棋盘任意交叉点上。
6、轮流下子是双方的权利,但允许任何一方放弃下子权,先形成5子连线者获胜。
主要设计
1、由于是两人的游戏,非单机版,所以要有多个客户端相互通信,这时就要用到socket 技术
2、设计socket服务端,用来维护socket客户端连接
3、设计socket客户端,用来实现五子棋逻辑和效果
4、客户端要能设置连接服务端的IP,用来连接服务端
5、客户端1创建游戏后,客户端2可以选择客户端1进行联机对战
6、游戏规则:
- 对局双方各执一色棋子。
- 空棋盘开局。
- 黑先、白后,交替下子,每次只能下一子。
- 棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
- 黑方的第一枚棋子可下在棋盘任意交叉点上。
- 轮流下子是双方的权利,但允许任何一方放弃下子权,先形成5子连线者获胜。
功能截图
服务端启动
客户端1启动
客户端2启动
对战效果
代码实现
服务端启动类
public class ServerRunner 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;
int clientAccessNumber = 1;
/**
* 将客户端套接口和输出流绑定
*/
Hashtable clientDataHash = new Hashtable(50);
/**
* 将客户端套接口和客户名绑定
*/
Hashtable clientNameHash = new Hashtable(50);
/**
* 将游戏创建者和游戏加入者绑定
*/
Hashtable chessPeerHash = new Hashtable(50);
public ServerRunner()
super("网络游戏对战平台服务器控制平台");
setBackground(Color.PINK);
buttonPanel.setLayout(new FlowLayout());
clearMsgButton.setSize(50, 30);
buttonPanel.add(clearMsgButton);
clearMsgButton.addActionListener(this);
serverStatusButton.setSize(50, 30);
buttonPanel.add(serverStatusButton);
serverStatusButton.addActionListener(this);
closeServerButton.setSize(50, 30);
buttonPanel.add(closeServerButton);
closeServerButton.addActionListener(this);
add(serverMsgPanel, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
addWindowListener(new WindowAdapter()
@Override
public void windowClosing(WindowEvent e)
System.exit(0);
);
pack();
setVisible(true);
setSize(600, 440);
setResizable(false);
validate();
try
createServer(1234, serverMsgPanel);
catch (Exception e)
e.printStackTrace();
/**
* 用指定端口和面板创建服务器
* @param port
* @param serverMsgPanel
* @throws IOException
*/
public void createServer(int port, ServerMsgPanel serverMsgPanel) throws IOException
// 客户端套接口
Socket clientSocket;
// 设定当前主机
this.serverMsgPanel = serverMsgPanel;
try
serverSocket = new ServerSocket(port);
serverMsgPanel.msgTextArea.setText("服务器启动:"
+ InetAddress.getLocalHost() + ":"
+ serverSocket.getLocalPort() + "\\n");
while (true)
// 监听客户端套接口的信息
clientSocket = serverSocket.accept();
serverMsgPanel.msgTextArea.append("已连接用户:" +
"毅慎" + clientAccessNumber +"\\n" + clientSocket + "\\n");
// 建立客户端输出流
DataOutputStream outputData = new DataOutputStream(clientSocket.getOutputStream());
// 将客户端套接口和输出流绑定
clientDataHash.put(clientSocket, outputData);
// 将客户端套接口和客户名绑定
clientNameHash.put(clientSocket, ("毅慎" + clientAccessNumber++));
// 创建并运行服务器端线程
ServerThread thread = new ServerThread(clientSocket,
clientDataHash, clientNameHash, chessPeerHash, serverMsgPanel);
thread.start();
catch (IOException ex)
ex.printStackTrace();
@Override
public void actionPerformed(ActionEvent e)
// 清空服务器信息
if (e.getSource() == clearMsgButton)
serverMsgPanel.msgTextArea.setText("");
// 显示服务器信息
if (e.getSource() == serverStatusButton)
try
serverMsgPanel.msgTextArea.append("用户信息:" + "毅慎"
+ (clientAccessNumber - 1) + "\\n服务器信息:"
+ InetAddress.getLocalHost() + ":"
+ serverSocket.getLocalPort() + "\\n");
catch (Exception ee)
ee.printStackTrace();
public static void main(String[] args)
new ServerRunner();
客户端启动类
/**
* @Author: Mr_OO
* @Date: 2019/12/22 9:05
* 客户端
*/
public class ClientChess extends Frame implements ActionListener, KeyListener
/**
* 客户端套接口
*/
public Socket clientSocket;
/**
* 数据输入流
*/
public DataInputStream inputStream;
/**
* 数据输出流
*/
public DataOutputStream outputStream;
/**
* 用户名
*/
public String chessClientName = null;
/**
* 主机地址
*/
public String host = null;
/**
* 主机端口
*/
public int port = 1234;
/**
* 是否在聊天
*/
public boolean isOnChat = false;
/**
* 是否在下棋
*/
public boolean isOnChess = false;
/**
* 游戏是否进行中
*/
public boolean isGameConnected = false;
/**
* 是否为游戏创建者
*/
public boolean isCreator = false;
/**
* 是否为游戏加入者
*/
public boolean isParticipant = false;
/**
* 用户列表区
*/
public UserList userListPad = new UserList();
/**
* 用户聊天区
*/
protected UserChat userChatPad = new UserChat();
/**
* 用户操作区
*/
public UserController userControlPad = new UserController();
/**
* 用户输入区
*/
protected UserInput userInputPad = new UserInput();
/**
* 下棋区
*/
ChessBoard chessBoard = new ChessBoard();
/**
* 面板区
*/
private Panel southPanel = new Panel();
private Panel centerPanel = new Panel();
private Panel eastPanel = new Panel();
/**
* 构造方法,创建界面
*/
public ClientChess()
super("五子棋客户端");
setLayout(new BorderLayout());
host = userControlPad.ipInputted.getText();
eastPanel.setLayout(new BorderLayout());
eastPanel.add(userListPad, BorderLayout.NORTH);
eastPanel.add(userChatPad, BorderLayout.CENTER);
eastPanel.setBackground(new Color(238, 154, 73));
userInputPad.contentInputted.addKeyListener(this);
chessBoard.host = (userControlPad.ipInputted.getText());
centerPanel.add(chessBoard, BorderLayout.CENTER);
centerPanel.add(userInputPad, BorderLayout.SOUTH);
centerPanel.setBackground(new Color(238, 154, 73));
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(PINK);
addWindowListener(new WindowAdapter()
@Override
public void windowClosing(WindowEvent e)
// 聊天中
if (isOnChat)
// 关闭客户端套接口
try
clientSocket.close();
catch (Exception ed)
if (isOnChess || isGameConnected)
// 下棋中
try
// 关闭下棋端口
chessBoard.chessSocket.close();
catch (Exception ee)
System.exit(0);
);
add(eastPanel, BorderLayout.EAST);
add(centerPanel, BorderLayout.CENTER);
add(southPanel, BorderLayout.SOUTH);
pack();
setSize(1000, 700);
setVisible(true);
setResizable(false);
this.validate();
/**
* 按指定的IP地址和端口连接到服务器
* @param serverIP
* @param serverPort
* @return
* @throws Exception
*/
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());
// 创建客户端线程
ClientThread clientThread = new ClientThread(this);
// 启动线程,等待聊天信息
clientThread.start();
isOnChat = true;
return true;
catch (IOException ex)
userChatPad.chatTextArea.setText("Sorry,无法连接!!!\\n");
return false;
/**
* 客户端事件处理
* @param e
*/
@Override
public void actionPerformed(ActionEvent e)
// 连接到主机按钮单击事件
if (e.getSource() == userControlPad.connectButton)
// 取得主机地址
host = chessBoard.host = userControlPad.ipInputted.getText();
try
// 成功连接到主机时,设置客户端相应的界面状态
if (connectToServer(host, port))
userChatPad.chatTextArea.setText("");
userControlPad.connectButton.setEnabled(false);
userControlPad.createButton.setEnabled(true);
userControlPad.joinButton.setEnabled(true);
chessBoard.statusText.setText("连接成功,请等待!!!");
catch (Exception ei)
userChatPad.chatTextArea.setText("Sorry,不能连接!!!\\n");
// 离开游戏按钮单击事件
if (e.getSource() == userControlPad.exitButton)
// 若用户处于聊天状态中
if (isOnChat)
try
// 关闭客户端套接口
clientSocket.close();
catch (Exception ed)
// 若用户处于游戏状态中
if (isOnChess || isGameConnected)
try
// 关闭游戏端口
chessBoard.chessSocket.close();
catch (Exception ee)
System.exit(0);
// 加入游戏按钮单击事件
if (e.getSource() == userControlPad.joinButton)
// 取得要加入的游戏
String selectedUser = userListPad.userList.getSelectedItem();
// 若未选中要加入的用户,或选中的用户已经在游戏,则给出提示信息
if (selectedUser == null || selectedUser.startsWith("[inchess]") ||
selectedUser.equals(chessClientName))
chessBoard.statusText.setText("必须选择一个用户!");
else
// 执行加入游戏的操作
try
// 若游戏套接口未连接
if (!isGameConnected)
// 若连接到主机成功
if (chessBoard.connectServer(chessBoard.host, chessBoard.port))
isGameConnected = true;
isOnChess = true;
isParticipant = true;
userControlPad.createButton.setEnabled(false);
userControlPad.joinButton.setEnabled(false);
userControlPad.cancelButton.setEnabled(true);
chessBoard.chessThread.sendMessage("/joingame "
+ userListPad.userList.getSelectedItem() + " "
+ chessClientName);
else
// 若游戏端口连接中
isOnChess = true;
isParticipant = true;
user以上是关于JAVA 实现《五子棋》游戏|CSDN创作打卡的主要内容,如果未能解决你的问题,请参考以下文章