《龟兔赛跑程序的设计报告(共18页).doc》由会员分享,可在线阅读,更多相关《龟兔赛跑程序的设计报告(共18页).doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上乔文东 计算机科学与技术 001目录专心-专注-专业前言在科技日新月异的今天,电脑成为人的生活中不可缺少的一部分。作为计算机专业的学生,应该充分利用所学知识,把实际问题转移到电脑上去,通过电脑的编程,使复杂问题简单化,深奥问题浅显化,抽象问题具体化。在学过Java程序设计语言后,我们对计算机有了更深的了解。是一种简单的,的,的,的,解释的,健壮的安全的,结构的中立的,可移植的,性能很优异的的,动态的语言。当1995年推出之后,全世界的目光都被这个神奇的语言所吸引。Java 不同于一般的和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖
2、各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。本次课设我选择的是龟兔赛跑游戏的制作。这个游戏实际上主要是对我们JAVA学习中的线程部分的考察,尤其是多线程的定义,运行等。同时还要保证游戏有一个真实的操作界面和人性化操作设计。在设计龟兔赛跑这个游戏中我也遇到了技术上的一些困难,但通过查阅资料,并且在老师的帮助下最终问题得以解决。正如龟兔赛跑这个故事一样,虽然我们在技术上不是很优秀,但只要有乌龟一样坚持不懈的精神,最终胜利到达终点。乔文东 计算机科学与技术 001工程概况2.1 项目所用的时间从这个项目开始到结束总共历时12天。完成于2015年6月19日。2
3、.2项目负责人肖肖,女,计算机科学与技术17-4,学生。2.3 项目指导人高贤强,男,信息工程学院教师,讲师。正文3.1 设计的目的和意义本设计要求学生开发一个龟兔赛跑游戏,主要是对学生多线程编程、游戏方案设计、游戏背景及动漫制作等能力进行培养锻炼,同时还要求保证游戏有一个真实的操作界面和人性化操作设计。此外,学生通过该题目的设计过程,可以初步应用软件系统的开发原理和开发方法,全面培养软件开发过程中的分析、设计、编码、测试及文档规书写的能力,得到软件工程的训练,提高解决实际问题的能力。(1)有助于加深我们对Java程序设计这门课程的理解,我们在课堂上学的都是基础理论知识,对于如何用程序语言来描
4、述所学知识还是有一定的难度。通过课程设计,我们可以真正理解其涵。(2)有利于我们逻辑思维的锻炼,程序设计能直接有效地训练学生的创新思维、培养分析问题、解决问题的能力。即使是一个简单的程序,依然需要学生有条不紊的构思。(3)有利于培养严谨认真的学习态度,在程序设计的过程中,当我们输入程序代码的时候,如果不够认真细心,那么就可能导致语法错误,从而无法得出运行结果。那么,这个我们反复调试,反复修改的过程,其实也是对我们认真严谨治学的一个锻炼。3.2 目标与总体方案(1)用图形用户界面实现游戏界面,同时通过设置布局,背景,字体等来丰富界面,最大程度的模拟龟兔赛跑的场景。 (2)能设置比赛时间,龟兔的数
5、量等等,实现对比赛中龟兔的数量,比赛时间等参数的设置。 (3)在任意时间段龟兔的速度是随机的,为了模拟龟兔赛跑结果的不确定性,在游戏开始后乌龟和兔子的速度都是通过随机函数产生的,保证兔子比乌龟速度要快,兔子在赛跑途中看到乌龟落后下会偷懒睡觉的前提下给予乌龟,兔子以随机的速度,从而使得游戏的结果不确定,给用户更多的游戏的真实感。 (4)开始比赛之后以动画显示赛跑过程,用户进入游戏界面后,先选择游戏模式,然后单击开始按钮,乌龟和兔子将会以随机的速度开始朝终点线爬行,通过重复刷新技术达到动画效果,给用户更逼真的感官。 (5)系统的开发可以采用Java语言来实现; (6)在基本要求达到后,可进行创新设
6、计,如改善算法性能、友好的人机界面。3.3 设计方法和容3.3.1开发环境硬件环境:一台清华同方电脑,其配置为:CPU: Intel(R) Core(TM) i5-4570 3.2GHz 存:4G 硬盘:500G 主板:4260LA-2922P软件环境:Windows 7旗舰版版本2009 Service Pack 1,并且安装了可供编程的eclipse-standard-kepler-SR1-win323.3.2设计方法赛跑的过程是两个比赛对象并行前进的过程,考虑到应用需求,我们可以利用多线程技术,所谓多线程就是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,这与要求刚好吻合,Ja
7、va语言对多线程提供强大的支持。用直观图形描述龟兔赛跑前进过程:每过一秒,兔子走过的文本框中增加三个“#”号,乌龟走过的路程文本框中增加一个“#”号。跑完路程结束线程,并显示各自跑完全程总共用的时间。3.3.3主体容一、设计分析第一步:设计良好游戏界面功能:实现基本的开始、退出游戏功能、选择游戏模式等。基本步骤:在其上添加图3.3.3.1 基本步骤1在实现过程中会遇到的问题及解决方案:1、背景面板上加载图片时需要重写paintComponent方法2、布局必须合理设置(GridLayout不能改变组件的具体位置但可以缩放时相对位置不变。FlowLayout默认是占满第一行转向第二行,并且放大时
8、相对位置改变。Null布局可以自由布置组件位置和大小,但不易实现窗口放大时相对大小随之变化。)若设置不合理,就可能出现多种错误。列如:无法插入背景图片,组建不能显现,组件位置与设计不符等等。 3、添加背景面板监听重置各面板位置才能实现窗口放大时的相对位置不变第二步:线程类的设计功能:实现多只乌龟,兔子的多线程运行具体步骤:图3.3.3.2基本步骤2第二步会遇到的问题及解决方案:1、建立兔子线程,继承接口Runnable并正确的实现run()方法。同时要特别注意兔子在比赛中还要模拟睡觉的动作。2、建立乌龟线程,继承接口Runnable并实现其run()方法,要与兔子多线程运行;3、为了实现可选择
9、多只龟兔进行赛跑,要实现多个兔子,乌龟线程,并能并发运行。4、游戏中提供了模式选择的功能,通过建立ItemSelect类来建立不同的游戏模式。二、各模块的功能及程序说明龟兔赛跑程序主要由以下几个模块构成:模块一:初始图形界面模块public class RRTT extends Applet implements ActionListener Graphics g; Panel panel; Label label1,label2,label3; Button button1,button2; RabTor1 rabTor1; public void init()/Applet中的初始化函数有
10、类中构造函数的作用!最先调用! panel=new Panel();panel.setLayout(new FlowLayout();label1=new Label(欢迎使用该软件,1.0版本,不足之处,请多多指教!);label2=new Label(*东瑞制作*程序员*杰*);label3=new Label();button1=new Button(进入游戏);button2=new Button(退出游戏);button1.addActionListener(this);button2.addActionListener(this);setLayout(new BorderLayou
11、t();panel.add(button1);panel.add(label3);panel.add(button2);add(label1,BorderLayout.NORTH);add(label2,BorderLayout.SOUTH);add(panel,BorderLayout.CENTER); public void actionPerformed(ActionEvent e) if(e.getSource()=button1) rabTor1=new RabTor1(); /dispose();else if(e.getSource()=button2) System.exit(
12、0); 该模块主要是用来提供进入该程序游戏的初始图形用户界面,显示该程序的基本信息,提示用户进行操作。模块二:兔子线程模块该模块主要是实现兔子运行线程,类RabbitThread 继承了接口Runnable并实现其方法run(),主要有两个功能的实现:1.来为兔子定义随机速度x1=x1+(int)(Math.random()*30);2.兔子动的实现方法if(threadName.equals(rabbit)&x1=800) int t1=0,t2=0; str1=rabbit; x1=x1+(int)(Math.random()*30); rab_time=rab_time+1; rab_r
13、oad+=(int)(Math.random()*25); 3.兔子获得一个随机的时间睡眠(030秒)str1=乌龟跑这么慢,我先睡一会; str2=哼,别以为自己是兔子就了不起!你就睡吧!; rabbit = getImage( getCodeBase(),4.jpg); try t1=(int)(Math.random()*30000); Thread.currentThread().sleep(t1); catch (InterruptedException e)模块三:乌龟线程模块该模块主要是实现乌龟运行线程,类TortoiseThread继承了接口Runnable并实现其方法run(
14、),主要功能的实现:乌龟移动实现的方法!else if(threadName.equals(tortoise)&x2140&x2255&x2480&x1580) str2=就快到终点了,我要坚持下去,坚持就是胜利!;通过随机函数实现乌龟随机速度爬行。模块四:画布界面的设置与布局class Imagecanvas extends Canvas Toolkit tool; Image image1; Imagecanvas() setSize(800,500); tool=getToolkit(); image1=tool.getImage(6.gif); public void paint(Gr
15、aphics g) g.drawImage(image1,10,10,image1.getWidth(this),image1.getHeight(this),this); public Image getImage() return image1; 三、操作方法及试验结果: (第一局比赛开始) (兔子领先) (兔子胜利) (第二局比赛开始) (兔子中途睡觉) (乌龟反超兔子,最终胜利)3.3.4设计体会 本系统是一个基于多线程模式的龟兔赛跑小游戏,系统的规模很有限,功能实现也相对简单,但作为一个完整的系统,在整个过程中我还是学到了不少的知识,也对java语言有了较深的体会。通过本次课设试验,
16、我对java的熟练程度得到了很大的提升,对包括多线程在的java语言高级技术掌握的也更加熟练了,更对面向对象的分析思想,面向对象的设计方法有了直观的体会。同时,在游戏的制作过程中要用到很多课本上并未介绍到的知识,例如多线程队列事件等等,通过网络学习和与老师同学的交流使得自己对该部分的知识有了更广泛更深刻的体会。当然本次课设,通过我不断的尝试,不断的修改错误,解决问题,终于明白了程序员生活中天堂与地狱的感觉是什么了。虽然这个过程很苦,但我对java的熟练程度得到了很大的提升。同时,在游戏的制作过程中要用到很多课本上并未介绍到的知识,如当我遇到如何在一个Japplet类中创建另外一个Applet类
17、的对象并运行线程的问题时,我纠结了很久没能找到解决办法,最终通过上网百度,不断尝试,不断错,在不断改,终于解决了。通过网络学习使得自己对该部分的知识有了更广泛更深刻的体会。这次的课程设计时间有点短,仅有二周的时间。在调试过程中屡调屡败的状态下,老师给了我热情的帮助,老师指导我们调试程序,说哪些是错的,哪些是多余的,哪些是必要的,一个杂乱无章的程序被修改得有条不紊,很显然结果也是最最正确的。本次系统的功能相对还比较单一,只能选择两种游戏模式,并且游戏也相对单调,缺乏趣味性,离一个真正的游戏软件还相差很远,以后如有时间,可以考虑去做一个真正的游戏软件。3.4 设计创新与关键技术 3.4.1 设计创
18、新1、用图形用户界面实现游戏界面;通过使用java中Jlabel,Jbutton,JtextArea,JcomboBox等swing组件来实现图形用户界面,同时通过设置布局,背景,字体等来丰富界面,最大程度的模拟龟兔赛跑的场景。2、能设置比赛时间,龟兔的数量等等。通过组合框组件的使用以及事件的订阅来实现用户对不同游戏模式的选择,在本程序中只是简单的设计了两种游戏模式供用户选择,也一定程度上实现了对比赛中龟兔的数量,比赛时间等参数的设置。3、在任意时间段龟兔的速度是随机的。为了模拟龟兔赛跑结果的不确定性,在游戏开始后乌龟和兔子的速度都是通过随机函数产生的,当然,我们会在保证兔子比乌龟速度要快,兔
19、子在赛跑途中看到乌龟落后下会偷懒睡觉的前提下给予乌龟,兔子以随机的速度,从而使得游戏的结果不确定,给用户更多的游戏的真实感。4、开始比赛之后以动画显示赛跑过程。用户进入游戏界面后,先选择游戏模式,然后单击开始按钮,乌龟和兔子将会以随机的速度开始朝终点线爬行,通过java中重复刷新技术达到动画效果,给用户更逼真的感官。3.4.2 关键技术游戏中提供了模式选择的功能,通过建立ItemSelect类来建立不同的游戏模式。 建立兔子和乌龟线程,继承接口Runnable并正确的实现run()方法。3.5结论程序的语法错误很容易查找和修改,但找出了语法错误并不代表程序已经完成。很多编译错误是由于函数名或变
20、量名等程序对象的拼写错误引起的。在编写程序的过程中,需要认真仔细,以免出现拼写错误,增加调试程序的工序,浪费不必要的时间和精力。在这个过程中,我收获颇多,不仅理论知识掌握的更牢,实际动手能力也有所提高,再次让我感受到Java语言强大的功能,更激发了我Java语言的兴趣。如果说以前的编程仅仅是按照课本的要求进行的,那这个课程设计难度就提高了一个级别,它让们将所知道的知识联系到了一起,更加显示了程序的强大。致谢首先我要感谢我的老师在课程设计上给予我们的指导和提供给我们的支持和帮助,这是我们能顺利完成这次课程设计的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我们能把程序做得更加完善。在此期
21、间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。其次,我要感谢曾经帮助过我的同学,他们也为我解决了不少我不太明白的设计语言,和一些细节上的差错。本次设计是在高贤强老师的悉心指导下完成的,老师渊博的知识,严谨的治学态度,一丝不苟的工作作风,平易近人的性格都是我们学习的楷模。在论文的整理期间,高老师给了我们很多的意见和指导,才使得论文得以顺利的完成。最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学。在此,我诚心的对所有帮助过我的老师同学们说一句:谢谢!参考文献1 丁振凡Java语言使用教程. 北京大学,2006.9 2 丁振凡Java语言使用教程实验指导. 北京大学,2
22、006.9 3 Bruce Eckel Java编程思想. 机械工业 2007.6 4 耿祥义 JAVA2实用教程.清华大学 2009.55 国君 java 程序设计基础(第二版) 清华大学6 艺,吴英Java程序设计大学教程 M北京:科学,2005年7 文靖.Java程序设计基础与上机指导.北京:清华大学,2006年.8 吴其庆.Java程序设计实例教程.北京:冶金工业,2006年.9 耿祥义,跃平Java基础教程(第2版) M北京:清华大学,2007年10 美Bruce Eckel. Thinking In Java.英文第4版.北京:机械工业,200711 昭编著.二级Java语言程序设
23、计教程.北京:中国水利水电,200612 文靖编著.Java程序设计基础与上机指导.北京:清华大学,200613 海藩.软件工程导论(第四、五版)M.北京:清华大学,2008.14Cay SandGaryC.Java2核心技术(卷1:基础知识)M.机械工业,2003.15邓光伟,阿午,朱志.Java2核心技术(卷2:高级特性)M.机械工业,2000.16WatsonK,NagelC,齐立波.C#入门经典M.清华大学,2002.17广彬,孟红蕊,永宝.C+课程设计案例精编M.清华大学,2005.18朱喜福.C+程序设计M.人民邮电,2005.19宛延闿.实用C+程序设计教程M.机械工业,2006
24、.附录源程序package sxx; import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import javax.swing.JApplet;import java.awt.*;import java.awt.event.*;import java.util.Arrays;import java.lang.*;import java.applet.Applet;import java.applet.AudioClip;import .URL; SuppressWarnings( unused, serial
25、 )class Imagecanvas extends Canvas Toolkit tool; Image image1; Imagecanvas() setSize(800,500); tool=getToolkit(); image1=tool.getImage(6.gif); public void paint(Graphics g) g.drawImage(image1,10,10,image1.getWidth(this),image1.getHeight(this),this); public Image getImage() return image1; /*public cl
26、ass frame extends Frame implements ActionListenerPanel panel;Label label1,label2,label3;Button button1,button2; RabTor1 rabTor1;frame()panel=new Panel();panel.setLayout(new FlowLayout();label1=new Label(欢迎使用该软件,1.0版本,不足之处,请多多指教!);label2=new Label(*东瑞制作*程序员*肖肖*);label3=new Label();button1=new Button(
27、进入游戏);button2=new Button(退出游戏);button1.addActionListener(this);button2.addActionListener(this);/label1.setText(欢迎使用该软件,1.0版本,不足之处,请多多指教!);/label2.setText(*东瑞制作*程序员*肖肖*);setLayout(new BorderLayout();panel.add(button1);panel.add(label3);panel.add(button2);add(label1,BorderLayout.NORTH);add(label2,Bord
28、erLayout.SOUTH);add(panel,BorderLayout.CENTER);addWindowListener(new WindowAdapter() public void WindowClosing(WindowEvent e) System.exit(0); ); setBounds(300,200,300,200); setVisible(true); validate(); public void actionPerformed(ActionEvent e)if(e.getSource()=button2) rabTor1=new RabTor1();*/packa
29、ge sxx;import java.applet.AudioClip;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import .URL;import javax.swing.JApplet; SuppressWarnings(serial)public class RabTor1 extends JApplet implements Runnable Graphics g; int i=1; Image backpic,rabbit,tortoise,zhongdian,tortoise2,rab
30、bit2; int x1=0,y1=80,j=0; int x2=0,y2=180;/图片的位移! int rab_road=0,tor_road=0;/图片跑的路程! double rab_time=0.0,tor_time=0.0;/图片移动用的时间 String str1=rabbit,str2=tortoise;/给字符串付初值! setSize(800,400); /为什么没用? public void init()/Applet中的初始化函数有类中构造函数的作用!最先调用! backpic = getImage(getCodeBase(), 起跑.jpg);/将图片对象与图片 绑定
31、! rabbit = getImage( getCodeBase(),兔子.gif); tortoise = getImage(getCodeBase(), 乌龟.jpg); zhongdian = getImage(getCodeBase(), 乌龟赢了.png); tortoise2 = getImage(getCodeBase(),小乌龟.jpg); rabbit2=getImage(getCodeBase(),兔子在前.jpg); /rabbit3=getImage(getBase(),3.jpg); public void paint(Graphics g)/此函数第四个调用! th
32、is.g=g; setSize(760,360); if(i=1) g.drawImage(backpic, 0, 0, 800, 600, this); g.setColor(Color.green); g.fillRect(0, 0, 1600, 800);/填充矩形 g.setColor(Color.red); g.drawString(-背景音乐肖肖制作,30,30); g.drawLine(0,75,600,75);/画跑道 g.drawLine(0,160,600,160); g.drawLine(0,260,600,260); g.drawLine(603,80,603,300)
33、; g.drawRoundRect(0,10,680,300,60,60);/圆角矩形 g.setColor(Color.black); g.drawImage(rabbit, x1, y1, 60, 60, this); g.drawString(str1, x1, y1+80); g.drawImage(tortoise, x2, y2, 60, 60, this); g.drawString(str2, x2, y2+80); g.drawImage(zhongdian, 600, 0, 60, 80, this); else if(i=2) g.drawImage(tortoise2,
34、 600, 60, 60, this); /*else if(i=3) int x3=245,y3=80; g.drawImage(rabbit2,600,80,60,60,this); else int x4=490,y4=80; g.drawImage(rabbit2,x4,y4,60,60,this); */ /System.out.println(j); public void update(Graphics g)/用不到! public void start()/此函数第二个调用! Thread rab = new Thread(this, rabbit);/创建一个兔子线程,thi
35、s表示在这个类中找.rabbit是线程的名子. Thread tor = new Thread(this, tortoise); rab.start();/线程对象调用start()方法!然后调用对应的run()方法! tor.start(); /*public void stop() tryrab.stop(); rab=null; tor.stop(); tor=null; catch(Exception e) */ /为什么没用? /public void destroy() / public void run()/此函数第三个调用! URL codebase=getCodeBase()
36、; System.out.println(codebase); AudioClip audio1=getAudioClip(codebase,龟兔赛跑.wav); g.drawString(-背景音乐鲁晶晶制作,30,30); audio1.loop(); boolean stop=false;/标志,此函数的精典之处.控制兔子,龟什么时候停! while(!stop) try Thread.currentThread();Thread.sleep(1000);/当前线程调用sleep()函数. catch (InterruptedException ex) String threadName=Thread.currentThread().getName();/取得当前线程的名子. if(threadName.equals(rabbit)&x1=120&x1=140&x1=120&x1140) rabbit = getImage( getCodeBase(),rabbit.gif); if(x1=240&x1=250) str1=乌龟跑这么慢,让我再睡一会吧; str2=哼,别以为自己是兔子就了不起!你就睡吧!;