java游戏大作业设计_第1页
java游戏大作业设计_第2页
java游戏大作业设计_第3页
java游戏大作业设计_第4页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、java游戏大作业设计 a java 游戏编程基础 课程 大作业报告 课 课 题: 吃豆人游戏的设计与实现 姓 姓 名: 黄子强 学 学 号: 0207 同组姓名: 刘照、 杜威 专业班级: 网工 15102 指导教师: 何青 设计时间: 评阅意见: 评定成绩: 指导老师签名: 年 月 日 目 录 一、 课程设计目的 复习、领会、巩固和运用课堂上所学的 java 游戏编程方面的技术知识,让学生掌握游戏设计的基本原理和游戏编程的基本方法,掌握游戏开发的一般步骤和相应文档的编制,能够设计、调试、运行一个完整的游戏项目;提高开发过程中的团队意识,锻炼学生书面和口头表达能力,为学生提供主动学习、积极探

2、索与大胆创新的机会。 通过本次游戏设计,综合自己在校期间所学的理论知识,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对 java 基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。 二、 需求分析 吃豆子游戏是一种古老而又有趣的游戏,游戏软件不计其数,网上就有好多关于实现的复杂算法和设计,其难度让一般初学者望而却步。开发的出来的吃豆子游戏是一种内容丰富,画面优美,益智类游的戏,并且不受网络的限制,让人们能够在任何时刻通过体验游戏,放松心情。 设计需求: 游戏界面设计要能够彰显设计者的基本设计框架及思路

3、; 游戏界面布局要清晰整洁、层次明确; 游戏的设计要使玩家能在短时间内掌握游戏规则; 玩家可以自由操控角色,玩家角色具有吃豆子的功能; 吃到不同的豆子能有不同的效果(分数变化、角色状态的变化等等); 怪物要能够自主运动,采用其特定的算法独立实现; 游戏中怪物与玩家角色之间要有相应的事件(比如:触碰到玩家角色时玩家生命减 1); 界面上要能有够显示出当前的得分情况以及当前的生命值; 对于游戏的设计,在游戏结束时能够有相应的提示。 三、 总体设计 类的设计 图 3-1 在吃豆人游戏的类设计中,首先要确立的是类的关联、划分主次。整个游戏主要由两大部分组成,在这其中 pacworld 类既是其中的一大

4、组成部分也游戏一个重要的"舞台',承载了其他的类方法,在这其中,设计者可以根据具体的游戏需要来加入相应的游戏元素、游戏规则,从而达到丰富游戏的目的。 world 类又分为 pacworld 和 myworld 两个类,其中 pacworld 类是游戏场景元素的一个大集合。作为一个舞台的大容器,它包括游戏区块(左中右三部分)的布局、边界(墙壁)的绘制、背景颜色、空白填充、位置信息显示、分数、大小豆子、怪物以及的位置生成、豆子的生成位置等元素,给游戏塑造出了一个整 体框架。 而另一大组成部分 actor 类则作为各种对象类的集合定义游戏中的各种方法。其中包括 animal 类、w

5、riting 类以及 object 类。 animal类中包含了两个重要的元素pacman 类和 ghost 类,分别实现吃豆人和怪物的运动、动画、触发事件等算法逻辑及调用方法。writing 类包含主游戏框架面板上计分板、位置显示、空白填充以及生命计数器的方法类。object 类中则是定义被吃的大小豆子。 所有的类在设计的时候保证了相互之间的联系性,类与类之间存在方法上的调用,对象方法的灵活运用是吃豆人游戏的一大主体。 事件的设计 作为一个游戏,事件的设计必不可少。在设计一个游戏时总是会在特定的游戏场景中抛出一个自定义事件,由相关的界面(可能是多个)去订阅这个事件,当接收到这个事件时,这些界

