范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

芜湖!用Java语言编写一个五子棋UI界面并实现网络对战功能

  使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)
  一,前期准备
  1,Java IDE(Eclipse)与JDK的安装与配置
  jdk-15.0.1-免配置路径版
  提取码:earu
  免安装版Eclipse 解压即可使用
  提取码:5iyy网络上很多配置jdk的方法,我不再重复 这里提供一种便捷操作的方法(针对新手) 由于高版本jdk不需要手动配置路径,将我上传的jdk资源下载后一键安装,路径即可自动配置
  2,一台云主机阿里云,腾讯云,华为云的云主机均可,我用的是windows系统 (window是自带的远程连接很方便),如果想用其他的也可,最好选择一个有桌面的,这样调试起来容易些 在云主机上同样需要安装Eclipse与配置jdk,步骤同上 如果内存较大的可以安装数据库,这样编写的程序上可以加账号登录注册功能
  我的云主机
  3,另一台可供测试可以联网的电脑或虚拟机建议方便的同学用另一台电脑,一台电脑用手机热点,另一台用WiFi 这样可以测试外网的连接情况
  4,转换Java Jar为exe文件的软件(如exe4j)网上很多关于转换的教程(非必须,如果不需要可以忽略这一步)
  二,功能分析与效果展示
  1,这个程序主要分为三部分,UI界面,单机落子部分,联网落子部分,而UI界面又分为登录界面和棋盘界面。在这篇文章中UI界面与联网落子部分为讲述重点。
  2,登录界面实现的功能有以下几点,首先当启动程序时,应自动检测与服务器的连接,如果连接失败,则不出现网络登录入口,如果连接成功,则出现网络对战登录入口。
  连接失败效果展示
  连接成功效果展示
  3,棋盘界面应满足的功能,黑白棋的落子,判断胜利,重新开始
  棋盘效果展示
  4,网络对战应满足的功能,由于很多电脑使用路由器与外网访问(有的通信服务提供商会隐藏真实ip,故两台由不同路由器连接的电脑很难建立连接),同时增加编写难度,采用下棋双方与服务器连接的方式,A->服务器<-B,A<-服务器->B,程序应做到迅速响应服务器信息,减少延迟,双方棋盘信息应一致。
  三,具体实现方法
  1,棋盘UI的实现JPanel jpan1 = new JPanel() {                     //根据新棋盘信息作图,覆盖原有Panel  	        		private static final long serialVersionUID = 1L;  	        		public void paint(Graphics graphics){         //重构paint函数  	        			int xst=20,yst=20,add=32;  	                    for(int t=0;t<15;t++)                      //画竖线  	                    {  	                    	graphics.drawLine(xst,yst,xst,468);  	                    	xst=xst+add;  	                    }  	                    xst=20;yst=20;add=32;  	                    for(int t=0;t<15;t++)                      //画横线  	                    {  	                    	graphics.drawLine(xst,yst,468,yst);  	                    	yst=yst+add;  	                    }  	                    	    			   graphics.setColor(Color.BLACK);             //画棋盘上五个黑点  	                   graphics.fillOval(113, 113, 6, 6);  	                   graphics.fillOval(369, 113, 6, 6);  	                   graphics.fillOval(113, 369, 6, 6);  	                   graphics.fillOval(369, 369, 6, 6);  	                   graphics.fillOval(241, 241, 6, 6);  	                     	                   for(int t=0;t<15;t++)                       //根据棋盘数组里存储的棋子信息画黑白子  	                   {  	                	   for(int t1=0;t1<15;t1++)  	                	   {  	                		   if(node[t][t1]==1)  	                		   {  	                			   graphics.setColor(Color.BLACK);  	                               graphics.fillOval(t1*32+20-13,t*32+20-13,26,26);  	                		   }  	                		   if(node[t][t1]==-1)  	                		   {  	                			   graphics.setColor(Color.WHITE);  	                               graphics.fillOval(t1*32+20-13,t*32+20-13,26,26);  	                		   }  	                	   }  	                   }  	        	    }  	        		}
  由于每次落子棋盘都会发生变化,所以设置一个鼠标触发事件,当每次触发都将窗口重绘,根据棋盘信息数组里的内容更新到当前局面。
  2,网络对战(服务器端编程)
  网络对战的实质是socket编程,即客户端A将落子信息传给服务器,服务器将信息传给客户端B,接着客户端B将落子信息传给服务器,服务器传给客户端A,故在服务器端编程中应监听两个端口(我设置的是1075和1056)客户端A将信息通过1075端口传给服务器,服务器将A传过来的信息通过1056传给服务器B,默认先连接的是黑子,当黑子连接成功后,监听白子连接。package cilent;  import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;  public class test {     public static void main(String[] args) {         ServerSocket server,server1;         try {             server = new ServerSocket(1075);             Socket socket=server.accept();             System.out.println("black is ok");             server1 = new ServerSocket(1056);             Socket socket1=server1.accept();             System.out.println("white is ok");             while(true){                 System.out.println("----------");                 InputStream in,in1;                 try {                     in = socket.getInputStream();                     byte [] b=new byte[1024];                     StringBuffer sb=new StringBuffer();                     String s;                     if(in.read(b) !=-1){                         s=new String(b);                         sb.append(s);                     }                     OutputStream out1=socket1.getOutputStream();                     System.out.println("黑发给白"+sb);                     out1.write(sb.toString().getBytes());                     out1.flush();                     in1 = socket1.getInputStream();                     byte [] b1=new byte[1024];                     StringBuffer sb1=new StringBuffer();                     String s1;                     if(in1.read(b1) !=-1){                         s1=new String(b1);                         sb1.append(s1);                     }                     OutputStream out=socket.getOutputStream();                     System.out.println("白发给黑"+sb1);                     out.write(sb1.toString().getBytes());                     out.flush();                 } catch (IOException e) {                    // e.printStackTrace();                 }             }                      } catch (IOException e) {             e.printStackTrace();         }     }   }
  3,网络对战(客户端编程)
  在客户端这边不仅要考虑数据的发送与接收,还要考虑接收或发送的数据在窗体上如何实时的显示,为此我自己创立了一套编码解码方式,为方便每次发送的信息的格式为XX*YY,前两位为二维数组行数,后两位为二维数组列数,发送部分代码如下if(xrec<=9)                        //确认发送数据格式 XX*XX XX指二维数组列,行             		   sent="0"+xrec;             	   else             		   sent=""+xrec;             	   sent=sent+"*";             	   if(yrec<=9)             		   sent=sent+"0"+yrec;             	   else             		   sent=sent+""+yrec;             	   System.out.println("==========");                    try { 					socket.getOutputStream().write(sent.getBytes()); 					System.out.println("MY sent:"+sent); 				} catch (IOException e1) { 					// TODO Auto-generated catch block 					e1.printStackTrace(); 				}                    try { 					socket.getOutputStream().flush(); 				} catch (IOException e1) { 					// TODO Auto-generated catch block 					e1.printStackTrace(); 				}      //发送完毕
  由于socket的接收函数有阻塞性,当执行接收函数时,程序被阻塞,窗体无法及时更新,这样就会出现无法更新落子信息,当接收到对方落子时一次更新两个棋子的情况,为解决这个问题,将本机落子与接收落子分隔开,当鼠标按下时更新本机落子,当鼠标松开时接收服务器信息。void jieshou(Socket socket, JFrame jFrame) 	{ 		          //temp=1;         InputStream in = null; 		try { 			in = socket.getInputStream(); 		} catch (IOException e1) { 			// TODO Auto-generated catch block 			e1.printStackTrace(); 			JOptionPane.showMessageDialog(null,"对方未就绪!"); 		}         byte[] b = new byte[1024];         StringBuffer sb = new StringBuffer();                 try { 			if (in.read(b) != -1) { 			       s = new String(b); 			       System.out.println(s); 			       sb.append(s); 			   } 		} catch (IOException e1) { 			// TODO Auto-generated catch block 			e1.printStackTrace(); 			 JOptionPane.showMessageDialog(null,"对方未就绪!"); 		}         System.out.println("来自服务器的数据:" + sb);  //收到对方落子信息         int xnew=(sb.charAt(0)-"0")*10+(sb.charAt(1)-"0");//解码         int ynew=(sb.charAt(3)-"0")*10+(sb.charAt(4)-"0");         if(node[xnew][ynew]==0) {              //更改对方落子             node[xnew][ynew]=-1;            // m=1;             }                         JPanel jpan1 = new JPanel() {                     //根据新棋盘信息作图,覆盖原有Panel         		private static final long serialVersionUID = 1L;         		public void paint(Graphics graphics){         			super.paint(graphics);         			int xst=20,yst=20,add=32;                     for(int t=0;t<15;t++)                     {                     	graphics.drawLine(xst,yst,xst,468);                     	xst=xst+add;                     }                     xst=20;yst=20;add=32;                     for(int t=0;t<15;t++)                     {                     	graphics.drawLine(xst,yst,468,yst);                     	yst=yst+add;                     }                        			   graphics.setColor(Color.BLACK);                    graphics.fillOval(113, 113, 6, 6);                    graphics.fillOval(369, 113, 6, 6);                    graphics.fillOval(113, 369, 6, 6);                    graphics.fillOval(369, 369, 6, 6);                    graphics.fillOval(241, 241, 6, 6);                                        for(int t=0;t<15;t++)                    {                 	   for(int t1=0;t1<15;t1++)                 	   {                 		   if(node[t][t1]==1)                 		   {                 			   graphics.setColor(Color.BLACK);                                graphics.fillOval(t1*32+20-13,t*32+20-13,26,26);                 		   }                 		   if(node[t][t1]==-1)                 		   {                 			   graphics.setColor(Color.WHITE);                                graphics.fillOval(t1*32+20-13,t*32+20-13,26,26);                 		   }                 	   }                    }         	    }         		};         		jFrame.add(b1);         	jFrame.add(jpan1);	         	jFrame.setVisible(true);         	//temp=0; 	}
  如果有兴趣的同学也可以在服务器端加一个本地服务器(推荐SQL server)搭配jdbc实现一个客户端登录程序(类似QQ),具体如何实现我会在下节详细叙述。
  有需要的可以给我留言,分享源码
  原文  http://www.cnblogs.com/AIERSTOM/p/Aierstom_11.html
  主题  Java    局域网

懒真不是你的错!科学家终于找到,你为何这么懒的原因了懒癌你是否有时候感觉到为自己的懒而忧虑,而发愁。你是否也在想过,为何我会变得这么懒,明明是可以非常勤快的人。至此,科学家们终于找到了你懒的原因了,实际上造成你这么懒的因素,源自于你续航可超1000km?宁德时代发布麒麟电池,2023年实现量产在2022电动车百人会上,宁德时代首席科学家吴凯公开了宁德时代的最新电池阶段性研发成果新电池其系统重量能量密度及体积能量密度继续引领行业最高水平。在相同的化学体系同等电池包尺寸下,是否存在造物主?看见TA的光芒最近看一期网上爆火杨振宁教授的视频,问及如何看待造物主时,他是这么回答的。如果你问我,说是有没有上帝呢?那么如果你所谓的上帝是一个人的形状的,那我想肯定没有你如果问我A股数字货币时代即将来临,站在风口的几家企业即将迎来爆发数字货币是什么?数字人民币(ECNY)别名为数字货币电子支付,是中国人民银行发行的一种数字形式的法定货币,主要定位于现金类支付凭证,具有法效性!简单来解释就是以电子虚拟货币形式替代华为智选5G新手机开售2299起2022年4月2日,华为自选再次推出了一款5G新机,那就是UMAGIC优畅享50Plus,这款手机的起售价格为2299元。那么问题来了,UMAGIC优畅享50Plus这款手机是否值中国股市元宇宙最强4月来袭,国内5大顶尖龙头一览发展趋势4月20日,首届全球元宇宙大会将在上海举办。此次大会由上海市政府和中国移动通信联合会联合主办,会上将重磅发布元宇宙世界宣言V1。0和宇宙产业计划V1。0,中国元宇宙产业发展好玩的问题地球上,中国的背面是什么国家?综述地球是个椭圆形的球体,各大板块在海洋上漂浮,由此诞生了我们生活的大陆。既然地球不是平面,那大家知道我国的背面是什么国家吗?有人说是美国,这实际上是不对的,美国只是在经度上和我们华为鸿蒙扬名机遇来了近日从俄罗斯通讯社获悉,在美国的大棒制裁下,谷歌公司已经停止认证和运营俄罗斯BQ公司智能手机的安卓系统,该制裁已经影响到普通俄罗斯人的生活,泛滥无理的制裁及其不利于问题的解决,反而小米12ProDXO排行榜第十四名雷总,DXO喊你充值了DxoMark是法国的一家机构,对相机成像进行排名。过去的这些年,很多手机厂商都把自家的产品送去测评,但近几年这个机构已经不再受到重视,除了受到不少人的质疑之外,自己送去测评的产品一加发布150W长寿版超级闪充,5分钟充50,1600次充放超长寿命2022年2月28日,一加官方微博放出消息,一加快充技术大升级,将搭载全新的长寿版150W超级闪充技术。同日,OPPO在MWC2022巴塞罗那世界移动通信大会上,正式发布了长寿版1特斯拉自营保险,评分最高的保费可降602019年特斯拉在美国本土推出了旗下的自营保险业务。自推出以来一直在迅速扩张,去年10月和12月其自营保险已经扩展到亚利桑那州和俄亥俄州,这也是特斯拉将其保险业务范围扩展覆盖到五个
续航100天,放手心里的英语学习机,喵喵机电子单词卡体验对于想学英语,或者正在学习英语的朋友来说,最难的就是单词的记忆,不仅词汇量大,而且想要记住需要很多时间。另外为了加强记忆,有的人会选择下载APP,或者是买一些英语书籍来学习,但是对小米11Ultra8GB256GB直降2000元,跌至3999元3月28日消息,小米开启米粉节换新活动限时直降2000元,小米11Ultra到手价低至3999元。这款手机搭载骁龙888处理器,采用三主摄影像系统,被誉为能打电话的照相机。对喜欢摄Sony新4K旗舰Xperia1IV要来了Sony一直都有消息指称,Sony今年打算5月发表新手机,微博Sony专门爆料博主ZACKBUKS最新表示,Sony2022年的新手机确实会在5月现身,但并未明确说明机型。对比上代搭载雷神混动剑指比亚迪吉利帝豪LHiX官图发布3月28日,吉利官方发布了旗下全新紧凑级轿车吉利帝豪LHiX的官图,该车将作为吉利星越L之后第二款搭载雷神混动系统的车型。吉利帝豪LHiX延续了帝豪L的外观设计,巨大的上下进气格栅黑鲨5系列明晚发布,游戏手机又迎来新突破黑鲨5系列明晚就要发布了,黑鲨科技有限公司CEO罗语周从3月24日宣告于3月30日发布黑鲨5系列。到目前,他的微博曝光来看,黑鲨5系列在游戏方面又迎来新的突破。微博中知,黑鲨5系列南北两极异常升温了30!是极端天气还是气候变化?近期,南北极部分地区突发显著升温。在南极,东南极洲威尔克斯地一侧出现异常增暖。康科迪亚站在3月18日录得11。5的最高气温(整点最高为12。2),刷新该科考站3月最高纪录,比当地3windows10,设置下班定点关电脑步骤,再也不怕忘记下班了有时候,上班忙着做PPT,结果,过了下班时间也不知道。如果电脑可以设置成下班定点关机,那就方便多了。通过windows系统的任务计划,可以方便实现定点关机。win10任务计划定点关荣耀哭晕在厕所,高仿荣耀Magic3的国产百元机上市,只卖698元起关注每天看手机的朋友应该都知道,koobee酷比手机于近年来逐渐放下身位(之前可是请过明星代言的手机品牌),开始刻意去模仿一些热门机型,如之前介绍过的酷比GTone,以及形似荣耀5Java后端开发规范Java后端开发规范一技术栈规约二命名规范三Java代码规范(注释规范异常与日志代码逻辑规范)四Mybatis与SQL规范五结果检查(单元测试及代码扫描)六安全规范一技术栈规约二命神秘新加坡人,潜伏在顺丰菜鸟京东物流背后这个满头白发一脸慈祥的女人可不简单,在她不起眼的面貌背后,藏着让人震惊的身份。她曾成功将淡马锡扭亏为盈,送到新加坡企业领头羊的位置上,更是叱咤商海几十年,留下无数个传说故事的传奇夫百公里油耗2。7L,能够6。3秒破百,揽胜运动版PHEV强不强?目前国内新能源汽车市场的形势一片大好,很多品牌都取得了十分优异的市场成绩,也同样有很多品牌在这一领域不断发力,而路虎就是一个很好的例子,尤其是它旗下的揽胜运动版PHEV,凭借着十足