实训报告贪吃蛇游戏.doc_第1页
实训报告贪吃蛇游戏.doc_第2页
实训报告贪吃蛇游戏.doc_第3页
实训报告贪吃蛇游戏.doc_第4页
实训报告贪吃蛇游戏.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河南理工大学计算机科学与技术学院实训报告2009 2010学年第2学期课程名称 Java编程技术 设计题目 贪吃蛇游戏 学生姓名 马来同 学 号 410920050166 专业班级 计信09-1班 指导教师 霍占强 2010 年 07 月06日11目 录目 录目 录I第1章基础知识11.1Java面向对象基础11.2AWT组件21.3线程31.4监听器31.5MVC开发模式4第2章功能实现62.1蛇的定时移动62.2在窗体中改变蛇的移动方向82.3蛇吃到食物身体加长82.4蛇吃到石头或自己的身体时停止移动9总 结11第1章 基础知识第1章 基础知识1.1 Java面向对象基础面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。 它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。面向对象常用的设计技巧:1. 类的设计建议:(1) 在使用Java语言编写类的过程中,一般在一个.java源文件只编写一个类,如果确实存放多个类,则同一个文件中也只能有一个类用public修饰符修饰的,并且此类与文件同名。(2) 在完成某些业务逻辑方法时,最好利用一些优秀算法是代码短小精悍。2. 类名、变量名、方法名的选取(1) 类名、变量名、方法名一般都是用英文标识符标识,不要用中文名取名。类名的首字母应该大写,变量和方法的首字母用小写。对于所有标识符,其中包含的所有单词都应该紧靠在一起,对于中间单词的首字母采用大写,也就是所谓的“骆驼命名法”。如:类名可以选取:ThisIsMyClassName,属性名:studentName等。(2) 类名、变量名、方法名的取名最好有意义,不要随便取名。这样便于以后阅读代码,如类名取名为Person,方法名取名为getName,变量名取名为age,编程人员阅读此代码便知道是一个关于人的类,里面有一个年龄的变量和一个获取姓名的方法。3. 类的素性设计建议:(1) 将类的属性设置为私有的在设置类的过程中,最重要的是不能破坏面向对象的封装性。针对类的属性,一般都是把它设置成私有的,提供共有的设置方法和取值方法。(2) 一定要对局部变量进行默认的初始化,不会对局部变量进行默认初始化。在设计类的过程中最好不要依赖于默认的初始值,而是应该显示的初始化成员变量和局部变量。(3) 若在定义中出现了常量初始化字符,则在Static finally修饰的基本类型标识符中大写所有字母,如public finallyString PI=3.14。(4) Java包(Packgae)的命名属于一种特殊情况:全都用小写字母命名,即便中间单词的首字母亦是如此。4. 类的方法设计建议:(1) 在设计方法时,应该考虑构造方法,考虑系统提供的方法对自己定义的方法的影响,。如果方法比较大可以适当抽取功能比较接近的部分重新在定义一个方法,让这些方法通过互调的方式完成代码的重复使用。(2) 在定义构造方法是,一般不要调用其他方法。(3) 定义方法时,参数不宜过多。5. 继承的设计建议:(1) 不要使用protected变量以免破坏封装。(2) 在类关系模式中使用继承(3) 除非通过继承得到的方法有用,否则不要使用继承。(4) 重写方法时不要改变预期行为。(5) 尽量使用多态。(6) 尽量就爱你个非常常用的方法和属性放在超类中。(7) 不要泛用反射。1.2 AWT组件1) Frame类(窗体)用来制作窗体界面的类。Frame类的对象的显示效果是一个“窗体”,带有标题和最大化、最小化的按钮。本游戏所运用的Frame类的构造方法主要有如表1:方法名方法介绍Frame()构造Frame的一个新事例(初始时不可见)Frame(String title)构造一个新的、初始不可见得的、具有指定标题的Frame对象本游戏所运用的Frame类中常用的方法主要有如表2:方法名方法介绍setVisible(boolean b)Frame默认初始化为不可见的setSize(int width,int height)设置窗体的大小setLocation(int x,int y)设置窗体的位置,x、y左上角的坐标setTitle(String name)设置窗体的标题2)Panel类通过Panel(面板)类可以创建不同的面板,类似于界面底板。本游戏所运用的Panel类的方法列表:方法名方法介绍setSize(int width,int height)设置面板大小setLocation(int x,int y)设置面板的位置,x、y是左上角的坐标setBackground(Color c)设置面板的背景颜色,参数为Color对象1.3 线程在Java语言产生前,传统的程序设计语言的程序同一时刻只能单任务操作,效率非常低,例如程序往往在接收数据输入时发生阻塞,只有等到程序获得数据后才能继续运行。 随着Internet的迅猛发展,这种状况越来越不能让人们忍受:如果网络接收数据阻塞,后台程序就处于等待状态而不继续任何操作,而这种阻塞是经常会碰到的,此时CPU资源被白白的闲置起来。如果在后台程序中能够同时处理多个任务,该多好啊!应Internet技术而生的Java语言解决了这个问题,多线程程序是Java语言的一个很重要的特点。在一个Java程序中,我们可以同时并行运行多个相对独立的线程,例如,我们如果创建一个线程来进行数据输入输出,而创建另一个线程在后台进行其它的数据处理,如果输入输出线程在接收数据时阻塞,而处理数据的线程仍然在运行。多线程程序设计大大提高了程序执行效率和处理能力。 线程的创建 我们知道Java是面向对象的程序语言,用Java进行程序设计就是设计和使用类,Java为我们提供了线程类Thread来创建线程,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。下面是一个创建启动一个线程的语句: Thread thread1=new Thread(); file:/声明一个对象实例,即创建一个线程; Thread1.run(); file:/用Thread类中的run()方法启动线程; 从这个例子,我们可以通过Thread()构造方法创建一个线程,并启动该线程。事实上,启动线程,也就是启动线程的run()方法,而Thread类中的run()方法没有任何操作语句,所以这个线程没有任何操作。要使线程实现预定功能,必须定义自己的run()方法。Java中通常有两种方式定义run()方法: 通过定义一个Thread类的子类,在该子类中重写run()方法。Thread子类的实例对象就是一个线程,显然,该线程有我们自己设计的线程体run()方法,启动线程就启动了子类中重写的run()方法。 通过Runnable接口,在该接口中定义run()方法的接口。所谓接口跟类非常类似,主要用来实现特殊功能,如复杂关系的多重继承功能。在此,我们定义一个实现Runnable() 接口的类,在该类中定义自己的run()方法,然后以该类的实例对象为参数调用Thread类的构造方法来创建一个线程。 线程被实际创建后处于待命状态,激活(启动)线程就是启动线程的run()方法,这是通过调用线程的start()方法来实现的。1.4 监听器对于键盘事件来说,key 所包含的值指出要激活哪个键,对于 KEY_PRESS 和 KEY_RELEASE 事件的 id,key 的值是该键的 unicode 字符代码。对于 KEY_ACTION 和 KEY_ACTION_RELEASE,key 的值是 Event 类(PGUP、PGDN、F1、F2)中所定义的某个动作-键标识符。当按键时,会返回一个int 类型的数,对应你的按键,虚拟机会根据返回的int 类型的数值来控制你的按键;KeyAdapter 是一个接收键盘事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象,内含有KeyPressed 和KeyReleaseed的空方法,用户自己定义方法中的按键控制。1.5 MVC开发模式21) MVC的概念:MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller)。 MVC模式的目的就是实现Web系统的职能分工。 Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。 View层用于与用户的交互,通常用JSP来实现。 Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。MVC是一个架构模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:视图、模型、控制器。它们各自处理自己的任务。 2) 在MVC的工作模式:视图 视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services.模型 模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。 控制器 控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器(例如:servlet)本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。 3) 此游戏中亦运用此MVC开发模式: Snake定时移动根据不同的情况,向Snake、Food或Ground发送不同的指令处理逻辑处理按键事件ControllerGroundFoodGamePanel触发按键事件重新显示第2章 功能实现第2章 功能实现122.1 蛇的定时移动在eclipse工具中运行测试类Game.类可以看到蛇以每1000毫秒的速度和以默认的方向(向右)移动如图1-1: 游戏开始一段时间后的状态游戏刚开始时的状态图1-11具体要实现这种移动的功能得需要两步:1) 是去尾。在蛇移动的过程中,如果不去尾,那么蛇的尾部永远保持在原来的坐标上,这就实现不了它给我们以移动的感觉。去尾的流程为:Private int oldDirection;Private int newDircetion;if(!(oldDirection + newDirection =0)oldDirection = newDirection; oldTail = body.removeLast();2) 加头。如果没有加头这一步,同样蛇也会产生移动的效果。加头的流程为:/2.加头 Point newHead = new Point(x,y); body.addFirst(newHead);2其总的实现的代码如下: private class SnakeDriver implements Runnable public void run() /调用蛇的move方法 while(life) move(); /使用增强for循环来遍历listeners内所有的元素 for(SnakeListener l : listeners) l.snakeMoved(Snake.this); try /设置蛇睡眠的时间 Thread.sleep(1000); catch (InterruptedException ex) ex.printStackTrace(); 蛇的移动方法为:public void move() System.out.println(Snakes move); /1.去尾 if(!(oldDirection + newDirection =0)oldDirection = newDirection; oldTail = body.removeLast(); int x = body.getFirst().x; int y = body.getFirst().y; switch(oldDirection) case UP: y-; if(yGlobar.WIDTH-1) y=0; break; case LEFT: x-; if(xGlobar.WIDTH-1) x=0; break; /2.加头 Point newHead = new Point(x,y); body.addFirst(newHead); 2.2 在窗体中改变蛇的移动方向在运行的游戏面板上,可以通过使用键盘上的、来改变蛇移动的方向。如图1-2: 图1-2改变蛇移动的方向的代码是: /蛇改变方向的方法 public void changeDirection(int direction) System.out.println(Snakes changeDirection); newDirection = direction; 2.3 蛇吃到食物身体加长当蛇在移动的过程中若是蛇头碰到了一个矩形方块(即食物),蛇的身体会加长一个矩形长度,即蛇吃到了食物,身体加长。如图1-3所示:蛇吃到一个食物后的长度蛇没吃食物之前的长度其实现的代码为:/蛇吃食物方法 public void eatFood() System.out.println(Snakes eatFoot); body.addLast(oldTail);2.4 蛇吃到石头或自己的身体时停止移动贪吃蛇一个特性就是当蛇头吃到界面中设置的石头或者自己的身体时游戏就会终止,即蛇停止了向前移动。其实现的方法为:1)定义一个boolean类型的用来定义蛇生命的life;2)先设置life的素性为true,其方法为:public void init()int x = Globar.WIDTH/2;int y = Globar.HEIGHT/2;for(int i=0;i3;i+)body.addLast(new Point(x-,y);oldDirection = newDirection = RIGHT;life = true;3)然后判断蛇头是否吃到了石头或自己的身体,若是,则life为false,此时run()方法中的while循环语句停止,蛇也就停止了移动。public void run() /调用蛇的move方法 while(life) move(); /使用增强for循环来遍历listeners内所有的元素 for(SnakeListener l : listeners) l.snakeMoved(Snake.this); try /设置蛇睡眠的时间 Thread.sleep(1000); catch (InterruptedException ex) ex.p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论