前言
五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成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启动
对战效果
代码实现
服务端启动类
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 天。
可以关注我,点赞我、评论我、收藏我啦。
版权归原作者 毅慎 所有, 如有侵权,请联系我们删除。