6、面刷新显示数据,从而解除游戏逻辑层和界面显示层的耦合关系。每一个游戏都有其自定义的游戏触发事件,本次设计的吃豆人游戏也有着其独到的自定义事件。 这次的设计中,吃豆人的事件主要分为两大类,它们分别是针对吃豆子和触碰 ghost 的触发事件。 在吃豆子的事件中(如图 3-3 所示),当玩家操控吃豆人角色吃到小豆子(coin)时,分数加 1(更新计分板)并移除小豆子。而当吃到大豆子(power_pellet)时,就需要在分数加 5 并移除大豆子的基础上更新 ghost 状态(这里需要改变 ghost 的图形,使玩家能在视觉上感受变化)。 图 3-2 在触碰 ghost 事件中(如图 3-4 所示),

7、只有当 ghost 处于特殊状态时,玩家角色才可以将其吞食消除,否则吃豆人将会失去一条生命并且重置回出生点,并在计分板上使其生命显示减 1(同步计数器)。 图 3-3 四、 详细设计 d pacworld 类 在游戏场景中,除了.的游戏区域外,左右各有三块区域用于显示游戏信息,而其余部分则用 blank 类方法填充空白。 游戏.的场景中绘制出地图(边界线/墙壁),留出通道,在其中的相应位置放入对应的怪物、大小豆子以及游戏的控制主体吃豆人,左右放置对应的计分板和计数器,构成整个游戏的基本元素框架。 图 4-1 先定义各元素信息: 左右空白填充: blank blankr = new blank(

8、); blank blankl = new blank(); 生命显示:(左下角三个小吃豆人) lives life1 = new lives(1); lives life2 = new lives(2); lives life3 = new lives(3) 四种颜色的怪物: inky inky = new inky(); blinky blinky = new blinky(); clyde clyde = new clyde(); pinky pinky = new pinky(); = gspeed; 吃豆人: static pacman pacman; pacman = new pa

9、cman(ppoints, plives); 地图信息: 首先,将整个地图存入到一个二维数组中: for(int i = 0; i ; i+) for(int j = 0; j pacworldi.length; j+) pacworld ij = false; 接下来根据数组绘制地图 drawpath,将绘制的边界以特殊的信息保存到数组中。 private void drawpath() (部分代码) min = 200; max = 442; for (int x = min; x= max; x+) pacworld x341 = true; min = 283; max = 358;

10、for (int x = min; x= max; x+) pacworld x221 = true; pacworld x213 = true; pacworld x204 = true; min = 120; max = 522; for (int x = min; x= max; x+) pacworld x426 = true; pacworld x87 = true; min = 248; max = 394; for (int x = min; x= max; x+) pacworld x257 = true; pacworld x171 = true; 指定的区域放置大豆子,当吃

