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、游戏规则:

  1. 对局双方各执一色棋子。
  2. 空棋盘开局。
  3. 黑先、白后,交替下子,每次只能下一子。
  4. 棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
  5. 黑方的第一枚棋子可下在棋盘任意交叉点上。
  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创作打卡的主要内容,如果未能解决你的问题,请参考以下文章

利用Java类和对象以及数组开发一个小型五子棋游戏

重学Java基础——继承|CSDN创作打卡

五子棋程序设计实现技术文档

五子棋程序设计实现技术文档

五子棋程序设计实现技术文档

[教你做小游戏] 《五子棋》怎么存棋局信息?