> 文档中心 > JAVA 实现《五子棋》游戏|CSDN创作打卡

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

功能截图

服务端启动

JAVA 实现《五子棋》游戏|CSDN创作打卡

客户端1启动

JAVA 实现《五子棋》游戏|CSDN创作打卡

客户端2启动

JAVA 实现《五子棋》游戏|CSDN创作打卡

对战效果

JAVA 实现《五子棋》游戏|CSDN创作打卡

JAVA 实现《五子棋》游戏|CSDN创作打卡

代码实现

服务端启动类

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;   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; }    }    @Override    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("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);  }     } }    }    @Override    public void keyTyped(KeyEvent e) {}    @Override    public void keyReleased(KeyEvent e) {}    public static void main(String[] args) { new ClientChess();    }}

棋盘五子棋核心算法类

public class ChessBoard extends Panel implements MouseListener, ActionListener {    public int dis = 30;    // 鼠标是否能使用     public boolean isMouseEnabled = false;    // 是否胜利     public boolean isWon = 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;    protected DataInputStream inputData;    protected DataOutputStream outputData;    public String chessSelfName = null;    public String chessPeerName = null;    public String host = null;    public int port = 1234;    public TextField statusText = new TextField("请先连接服务器!!!");    public ChessThread chessThread = new ChessThread(this);    public ChessBoard() { setSize(600, 600); setLayout(null); setBackground(new Color(205, 133, 63)); addMouseListener(this); add(statusText); statusText.setBounds(new Rectangle(80, 5, 440, 24)); statusText.setEditable(false);    }    /     * 连接到主机     * @param ServerIP     * @param ServerPort     * @return     * @throws Exception     */    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());     chessThread.start();     return true; } catch (IOException ex) {     statusText.setText("sorry,连接失败!!! \n"); } return false;    }    /     * 设定胜利时的棋盘状态     * @param vicChessColor     */    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, 200, 24); // 黑棋胜 if (vicChessColor == 1) {     chessBlackVicTimes++;     statusText.setText("恭喜黑方胜!!!黑VS白 " + chessBlackVicTimes + ":" + chessWhiteVicTimes      + ".游戏重启,等待白方...");     // 白棋胜 } else if (vicChessColor == -1) {     chessWhiteVicTimes++;     statusText.setText("恭喜白方胜!!!黑VS白 " + chessBlackVicTimes + ":" + chessWhiteVicTimes      + ".游戏重启,等待黑方..."); }    }    /     * 取得指定棋子的位置     * @param xPos     * @param yPos     * @param chessColor     */    public void setLocation(int xPos, int yPos, int chessColor) { // 棋子为黑棋时 if (chessColor == 1) {     chessBlack_XPOS[chessBlackCount] = xPos * dis;     chessBlack_YPOS[chessBlackCount] = yPos * dis;     chessBlackCount++; // 棋子为白棋时 } else if (chessColor == -1) {     chessWhite_XPOS[chessWhiteCount] = xPos * dis;     chessWhite_YPOS[chessWhiteCount] = yPos * dis;     chessWhiteCount++; }    }    /     * 五子棋核心算法     * @param xPos     * @param yPos     * @param chessColor     * @return     */    public boolean checkVicStatus(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) {return true;   }      }  }  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) {return true;   }      }  }  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) {return true;   }      }  }  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) {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++) {      // 判断当前下的棋子的左上方向4个棋子是否都为黑棋       if (((xPos - closeGrid) * dis == chessBlack_XPOS[chessToCompareIndex])&& ((yPos + closeGrid) * dis == chessBlack_YPOS[chessToCompareIndex])) {   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++) {      // 判断当前下的棋子的右下方向4个棋子是否都为黑棋       if (((xPos + closeGrid) * dis == chessBlack_XPOS[chessToCompareIndex])&& ((yPos - closeGrid) * dis == chessBlack_YPOS[chessToCompareIndex])) {   chessLinkedCount++;   if (chessLinkedCount == 5) {return true;   }      }  }  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) {return true;   }      }  }  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) {return true;   }      }  }  if (chessLinkedCount == (chessLinkedCompare + 1)) {      chessLinkedCompare++;  } else {      break;  }     } // 白棋的情况  } else if (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) {return true;   }      }  }  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) {return true;   }      }  }  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) {return true;   }      }  }  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) {return true;   }      }  }  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) {return true;   }      }  }  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;  }     }     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) {return true;   }      }  }  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;  }     } } return false;    }    /     * 画棋盘     */    @Override    public void paint(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     */    public void paintChessPoint(int xPos, int yPos, int chessColor) { ChessBlack chessBlack = new ChessBlack(this); ChessWhite chessWhite = new ChessWhite(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;     }     // 白棋  } else 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(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     */    public void paintNetChessPoint(int xPos, int yPos, int chessColor) { ChessBlack chessBlack = new ChessBlack(this); ChessWhite chessWhite = new ChessWhite(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;     } } else if (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     */    @Override    public void mousePressed(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);     } }    } @Override    public void actionPerformed(ActionEvent e) {}    @Override    public void mouseClicked(MouseEvent e) {}    @Override    public void mouseReleased(MouseEvent e) {}    @Override    public void mouseEntered(MouseEvent e) {}    @Override    public void mouseExited(MouseEvent e) {}}

总结

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

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

源码获取

源码下载地址:传送门------->
可关注博主后,私聊博主免费获取
需要技术指导,写项目程序,等更多服务请联系博主

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

唱吧