11、到大豆子时所有的怪物立刻变为可以被吃掉的状态。 注:在吃掉大豆子后吃豆人的标记 run 会变为 true,意味着此时可以吃掉怪物,这个状态的持续时间定义为 5 秒。 .在路口处放置小豆子 .放置完豆子使其计数器加一 public void coinfill() coins = 0; for(int i = 0; i ; i+) for(int j = 0; j pacworldi.length; j+) if(pacworld ij = true) int square = 1; if(pacworld i+1j = true) square+; else if(pacworld i-1j =

12、 true) square+; if(pacworld ij+1 = true) square+; else if(pacworld ij-1 = true) square+;: if(/*(i = 320 j = 171) |*/ (i = 200 j = 87) | (i = 442 j = 87) | (i = 420 j = 341) | (i = 224 j = 341) addobject(new power_pellet(), i, j); coins+; else if(i =283 i =358 j = 172 j = 221) coins = coins; else if(

13、square 2) addobject(new coin(),i,j); coins+; c = coins; l animal 类 在 animal 类中定义了用于子类继承的抽象方法,如:方向的移动、方向移动的提前量判断等,在该类中还设置了角色的场景移动传送方法,用于对游戏场景中部特殊的通道移动的定义。对于 ghost 而言,他们的移动的范围要求比吃豆人更广提高难度,当他们从地图.两侧的通道进入时,将会从另一侧出现。这种突然出现在身边的 ghost 往往能提高玩家的紧张感,提升游戏性。 protected void warp() positionx = (); positiony = ();

14、 if(positionx = 94) setlocation(550,213); else if(positionx = 556) setlocation(104,213); 例如:当 ghost 从右侧通道走出游戏场景时将会从左侧的通道重新出现在玩家的面前(如图 4-3、图 4-4 所示)。 图 4-3 图 4-4 在游戏中,总是会在一个方向上碰到无法继续前进的情况,这个时候就需要判断此时还能往哪个方向进行运动,时刻检查能否向四周运动,并根据这个方向来和键盘输入的方向键进行比较,来执行最终的动作方向。 checkd:用于检查你可以去往哪个方向 private boolean checkd(

15、char s) int x = 0, y = 0; switch(s) case "u": y=-steps;break; case "d": y=steps;break; case "l": x=-steps;break; case "r": x=steps;break; return getx()+xgety()+y; 只有当判定可以往目标方向移动时,角色才可以进行移动 protected void move(char direction) int x = 0,y = 0; if (direction = &q

16、uot;u" checkd(direction) = true) y=-steps; if (direction = "d" checkd(direction) = true) y=steps; if (direction = "l" checkd(direction) = true) x=-steps; if (direction = "r" checkd(direction) = true) x=steps; () + x, () + y); pac c man n 类 private greenfootimage mo

17、pen = new greenfootimage(); private greenfootimage mclosed = new greenfootimage(); 定义吃豆人运动的两种状态图:开口和闭口,用于运动时变换显示。 private void movepic() if (mcounter = mchange) setimage(mopen); if(mcounter = 2*mchange) mcounter = 0; else setimage(mclosed); 在类中,还需要专门设置一个用于标记吃豆人运动时图片的变化显示的量: private char d = "l&

18、quot; 定义初始运动向左,吃豆人的四个运动方向分别是:上(up:u),下(down:d),左(left:l),右(right:r)。 如:(键盘点击方向键向上后,改变吃豆人的运动方向向上) if(up) setrotation(90); d = "u" 图 4-5 在获得了键盘输入的方向后,改变吃豆人的运动(位置、方向),这里还会对可能移动的方向先进行判断(判定是否可以朝目标方向移动)。(图 4-5) private void corner(char side) for(int i = -7; i=7;i+) int x = 0,y = 0; switch (side)

19、 case "u": y = -1;x = i;break; case "d": y = 1;x = i;break; case "l": x = -1;y = i;break; case "r": x = 1;y = i;break; ifgetx() + xgety() + y = true) setlocation(getx() + x, gety() + y); 吃豆人在吃豆子时需要调用 eat 函数:当吃到小豆子时,移除当前接触到的小豆子并让分数加一;当吃到大豆子时,移除当前接触到的大豆子并让分数加五;当

20、分数高于 200 且当前游戏中仍存有豆子时,怪物的速度提升(难度提升)。 private void eat() if(istouching) removetouching; coinscollected+; points+; if(istouching) removetouching; run = true; coinscollected+; points += 5; if(coinscollected = != 0) if(points 200 * +; (new pacworld(l,points, ); 在游戏中,吃豆人难免会出现触碰到怪物而死亡的情况,这个时候就需要死亡函数在出生点重生

21、,生命减一,并执行一次判断:当生命所剩为零时重置游戏。 执行这个死亡函数的前提条件是吃豆人触碰到四个怪物中的任意一个(if 语句)。 private void die() if(istouching | istouching | istouching | istouching) l-; setlocation(320,257); if(l = 0) points = 0; (new pacworld(3,0,1); t ghost 类 在吃豆人游戏中,怪物是一个非常重要的存在,要让一个怪物实现在场景中移动就需要一个用于定义怪物随机移动的函数。 使用 random 函数随机生成四个方向的移动,当

22、怪物移动到一个方向的尽头时则执行下一个方向的运动判断。 protected void randomwalk() int square = 1; if ()+1() = true) square+; else if ()-1() = true) square+; if ()()+1 = true) square+; else if ()()-1 = true) square+; if(square 2) do int r = (int) (int )() * 4); switch(r) case 0 : d = "u"o = "d"break; case

