0


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子连线者获胜。

功能截图

服务端启动

image-20220123191936257

客户端1启动

image-20220123192002137

客户端2启动

image-20220123192023804

对战效果

image-20220123192113615

image-20220123192132999

代码实现

服务端启动类

publicclassServerRunnerextendsFrameimplementsActionListener{JButton clearMsgButton =newJButton("清空");JButton serverStatusButton =newJButton("状态");JButton closeServerButton =newJButton("关闭");Panel buttonPanel =newPanel();ServerMsgPanel serverMsgPanel =newServerMsgPanel();ServerSocket serverSocket;int clientAccessNumber =1;/**
     * 将客户端套接口和输出流绑定
     */Hashtable clientDataHash =newHashtable(50);/**
     * 将客户端套接口和客户名绑定
     */Hashtable clientNameHash =newHashtable(50);/**
     * 将游戏创建者和游戏加入者绑定
     */Hashtable chessPeerHash =newHashtable(50);publicServerRunner(){super("网络游戏对战平台服务器控制平台");setBackground(Color.PINK);
        buttonPanel.setLayout(newFlowLayout());
        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(newWindowAdapter(){@OverridepublicvoidwindowClosing(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
     */publicvoidcreateServer(int port,ServerMsgPanel serverMsgPanel)throwsIOException{// 客户端套接口Socket clientSocket;// 设定当前主机this.serverMsgPanel = serverMsgPanel;try{
            serverSocket =newServerSocket(port);
            serverMsgPanel.msgTextArea.setText("服务器启动:"+InetAddress.getLocalHost()+":"+ serverSocket.getLocalPort()+"\n");while(true){// 监听客户端套接口的信息 
                clientSocket = serverSocket.accept();
                serverMsgPanel.msgTextArea.append("已连接用户:"+"毅慎"+ clientAccessNumber +"\n"+ clientSocket +"\n");// 建立客户端输出流 DataOutputStream outputData =newDataOutputStream(clientSocket.getOutputStream());// 将客户端套接口和输出流绑定 
                clientDataHash.put(clientSocket, outputData);// 将客户端套接口和客户名绑定 
                clientNameHash.put(clientSocket,("毅慎"+ clientAccessNumber++));// 创建并运行服务器端线程 ServerThread thread =newServerThread(clientSocket,
                        clientDataHash, clientNameHash, chessPeerHash, serverMsgPanel);
                thread.start();}}catch(IOException ex){
            ex.printStackTrace();}}@OverridepublicvoidactionPerformed(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();}}}publicstaticvoidmain(String[] args){newServerRunner();}}

客户端启动类

