版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE22《JAVA游戏开发》课程设计报告题目网络益智游戏姓名:云红卫学号:081012130专业:软件技术班级:软件082计算机科学与技术系2009年6月目录TOC\o"1-2"\h\z\u1实践过程概述 42课程设计题目描述 43系统需求分析与设计 43.1系统需求分析 43.2系统设计 44系统测试和使用说明 74.1系统测试 74.2系统使用说明 85课程设计总结 85.1遇到的问题和解决方法 85.2心得体会 96参考文献 97附录 10
网络益智游戏1实践过程概述此次软件技术专业JAVA游戏开发课程设计于2009年6月在实验楼三楼机房进行,持续时间为两周。本次课程设计主要是利用所学的面向对象程序设计语言——JAVA来编写程序,实现特定功能,以加深对JAVA的理解。2课程设计题目描述我们设计的网络益智游戏:是一台计算机做服务器产生一个随机数和随机字母,另一台计算机做客户端来猜。3系统需求分析与设计3.1系统需求分析随着现在生活节奏的不断加快,现在许多的人们在工作之余,需要通过一些益智小游戏,来调节一下自己的情绪,释放一下自己的疲劳。而网络益智游戏正好符合人们的要求,它不需要你过多的去思考答案,只是轻松一下紧张的神经,放松一下心情,就像开心农场一样,在人们的工作之余调节一下。3.2系统设计3.2.1系统总体设计系统功能分析本系统要用到以下的Java编程技术实现的功能:①网络功能:这一程序将由一个服务器程序和一个客户端程序构成。客户端用来猜测随机字母和随机数的大小。服务器用来产生随机字母和随机数,来确定是否猜中。②多线程功能:当客户端要求与服务器端建立连接时,服务器端就将用到多线程功能,为每一个建立起来的连接创建一个线程。3.2.2程序详细设计(1)程序框架本系统的程序框架主要包括服务器端和客户端两部分。服务器端服务器端通过类和方法来产生随机字母和随机数,来判断客户端送过来的答案是否正确。客户端客户端通过类和方法来连接服务器,并把猜测的答案发送到服务器,并接受服务器判断之后的结果。基本类的设计:Server类Server服务器类,其中定义了6个成员变量和5个成员方法。serv变量用于存储套接字,port变量存储端口号,info数组存放接收到的数据包中的信息,rec变量存储接收到的数据包,snd变量存储要发送的数据包,msg变量存储要发送或提取出的信息。main()方法是主方法,用于创建套接字,选择要进行的游戏;guessZimu()方法用于进行猜字母游戏;guessPro()方法用于进行猜大小游戏;judge()方法用于判断试猜答案的匹配情况,并将结果返回给客户端;getZimu()方法是用来生成随机字母。在main()方法中,首先将参数转化为端口号,据此创建一个套接字。然后等待客户端的数据包,收到的第1个数据包中包含的是该客户端的IP地址,将其输出。接着,就开始与客户端进行交互。先发送消息,让客户端选择要玩的游戏,客户端将作出的选择封装在数据包中发回。如果客户但回复的是“quit”指令,则终止程序,关闭套接字;如果是“1”,代表选择猜字母游戏,调用guessZimu()方法;如果是“2”,代表选择猜大小游戏,调用guessPro()方法。GuessZimu()方法是进行猜数字的游戏,先调用getZimu()方法,生成一个随机字母,并输出。游戏者有10次试猜机会,每次接收到包含试猜答案的数据包后,都先把试猜答案输出,再调用judge()方法判断答案的匹配情况。如果答案完全匹配,返回答案正确的提示信息,否则继续进行游戏。如果超过10次未猜对,也结束游戏,并向客户端返回正确答案。judge()方法是判断试猜答案与正确答案匹配情况的方法,组合答案匹配情况的信息,存储到字符串msg中,并封装到数据包发送给客户端。如果答案完全匹配,则返回1,否则返回0。getZimu()方法是用来生成随机数序列的,它创建了一个Random类对象,并调用它的nextInt()方法来生成随机数。每次生成的随机数,都要与已生成随机数比较,如果有重复,则重新生成,直到不与已生成的随机数重复。guessPro()方法是用来进行猜大小游戏的,它创建了一个Random类对象,并调用它的nextInt()方法来生成一个0~100之间的随机数,存放到num变量中,并输出。游戏者有10次试猜机会,每次接收到包含试猜答案的数据包后,都先把试猜答案输出,再将其转化为int型数与num比较大小,根据大小情况向客户端返回相应提示信息,同时也在服务器端输出。如果答案完全匹配,返回答案正确的提示信息,否则继续进行游戏。如果超过10次未猜对,也结束游戏,并向客户端返回正确答案。Client类Client类其中定义了10个成员变量和4个成员方法。serv变量用于存储套接字,port变量存储端口号,info数组存放接收到的数据包中的信息,rec变量存储接收到的数据包,snd变量存储要发送的数据包,msg变量存储要发送或提取出的信息,localHost变量存储本地主机的IP地址,host变量存储服务器的IP地址,IP变量是服务器IP地址的字符串形式,IPAddr数组是服务器IP地址的字节数组形式。main()方法是主方法,用于创建套接字,选择游戏,控制程序的终止;playGuessZimu()方法是进行猜字母游戏的方法;playGuessPro()方法是进行猜大小游戏的方法;toIPAddr()方法用于将字符串形式的IP地址转换为字节数组形式。在main()方法中,首先调用toIPAddr()方法,将存储服务器IP地址第1个参数,转存到字节数组中,再把第2个参数转化为端口后,据此创建一个套接字和存储服务器地址的InetAddress类对象host。然后调用InetAddress类对象的getLocalHost()方法,获得本机IP地址,并传送给服务器,告知服务器要加入游戏。然后,接收服务器发来的数据包,根据其中的提示信息,选择游戏或退出程序。如果输入的是“quit”指令,则终止程序,关闭套接字;如果输入的是1,选择玩猜字母游戏,调用playGuessZimu()方法;如果输入的是2,选择玩猜大小游戏,调用playGuessPro()方法。playGuessZimu()方法负责猜字母游戏的发送和接收,每次试猜,它都完成以下过程:将键盘键入的数据封装到数据包,发送给服务器,再接收服务器的回复。提取其中的匹配情况信息,并输出,再把存储试猜次数的cnt变量加1。如果完全匹配,输出答案正确的提示信息,终止游戏,否则继续游戏。如果已经试猜10次,将服务器返回的正确答案输出,再终止游戏。playGuessPro()方法负责猜大小游戏的发送和接收,其运行与处理过程与playGuessZimu()方法类似。toIPAddr()方法将一个存储IP地址的字符串转化为字节数组。它从字符串的尾部开始向前搜索,在遇到“.”号前所搜索到的数字都是属于IP地址的某一段,将它累加到变量t中。直到遇到“.”号,将t清零后重新开始累加。4系统测试和使用说明4.1系统测试使用JDK运行程序时,将server子目录和client子目录下分别放在两台计算机上。分别用来做服务器和客户端。在服务器端的计算机上打开一个DOS窗口,使用命令:JavacServer.java用来编译服务器上的源代码。使用命令:javaServer6666运行服务器程序Server,启动服务器端,DOS窗口显示:网络益智游戏——服务器,如图5所示:图5服务器运行界面在另一台客户端的计算机上打开另一个DOS窗口,输入命令:javacClient.java进行编译然后输入命令:javaClient26666运行第客户端程序,Client执行后,windows窗口会显示如图6所示:图6客户端程序的运行界面4.2系统使用说明由于字母和数字都是随机产生的,我们猜测字母的时候只能依靠我们子的运气去随机猜测,猜数字大小的时候,我们可以根据服务器给我们发过来的信息,来猜测。5课程设计总结5.1遇到的问题和解决方法在用JAVA编写程序时,我遇到了很多困难,如怎样用Socket类实现客户端和服务器端的通信,怎样来把字符串转换为一个个的字符。通过查阅相关书籍以及在网上搜索资料,我们了解到要使用类中的MessageListenning来负责侦听客户端的消息,使用Thread类创建线程接收客户端发出的消息,使用MulticastSendingThreas类向客户端广播消息。在本系统中,我们用到了前者。设计是以Java独立应用程序来实现的,程序中要捕获异常,就要用到多种捕获异常类,这些类是在J2SE编程环境下自动引入的java.lang包类的异常类。5.2心得体会在这次的面向对象程序设计中,我主要运用了JAVA语言的多线程、异常处理、网络传输等,综合运用了JAVA语言。我深刻感受到了面向对象语言中类库的强大功能,掌握了运用JAVA中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。这次设计中,再一次让我感受到了网络通信中服务器和客户相互通信的特点,同时也加深了对网络通信知识的理解。通过这次为时二周的课程设计,我学到了很多的东西,下面就这在这次课程设计中的心得体会总结如下:在这次的面向对象程序设计中,主要是运用JAVA语言来编写,并可运用其他的技术。在我的系统中,还采用了多线程、异常处理、网络传输等技术,而这些知识都是我们没有学过的,这就要求我们去查阅相关书籍。正因为这样,才锻炼了我的自学能力,为以后的学习打下了基础。这次设计中,我深刻感受到了面向对象语言中类库的强大功能,掌握了运用JAVA中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。同时,我也感受到了网络通信中服务器和客户相互通信的特点,加深了对网络通信知识的理解,拓宽了我的知识面。通过二周的努力,这次课程设计圆满的结束了,在这个过程中,我学到了很多的知识,同时也非常感谢杭志老师帮助与指导。在以后的学习中,我会更加努力的学好专业知识,并将所学知识用于实践当中去,以便牢固掌握知识。6参考文献[1]陆光义,先锋.Java游戏编程导学.北京:清华大学出版社,2004[2]飞思科技产品研发中心.精通Java.北京:电子工业出版社,2004[3]朱福喜等.Java项目设计与开发范例.电子工业出版社,2005[4]RobertC.Martin著,黄晓春译.UMLFORJAVAPROGRAMMERS.清华大学出版社,20047附录(1)基本类的程序代码:①Server类的代码:import.*;importjava.io.*;importjava.util.*;importjava.lang.String.*;//服务器类publicclassServer{ //存储套接字 staticDatagramSocketserv; //存储端口号 staticintport; //存放接收到的数据包中的信息 staticbyte[]info=newbyte[1000]; //存储接收到的数据包 staticDatagramPacketrec=newDatagramPacket(info,info.length); //存储要发送的数据包 staticDatagramPacketsnd; //存储要发送或提取出的信息 staticStringmsg; //主方法 publicstaticvoidmain(String[]args){ System.out.println("网络益智游戏——服务器"); try{ //将第1个参数转化为端口号 port=(int)Float.parseFloat(args[0]); //创建套接字 serv=newDatagramSocket(port); //等待客户端连接 serv.receive(rec); //输出加入游戏的计算机的IP地址 msg=newString(rec.getData(),0,rec.getLength()); System.out.println(msg+"加入游戏"); while(true){ //发送消息,让客户端选择要玩的游戏 msg="请选择游戏:1.猜字母2.猜大小"; //数据封装 byte[]buf=msg.getBytes(); snd=newDatagramPacket(buf,buf.length,rec.getAddress(),rec.getPort()); serv.send(snd); //发送 serv.receive(rec); //接收客户端的回复 msg=newString(rec.getData(),0,rec.getLength()); //如果是“quit”指令,终止程序 if(pareTo("quit")==0){ break; } //如果是“1”,选择猜数字游戏 if(pareTo("1")==0){ guessZimu(); } //是“2”,选择猜大小游戏 else{ guessPro(); } } //关闭套接字 System.out.println("断开连接……"); serv.close(); }catch(SocketExceptionse){ se.printStackTrace(); }catch(IOExceptionie){ ie.printStackTrace(); } } //猜字母游戏的方法staticvoidguessZimu(){//储存生成的随机字母charzimu;//储存客户端发送来的答案charans=0;inti;System.out.println("开始进行猜字母游戏……");//生成随机的字母zimu=getZimu();//输出生成的随机字母System.out.println(zimu+"");System.out.println(ans+"");//进行游戏for(i=1;i<=10;i++){//接受客户端发来的数据包try{serv.receive(rec);}catch(IOExceptionie){ie.printStackTrace();}//数据包中提取答案msg=newString(rec.getData(),0,rec.getLength());char[]chars=msg.toCharArray();ans=chars[0];//输出答案System.out.println("第"+i+"次的答案:");System.out.println(ans+"");//调用judge()方法判断答案的匹配情况if(judge(zimu,ans)==1){//如果答案完全匹配,返回正确的提示信息msg="恭喜你猜对了!";System.out.println("答案正确");byte[]buf=msg.getBytes();snd=newDatagramPacket(buf,buf.length,rec.getAddress(),rec.getPort());try{serv.send(snd);}catch(IOExceptionie){ie.printStackTrace();}break;}}//如果超过10次未猜对,结束游戏if(i>10){//生成正确的答案char[]n=newchar[1];Stringstr=newString(n);//返回游戏结束的提示信息msg="没机会了,正确答案是:"+str;System.out.println("游戏结束");byte[]buf=msg.getBytes();snd=newDatagramPacket(buf,buf.length,rec.getAddress(),rec.getPort());try{serv.send(snd);}catch(IOExceptionie){ie.printStackTrace();}}}//猜大小游戏的方法 staticvoidguessPro(){ intnum,i,j,t; System.out.println("开始进行猜大小游戏……"); Randomrnd=newRandom(); //生成一个0~100的随机数(不含100) num=rnd.nextInt(100); //输出生成的随机数 System.out.println("生成的随机数:"+num); try{ //进行游戏 for(i=1;i<=10;i++){ //接收客户端发来的数据包 serv.receive(rec); //提取其中的答案 msg=newString(rec.getData(),0,rec.getLength()); //将其转化为整数形式 t=(int)Float.parseFloat(msg); //输出答案 System.out.print("第"+i+"次的答案:"+msg+""); //根据不同情况,返回相应的信息 if(t<num){ msg="小了,再大点!"; } elseif(t>num){ msg="大了,再小点!"; } else{ msg="恭喜你猜对了!"; } System.out.println("结果:"+msg); //数据封装 byte[]buf=msg.getBytes(); snd=newDatagramPacket(buf,buf.length,rec.getAddress(),rec.getPort()); //发送 serv.send(snd); //如果答案正确,输出提示信息,终止游戏 if(t==num){ System.out.println("答案正确"); break; } } //如果超过10次未猜对,也终止游戏 if(i>10){ //生成正确答案 char[]n=newchar[2]; n[0]=(char)(num/10+48); n[1]=(char)(num%10+48); Stringstr=newString(n); msg="没有机会了,正确答案是:"+str; System.out.println("游戏结束"); byte[]buf=msg.getBytes(); snd=newDatagramPacket(buf,buf.length,rec.getAddress(),rec.getPort()); serv.send(snd); } }catch(IOExceptionie){ ie.printStackTrace(); } }//判断答案匹配情况的方法staticcharjudge(charzimu,charans){inta=2;if(ans==zimu){a--;}else{msg="你答错了";byte[]buf=msg.getBytes();snd=newDatagramPacket(buf,buf.length,rec.getAddress(),rec.getPort());try{serv.send(snd);}catch(IOExceptionie){ie.printStackTrace();}}//如果答案匹配,则返回1if(a==1){return1;}//否则返回0else{return0;}} //生成随机数的方法 staticchargetZimu(){ //zimu数组存储生成的随机数 Randomrandom=newRandom(); intr=0;r=random.nextInt(57)+65;while(r>90&&r<97||r==0)r=random.nextInt(57)+65;charzimu=(char)r;returnzimu;}} ②Client类的代码:import.*;importjava.io.*;//客户端类publicclassClient{ //存储套接字 staticDatagramSocketclient; //存储端口号 staticintport; //存放接收到的数据包中的信息 staticbyte[]info=newbyte[1000]; //存储接收到的数据包 staticDatagramPacketrec=newDatagramPacket(info,info.length); //存储要发送的数据包 staticDatagramPacketsnd; //存储要发送或提取出的信息 staticStringmsg; //localHost变量存储本地主机的IP地址 //host变量存储服务器的IP地址 staticInetAddresslocalHost,host; //服务器IP地址的字符串形式 staticStringIP; //服务器IP地址的字节数组形式 staticbyte[]IPAddr=newbyte[4]; //主方法 publicstaticvoidmain(String[]args){ System.out.println("网络益智游戏——客户端"); try{ //第1个参数为服务器IP地址,将其转存到字节数组中 IP=args[0]; toIPAddr(); port=(int)Float.parseFloat(args[1]); //获得服务器IP地址 host=InetAddress.getByAddress(IPAddr); //获得本机IP地址 localHost=InetAddress.getLocalHost(); //创建套接字 client=newDatagramSocket(port); //将本机IP地址传送给服务器 msg=localHost.getHostAddress(); //数据封装 byte[]buf=msg.getBytes(); snd=newDatagramPacket(buf,buf.length,host,port); //发送 client.send(snd); while(true){ //接收服务器的发送来的数据包 client.receive(rec); //从数据包中提取消息并输出 msg=newString(rec.getData(),0,rec.getLength()); System.out.println(msg); //选择要玩的游戏,并告知服务器 BufferedReaderbufRdr=newBufferedReader(newInputStreamReader(System.in)); System.out.print("请输入:"); msg=bufRdr.readLine(); buf=msg.getBytes(); snd=newDatagramPacket(buf,buf.length,host,port); client.send(snd); //如果输入的是“quit”指令,终止程序 if(pareTo("quit")==0){ break; } //如果输入的是1,选择玩猜字母游戏 if(pareTo("1")==0){ playGuessZimu(); } //如果输入的是2,选择玩猜大小游戏 else{ playGuessPro(); } } //关闭套接字 System.out.println("断开连接……"); client.close(); }catch(UnknownHostExceptionue){ ue.printStackTrace(); }catch(SocketExceptionse){ se.printStackTrace(); }catch(IOExceptionie){ ie.printStackTrace(); } } //进行猜字母游戏的方法 staticvoidplayGuessZimu(){ System.out.println("开始进行猜数字游戏……"); //记录试猜的次数 intcnt=0; try{ do{ //输入本次试猜的答案 BufferedReaderbufRdr=newBufferedReader(newInputStreamReader(System.in)); System.out.print("第"+(cnt+1)+"次试猜:"); msg=bufRdr.readLine(); //数据封装 byte[]buf=msg.getBytes(); snd=newDatagramPacket(buf,buf.length,host,port); //发送 client.send(snd); //接收服务器的回复 client.receive(rec); //提取答案匹配情况 msg=newString(rec.getData(),0,rec.getLength()); //输出答案匹配情况 System.out.println("结果:"+msg); //试猜次数加1 cnt++; //如果完全匹配,输出答案正确的提示信息,终止游戏 if(pareTo("恭喜你猜对了!")==0){ if(cnt<=3){ System.out.println("你真是个天才!"); } elseif(cnt<=6){ System.out.println("还不错,是个人才!"); } elseif(cnt<=8){ System.out.println("还将就,你赢了!"); }else{ System.out.println(); } break; } //如果已经试猜10次,也终止游戏 elseif(cnt==10){ client.receive(rec); msg=newString(rec.getData(),0,rec.getLength()); System.out.println(msg); break; } }while(true); }catch(IOExceptionie){ ie.printStackTrace(); } } //进行猜大小游戏的方法 staticvoidplayGuessPro(){ System.out.printl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学习贯彻党的XX届一中全会精神模板
- 二零二五年度产权置换简易房屋买卖合同3篇
- 研发部门年终总结
- 二零二五年度房地产开发项目合伙人股权入股合同范本9篇
- 基于结构化主题的单元整体教学-以小学数学学科为例
- 二零二五年度房产抵押贷款合同范本一(房屋抵押借款合同模板)15篇
- 四川省绵阳市江油市2024-2025学年八年级上学期期末教学质量监测道德与法治试题(含答案)
- 陕西省宝鸡市凤翔区2024-2025学年八年级上学期期末质量检测道德与法治试卷(含答案)
- 白岭矿硐提升改造及萤石精粉浮选项目可行性研究报告模板-立项备案
- 湖南省常德市高中学校联盟2024-2025学年高一上学期期末质量检测地理试题( 含答案)
- 银行资产保全员工年度工作总结
- 钢结构网架验收施工质量自评报告-副本
- 《修心三不 不生气 不计较 不抱怨》读书笔记思维导图
- 妊娠剧吐的护理查房
- GB/T 5023.5-2008额定电压450/750 V及以下聚氯乙烯绝缘电缆第5部分:软电缆(软线)
- GB/T 36127-2018玉雕制品工艺质量评价
- GB/T 23445-2009聚合物水泥防水涂料
- 漆画漆艺 第三章
- (完整版)100道凑十法练习题
- 光伏逆变器一课件
- 2023年上海师范大学辅导员招聘考试笔试题库及答案解析
评论
0/150
提交评论