23、1 : d = "d"o = "u"break; case 2 : d = "l"o = "r"break; case 3 : d = "r"o = "l"break; bx = (); by = (); move(d); ax = (); ay = (); move(o); while(bx = ax by = ay); for(int i = 0; ispeed; i+) move(d); if() = 320 () 171 () 221)(320, 171); prot

24、ected void run() if(run) runcount+; if(istouching run = true) +=20; setlocation(320,213); = true; else if(800 runcount runcount 1000) countr+; if(countr = 50) countr = 0; (upic); else (gpic); else if(runcount = 1000) runcount = 0; run = false; 设置怪物由出生点出发(图 4-6): 图 4-6 protected void leave() lcount+;

25、 if(lcount = 100) ; count = 0; if = false != 1 ) if() = 204) = "d" else if () = 221) = "u" move; else if = false = 1) if() 213) move("d"); else if() 213) move("u"); else if() = 213) if() 320) move("r"); else if() 320) move("l"); else = true

26、; else if = true) if() 171)move("u"); else = false; int a = (int) () * 2); if(a = 0) = "r" else = "l" 吃豆人有着其运动的样式,而怪物也同样有着四个方向运动的图案变化(图4-7): 图 4-7 protected void changepic() if(run = false) switch case "u": ;break; case "d": ;break; case "r"

27、;: ;break; case "l": ;break; else (gpic); k blank 类 blank 类用于填充空白部分(填充黑色单元块) public class blank extends writing public blank() setimage(new greenfootimage(., 50, , ); n position 类 不论是吃豆人还是怪物都需要动态标记、使用当前的位置,这样就需要一个能够被所有对象调用的 position 类,这个类既定义了对象坐标也和 pacworld 一起定义了这些对象所能够运动的轨迹。 public class

28、position extends writing private int px, py; public void act() px = ; py = ; etbackground().getcolorat(px, py).getred(); etbackground().getcolorat(px, py).getgreen(); etbackground().getcolorat(px, py).getblue(); etbackground().getcolorat(px, py).getalpha(); setimage(new greenfootimage(x: +px+ y: + p

29、y, 15, , ); emoveobject(this); -= 20; 图 4-11 t object 类 object 类继承 actor 类中的方法,同样,这其中的方法也传递给了两个子类。两种豆子的子类继承了 object 类即 actor 类的所有属性及方法。 coin 类和 powe_pellet 类在 pacworld 类中与吃豆人共同作用了一个事件,同时 powe_pellet 类对象还将对 ghost 产生状态的影响。这两个类在 pacworld 类中 作为类对象被放置在容器中充实游戏整体,也为与 pacman 类和 ghost 类的互动打下一个基础。 图 4-12 n co

30、in 类t power_pellet 类 两种豆子在这两个类中被分别定义声明,主要在 pacworld 类中被调用。 五、 游戏测试 游戏界面展示 最初运行游戏时,玩家将会进入最初的静止的游戏界面: 图 5-1 点击运行即可开始游戏: 图 5-2 在游戏中,吃到小豆子时(分数、游戏效果变化)效果图: 图 5-3 吃到大豆子效果图: 图 5-4 触碰到怪物前后效果图: 图 5-5 游戏效果测试 吃豆人移动测试表 场景通道连通性测试表 ghost 状态测试表 键盘方向键 上方向键 下方向键 左方向键 右方向键 输出 吃 豆 者 正 常移动,不会移出边界 吃 豆 者 正 常移动,不会移出边界 吃 豆 者 正 常移动,不会移出边界 吃 豆 者 正 常移动,不会移出边界 结果 正常 正常 正常 正常 通路测试 由场景左侧通道进入 由场景右侧通道进入 输出 能够从场景右侧正常出现 能够从场景左侧正常

温馨提示

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

最新文档

评论

0/150

提交评论