/**
 * @Author: Mr_OO
 * @Date: 2019/12/22 9:05
 * 客户端
 */publicclassClientChessextendsFrameimplementsActionListener,KeyListener{/**
     * 客户端套接口
     */publicSocket clientSocket;/**
     * 数据输入流
     */publicDataInputStream inputStream;/**
     * 数据输出流
     */publicDataOutputStream outputStream;/**
     * 用户名
     */publicString chessClientName =null;/**
     * 主机地址 
     */publicString host =null;/**
     * 主机端口
     */publicint port =1234;/**
     * 是否在聊天
     */publicboolean isOnChat =false;/**
     * 是否在下棋
     */publicboolean isOnChess =false;/**
     * 游戏是否进行中
     */publicboolean isGameConnected =false;/**
     * 是否为游戏创建者
     */publicboolean isCreator =false;/**
     * 是否为游戏加入者
     */publicboolean isParticipant =false;/**
     * 用户列表区
     */publicUserList userListPad =newUserList();/**
     * 用户聊天区
     */protectedUserChat userChatPad =newUserChat();/**
     * 用户操作区
     */publicUserController userControlPad =newUserController();/**
     * 用户输入区
     */protectedUserInput userInputPad =newUserInput();/**
     * 下棋区
     */ChessBoard chessBoard =newChessBoard();/**
     * 面板区
     */privatePanel southPanel =newPanel();privatePanel centerPanel =newPanel();privatePanel eastPanel =newPanel();/**
     * 构造方法,创建界面
     */publicClientChess(){super("五子棋客户端");setLayout(newBorderLayout());
        host = userControlPad.ipInputted.getText();
        
        eastPanel.setLayout(newBorderLayout());
        eastPanel.add(userListPad,BorderLayout.NORTH);
        eastPanel.add(userChatPad,BorderLayout.CENTER);
        eastPanel.setBackground(newColor(238,154,73));

        userInputPad.contentInputted.addKeyListener(this);

        chessBoard.host =(userControlPad.ipInputted.getText());
        centerPanel.add(chessBoard,BorderLayout.CENTER);
        centerPanel.add(userInputPad,BorderLayout.SOUTH);
        centerPanel.setBackground(newColor(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(newWindowAdapter(){@OverridepublicvoidwindowClosing(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
     */publicbooleanconnectToServer(String serverIP,int serverPort)throwsException{try{// 创建客户端套接口 
            clientSocket =newSocket(serverIP, serverPort);// 创建输入流 
            inputStream =newDataInputStream(clientSocket.getInputStream());// 创建输出流 
            outputStream =newDataOutputStream(clientSocket.getOutputStream());// 创建客户端线程 ClientThread clientThread =newClientThread(this);// 启动线程,等待聊天信息 
            clientThread.start();
            isOnChat =true;returntrue;}catch(IOException ex){
            userChatPad.chatTextArea.setText("Sorry,无法连接!!!\n");}returnfalse;}/**
     * 客户端事件处理
     * @param e
     */@OverridepublicvoidactionPerformed(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;
                        userControlPad.createButton.setEnabled(false);
                        userControlPad.joinButton.setEnabled(false);
                        userControlPad.cancelButton.setEnabled(true);
                        chessBoard.chessThread.sendMessage("/joingame "+ 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(chessBoard.connectServer(chessBoard.host, chessBoard.port)){// 若连接到主机成功 
                        isGameConnected =true;
                        isOnChess =true;
                        isCreator =true;
                        userControlPad.createButton.setEnabled(false);
                        userControlPad.joinButton.setEnabled(false);
                        userControlPad.cancelButton.setEnabled(true);
                        chessBoard.chessThread.sendMessage("/creatgame "+"[inchess]"+ chessClientName);}}else{// 若游戏端口连接中 
                    isOnChess =true;
                    isCreator =true;
                    userControlPad.createButton.setEnabled(false);
                    userControlPad.joinButton.setEnabled(false);
                    userControlPad.cancelButton.setEnabled(true);
                    chessBoard.chessThread.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("Sorry,不能连接: \n"+ ec);}}// 退出游戏按钮单击事件 if(e.getSource()== userControlPad.cancelButton){// 游戏中if(isOnChess){
                chessBoard.chessThread.sendMessage("/giveup "+ chessClientName);
                chessBoard.setVicStatus(-1* chessBoard.chessColor);
                userControlPad.createButton.setEnabled(true);
                userControlPad.joinButton.setEnabled(true);
                userControlPad.cancelButton.setEnabled(false);
                chessBoard.statusText.setText("请选择创建房间或加入游戏!!!");}if(!isOnChess){// 非游戏中 
                userControlPad.createButton.setEnabled(true);
                userControlPad.joinButton.setEnabled(true);
                userControlPad.cancelButton.setEnabled(false);
                chessBoard.statusText.setText("请选择创建房间或加入游戏!!!");}
            isParticipant = isCreator =false;}}@OverridepublicvoidkeyPressed(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("Sorry,不能连接到服务器!\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("Sorry,不能连接到服务器!\n");
                    userListPad.userList.removeAll();
                    userInputPad.userChoice.removeAll();
                    inputwords.setText("");
                    userControlPad.connectButton.setEnabled(true);}}}}@OverridepublicvoidkeyTyped(KeyEvent e){}@OverridepublicvoidkeyReleased(KeyEvent e){}publicstaticvoidmain(String[] args){newClientChess();}}

棋盘五子棋核心算法类

publicclassChessBoardextendsPanelimplementsMouseListener,ActionListener{publicint dis =30;// 鼠标是否能使用 publicboolean isMouseEnabled =false;// 是否胜利 publicboolean isWon =false;// 棋子的x轴坐标位 publicint chessX_POS =-1;// 棋子的y轴坐标位 publicint chessY_POS =-1;// 棋子的颜色 publicint chessColor =1;// 黑棋x轴坐标位数组 publicint chessBlack_XPOS[]=newint[200];// 黑棋y轴坐标位数组 publicint chessBlack_YPOS[]=newint[200];// 白棋x轴坐标位数组 publicint chessWhite_XPOS[]=newint[200];// 白棋y轴坐标位数组 publicint chessWhite_YPOS[]=newint[200];// 黑棋数量 publicint chessBlackCount =0;// 白棋数量 publicint chessWhiteCount =0;// 黑棋获胜次数 publicint chessBlackVicTimes =0;// 白棋获胜次数 publicint chessWhiteVicTimes =0;// 套接口 publicSocket chessSocket;protectedDataInputStream inputData;protectedDataOutputStream outputData;publicString chessSelfName =null;publicString chessPeerName =null;publicString host =null;publicint port =1234;publicTextField statusText =newTextField("请先连接服务器!!!");publicChessThread chessThread =newChessThread(this);publicChessBoard(){setSize(600,600);setLayout(null);setBackground(newColor(205,133,63));addMouseListener(this);add(statusText);
        statusText.setBounds(newRectangle(80,5,440,24));
        statusText.setEditable(false);}/**
     * 连接到主机
     * @param ServerIP
     * @param ServerPort
     * @return
     * @throws Exception
     */publicbooleanconnectServer(StringServerIP,intServerPort)throwsException{try{// 取得主机端口 
            chessSocket =newSocket(ServerIP,ServerPort);// 取得输入流 
            inputData =newDataInputStream(chessSocket.getInputStream());// 取得输出流 
            outputData =newDataOutputStream(chessSocket.getOutputStream());
            chessThread.start();returntrue;}catch(IOException ex){
            statusText.setText("sorry,连接失败!!! \n");}returnfalse;}/**
     * 设定胜利时的棋盘状态
     * @param vicChessColor
     */publicvoidsetVicStatus(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,200,24);// 黑棋胜if(vicChessColor ==1){
            chessBlackVicTimes++;
            statusText.setText("恭喜黑方胜!!!黑VS白 "+ chessBlackVicTimes +":"+ chessWhiteVicTimes
                    +".游戏重启,等待白方...");// 白棋胜}elseif(vicChessColor ==-1){
            chessWhiteVicTimes++;
            statusText.setText("恭喜白方胜!!!黑VS白 "+ chessBlackVicTimes +":"+ chessWhiteVicTimes
                    +".游戏重启,等待黑方...");}}/**
     * 取得指定棋子的位置
     * @param xPos
     * @param yPos
     * @param chessColor
     */publicvoidsetLocation(int xPos,int yPos,int chessColor){// 棋子为黑棋时if(chessColor ==1){
            chessBlack_XPOS[chessBlackCount]= xPos * dis;
            chessBlack_YPOS[chessBlackCount]= yPos * dis;
            chessBlackCount++;// 棋子为白棋时}elseif(chessColor ==-1){
            chessWhite_XPOS[chessWhiteCount]= xPos * dis;
            chessWhite_YPOS[chessWhiteCount]= yPos * dis;
            chessWhiteCount++;}}/**
     * 五子棋核心算法
     * @param xPos
     * @param yPos
     * @param chessColor
     * @return
     */publicbooleancheckVicStatus(int xPos,int yPos,int chessColor){// 连接棋子数int chessLinkedCount =1;// 用于比较是否要继续遍历一个棋子的相邻网格 int chessLinkedCompare =1;// 要比较的棋子在数组中的索引位置int chessToCompareIndex =0;// 相邻网格的位置int closeGrid =1;// 黑棋时if(chessColor ==1){// 将该棋子自身算入的话,初始连接数为1
            chessLinkedCount =1;//以下每对for循环语句为一组,因为下棋的位置能位于中间而非两端// 遍历相邻4个网格// 判断当前下的棋子的右边4个棋子是否都为黑棋for(closeGrid =1; closeGrid <=4; closeGrid++){// 遍历棋盘上所有黑棋子for(chessToCompareIndex =0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++){if(((xPos + closeGrid)* dis == chessBlack_XPOS[chessToCompareIndex])&&((yPos * dis)== chessBlack_YPOS[chessToCompareIndex])){// 连接数加1 
                        chessLinkedCount = chessLinkedCount +1;// 五子相连时,胜利 if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;// 若中间有一个棋子非黑棋,则会进入此分支,此时无需再遍历}else{break;}}// 判断当前下的棋子的左边4个棋子是否都为黑棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++){if(((xPos - closeGrid)* dis == chessBlack_XPOS[chessToCompareIndex])&&(yPos * dis == chessBlack_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}// 进入新的一组for循环时要将连接数等重置 
            chessLinkedCount =1;
            chessLinkedCompare =1;// 判断当前下的棋子的上边4个棋子是否都为黑棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++){if((xPos * dis == chessBlack_XPOS[chessToCompareIndex])&&((yPos + closeGrid)* dis == chessBlack_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}// 判断当前下的棋子的下边4个棋子是否都为黑棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++){if((xPos * dis == chessBlack_XPOS[chessToCompareIndex])&&((yPos - closeGrid)* dis == chessBlack_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}

            chessLinkedCount =1;
            chessLinkedCompare =1;for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++){// 判断当前下的棋子的左上方向4个棋子是否都为黑棋 if(((xPos - closeGrid)* dis == chessBlack_XPOS[chessToCompareIndex])&&((yPos + closeGrid)* dis == chessBlack_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++){// 判断当前下的棋子的右下方向4个棋子是否都为黑棋 if(((xPos + closeGrid)* dis == chessBlack_XPOS[chessToCompareIndex])&&((yPos - closeGrid)* dis == chessBlack_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}

            chessLinkedCount =1;
            chessLinkedCompare =1;// 判断当前下的棋子的右上方向4个棋子是否都为黑棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++){if(((xPos + closeGrid)* dis == chessBlack_XPOS[chessToCompareIndex])&&((yPos + closeGrid)* dis == chessBlack_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}// 判断当前下的棋子的左下方向4个棋子是否都为黑棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++){if(((xPos - closeGrid)* dis == chessBlack_XPOS[chessToCompareIndex])&&((yPos - closeGrid)* dis == chessBlack_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}// 白棋的情况 }elseif(chessColor ==-1){
            chessLinkedCount =1;// 判断当前下的棋子的右边4个棋子是否都为白棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++){if(((xPos + closeGrid)* dis == chessWhite_XPOS[chessToCompareIndex])&&(yPos * dis == chessWhite_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}// 判断当前下的棋子的左边4个棋子是否都为白棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++){if(((xPos - closeGrid)* dis == chessWhite_XPOS[chessToCompareIndex])&&(yPos * dis == chessWhite_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}

            chessLinkedCount =1;
            chessLinkedCompare =1;// 判断当前下的棋子的上边4个棋子是否都为白棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++){if((xPos * dis == chessWhite_XPOS[chessToCompareIndex])&&((yPos + closeGrid)* dis == chessWhite_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}// 判断当前下的棋子的下边4个棋子是否都为白棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++){if((xPos * dis == chessWhite_XPOS[chessToCompareIndex])&&((yPos - closeGrid)* dis == chessWhite_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}

            chessLinkedCount =1;
            chessLinkedCompare =1;// 判断当前下的棋子的左上方向4个棋子是否都为白棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++){if(((xPos - closeGrid)* dis == chessWhite_XPOS[chessToCompareIndex])&&((yPos + closeGrid)* dis == chessWhite_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}// 判断当前下的棋子的右下方向4个棋子是否都为白棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++){if(((xPos + closeGrid)* dis == chessWhite_XPOS[chessToCompareIndex])&&((yPos - closeGrid)* dis == chessWhite_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}

            chessLinkedCount =1;
            chessLinkedCompare =1;// 判断当前下的棋子的右上方向4个棋子是否都为白棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++){if(((xPos + closeGrid)* dis == chessWhite_XPOS[chessToCompareIndex])&&((yPos + closeGrid)* dis == chessWhite_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){returntrue;}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}// 判断当前下的棋子的左下方向4个棋子是否都为白棋for(closeGrid =1; closeGrid <=4; closeGrid++){for(chessToCompareIndex =0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++){if(((xPos - closeGrid)* dis == chessWhite_XPOS[chessToCompareIndex])&&((yPos - closeGrid)* dis == chessWhite_YPOS[chessToCompareIndex])){
                        chessLinkedCount++;if(chessLinkedCount ==5){return(true);}}}if(chessLinkedCount ==(chessLinkedCompare +1)){
                    chessLinkedCompare++;}else{break;}}}returnfalse;}/**
     * 画棋盘
     */@Overridepublicvoidpaint(Graphics g){for(int i =40; i <=580; i = i +30){
            g.drawLine(40, i,580, i);}for(int j =40; j <=580; j = j +30){
            g.drawLine(j,40, j,580);}
        g.fillOval(127,127,8,8);
        g.fillOval(487,127,8,8);
        g.fillOval(127,487,8,8);
        g.fillOval(487,487,8,8);
        g.fillOval(307,307,8,8);}/**
     * 画棋子 
     * @param xPos
     * @param yPos
     * @param chessColor
     */publicvoidpaintChessPoint(int xPos,int yPos,int chessColor){ChessBlack chessBlack =newChessBlack(this);ChessWhite chessWhite =newChessWhite(this);// 黑棋if(chessColor ==1&& isMouseEnabled){// 设置棋子的位置 setLocation(xPos, yPos, chessColor);// 取得当前局面状态 
            isWon =checkVicStatus(xPos, yPos, chessColor);// 非胜利状态if(isWon ==false){
                chessThread.sendMessage("/"+ chessPeerName +" /chess "+ xPos +" "+ yPos +" "+ chessColor);// 将棋子添加到棋盘中this.add(chessBlack);// 设置棋子边界 
                chessBlack.setBounds(xPos * dis -4, yPos * dis -3,30,30);
                statusText.setText("黑(第"+ chessBlackCount +"步)"+ xPos +" "+ yPos +",轮到白方.");// 将鼠标设为不可用 
                isMouseEnabled =false;// 胜利状态}else{
                chessThread.sendMessage("/"+ chessPeerName +" /chess "+ xPos +" "+ yPos +" "+ chessColor);this.add(chessBlack);
                chessBlack.setBounds(xPos * dis -4, yPos * dis -3,30,30);// 调用胜利方法,传入参数为黑棋胜利setVicStatus(1);
                isMouseEnabled =false;}// 白棋 }elseif(chessColor ==-1&& isMouseEnabled){setLocation(xPos, yPos, chessColor);
            isWon =checkVicStatus(xPos, yPos, chessColor);if(isWon ==false){
                chessThread.sendMessage("/"+ chessPeerName +" /chess "+ xPos +" "+ yPos +" "+ chessColor);this.add(chessWhite);
                chessWhite.setBounds(xPos * dis -4, yPos * dis-3,30,30);
                statusText.setText("白(第"+ chessWhiteCount +"步)"+ xPos +" "+ yPos +",轮到黑方.");
                isMouseEnabled =false;}else{
                chessThread.sendMessage("/"+ chessPeerName +" /chess "+ xPos +" "+ yPos +" "+ chessColor);this.add(chessWhite);
                chessWhite.setBounds(xPos * dis-4, yPos * dis -3,30,30);// 调用胜利方法,传入参数为白棋 setVicStatus(-1);
                isMouseEnabled =false;}}}/**
     * 画网络棋盘
     * @param xPos
     * @param yPos
     * @param chessColor
     */publicvoidpaintNetChessPoint(int xPos,int yPos,int chessColor){ChessBlack chessBlack =newChessBlack(this);ChessWhite chessWhite =newChessWhite(this);setLocation(xPos, yPos, chessColor);if(chessColor ==1){
            isWon =checkVicStatus(xPos, yPos, chessColor);if(isWon ==false){this.add(chessBlack);
                chessBlack.setBounds(xPos * dis-4, yPos * dis -3,30,30);
                statusText.setText("黑(第"+ chessBlackCount +"步)"+ xPos +" "+ yPos +",轮到白方.");
                isMouseEnabled =true;}else{
                chessThread.sendMessage("/"+ chessPeerName +" /victory "+ chessColor);this.add(chessBlack);
                chessBlack.setBounds(xPos * dis -4, yPos * dis-3,30,30);setVicStatus(1);
                isMouseEnabled =true;}}elseif(chessColor ==-1){
            isWon =checkVicStatus(xPos, yPos, chessColor);if(isWon ==false){this.add(chessWhite);
                chessWhite.setBounds(xPos * dis-4, yPos * dis-3,30,30);
                statusText.setText("白(第"+ chessWhiteCount +"步)"+ xPos +" "+ yPos +",轮到黑方.");
                isMouseEnabled =true;}else{
                chessThread.sendMessage("/"+ chessPeerName +" /victory "+ chessColor);this.add(chessWhite);
                chessWhite.setBounds(xPos * dis-4, yPos * dis-3,30,30);setVicStatus(-1);
                isMouseEnabled =true;}}}/**
     * 捕获下棋事件
     * @param e
     */@OverridepublicvoidmousePressed(MouseEvent e){if(e.getModifiers()==InputEvent.BUTTON1_MASK){
            chessX_POS = e.getX();System.out.println(chessX_POS);
            chessY_POS = e.getY();System.out.println(chessY_POS);int a =(chessX_POS)/ dis, b =(chessY_POS)/ dis;System.out.println("a="+a);System.out.println("b="+b);// 下棋位置不正确时,不执行任何操作 if(chessX_POS / dis <2|| chessY_POS / dis <2|| chessX_POS / dis >19|| chessY_POS / dis >19){}else{// 画棋子paintChessPoint(a, b, chessColor);}}}@OverridepublicvoidactionPerformed(ActionEvent e){}@OverridepublicvoidmouseClicked(MouseEvent e){}@OverridepublicvoidmouseReleased(MouseEvent e){}@OverridepublicvoidmouseEntered(MouseEvent e){}@OverridepublicvoidmouseExited(MouseEvent e){}}

总结

通过此次的《五子棋》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

源码获取

可关注博主后,私聊博主获取

今天是持续写作的第 3 / 100 天。
可以关注我,点赞我、评论我、收藏我啦。

标签: java 游戏 swing

本文转载自: https://blog.csdn.net/qq_40869977/article/details/122663998
版权归原作者 毅慎 所有, 如有侵权,请联系我们删除。

“JAVA 实现《五子棋》游戏|CSDN创作打卡”的评论:

还没有评论