




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计(论文)课 题 名 称 基于swing开发的推箱子游戏 学 生 姓 名 吕季干 学 号 0840819035 系、年级专业 理学与信息科学系2008级信息与计算科学 指 导 教 师 戴亚滨 职 称 讲 师 2012 年 5 月 25 日邵阳学院毕业设计(论文)摘 要在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为娱乐方式。但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的设计、艺术、声音和软件。 推箱子游戏是一款很有趣味的游戏,它由英雄、魔王、笼子、墙和地板组成,然后存储在一个数组中,用户根据键盘的向上、向左、向右和向下键操作。其开发过程有一定的技巧和方法,其中涉及到二维数组、键盘操作以及图形化函数等方面的知识。此次设计是在Microsoft Windows 7 系统下,以java为开发语言,在 eclipse平台上进行游戏的设计与实践。关键词:游戏设计、数组、开发语言AbstractIn the current era of rapid development of electronic information, electronic games has been deeply Peoples Daily life, be enjoyed by young and old form of entertainment. But the game design combined with tomorrows technology, in a product integration of complex design, art, sound and software, so not well-known. Pushed box game is a very interesting game, it achieved by Hero,Devil,Cage,Floor and Wall, and then stored in an array , users according to the keyboard four the direction up, left, right and down operation to control. Pushed box game development process has certain skills and methods, which involves a two dimensional array, keyboard and graphical function and other aspects. This design is in Microsoft Windows 7 system, with JAVA for development of language, Ecplise platform game design and practice.Keywords: Game design, array, Development languageII目 录摘 要IAbstractII前言11可行性分析21.1要求21.2目标22 项目开发计划的任务分解23 概要设计23.1游戏界面23.2游戏四种基本图形23.3英雄走向图形33.4 箭头图片34 需求规格说明34.1运行环境34.2功能需求34.3运行需求45 详细设计45.1 系统模块45.2 任务执行流程55.3 小人移动流程56界面实现56.1 界面区56.2 游戏区86.3 图片加载区116.4 英雄变化区116.5 地图绘画区197 结束语23参考文献24附 录25致 谢262邵阳学院毕业设计(论文)前言随着社会的发展,人类的生产、生活越来越离不开信息。谁拥有了更多更有效的信息,谁就将在竞争中处于有利的地位。信息产业正在成为一个国家的支柱。只有拥有了先进的技术和知识,才能有效地管理好浩如烟海的信息,并从中提取出对自己有用的信息来加以利用。推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。它既能锻炼思维的严密性,又有很多乐趣。我个人也比较喜欢玩这个游戏,因此,我就借这个机会将这个推箱子游戏用java语言实现了出来,其中的界面使用了swing中的工具,当然,我也借鉴了前人的一些技巧经验。然而Swing是什么? Swing是一个用于开发Java应用程序用户界面的开发工具包。它以抽象窗口工具包为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。 通过本次游戏的设计,综合自己在校期间所学的理论知识,设计开发推箱子游戏,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对java, swing基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。由于时间仓促和本人水平有限,此游戏的制作显得有些粗糙,我以后将会再接再厉。1可行性分析1.1要求 在eclipse的开发环境下,利用所学java 语言相关知识,开发一个推箱子小游戏,实现游戏界面规划、英雄走动、魔王动向等功能。建立一个java project工程,实现游戏的编程设计。1.2目标可包括:a. 人力与设备费用的节省:单独开发b. 界面友好美观:自绘技术实现c. 游戏的可操作性,通过键盘的方向键实现d. 游戏界面的游戏区e. 等等2 项目开发计划的任务分解 a. 建立一个java project工程 b. 建立一个Hero包 c. 画出游戏区域 d. 调整游戏窗口大小 e. 加载游戏相关图片 f. 计算游戏结果,判断是否进入下一关3 概要设计3.1游戏界面 背景图片如下:3.2游戏四种基本图形在游戏中相对应的图片分别为: 3.3英雄走向图形图片如下:3.4 箭头图片3.5游戏操作操作如下: 方向键左:左移 方向键右:右移 方向键上:上移 方向键下:下移 箱子只可以推, 不可以拉, 而且一次只能推动一个,胜利条件就是把所有的箱子都推到目的地。4 需求规格说明 4.1运行环境Microsoft Windows XP Microsoft Windows7 Eclipse4.2功能需求a. 图形左右移动b. 图形上下移动c. 实现开始,结束按钮的功能d. 使游戏窗口最大化失效4.3运行需求 硬件和软件接口:1.cpu :1.6GHz以上2.内存:256M以上3.操纵系统:Micorsoft Windows XP Microsoft Windows 74.运行软件:Eclipse5 详细设计5.1 系统模块本程序包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小人模块和功能控制模块。各个模块的功能描述如下:(1)初始化模块。 该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。(2)画图模块。 该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。(3)移动箱子模块。 该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。(4)移动小人模块。 该模块用于控制小人移动,从而推动箱子到目的地。(5)功能控制模块。 该模块是几个功能函数的集合,包括屏幕输出功能和指定位置状态判断功能。5.2 任务执行流程游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的按退出按钮进行退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关。5.3 小人移动流程小人移动的方向有4个,moving()函数(处理小人移动的函数)对这4个方向移动的处理都一致,只是调用函数时的参数有所不同。首先判断小人移动的方向,然后根据小人所处世的当前状态、下一步状态或者下下一步状态进行适当的处理。6界面实现6.1 界面区这个区域主要负责窗体的大小,背景,名称以及窗体不可改变等元素。a.界面大小: this.setSize(540 + 4, 440 + 62);b.界面背景: this.setBackground(Color.BLACK);c.界面大小不可改变: this.setResizable(false);/ 不能改变窗体大小d.界面名称: this.setTitle(英雄传说II-吕季干); e.界面的实现如下:f.界面区总代码: import java.awt.Toolkit;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.JFrame;public class GameFrame extends JFrame private GamePanel gp = new GamePanel();private ImageUtil iu = new ImageUtil();/ 加载图片的工具public GameFrame() init();public void init() this.add(gp);/ 加入画纸this.setSize(540 + 4, 440 + 62);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setCursor(Toolkit.getDefaultToolkit().createCustomCursor(iu.getImage(cursor.png), new Point(26, 29), aaa);this.setResizable(false);/ 不能改变窗体大小this.setResizable(false);this.setTitle(英雄传说II-吕季干);/ 加一个监听器,保镖,匿名类:匿名类的格式 new 接口名() 接口中的方法的实现 this.addKeyListener(new KeyListener() Overridepublic void keyPressed(KeyEvent arg0) / TODO Auto-generated method stubswitch (arg0.getKeyCode() / 0=向下 1=向左 2=向右 3=向上case 39:/ System.out.println(英雄向右);gp.setHeroF(2);break;case 40:/ System.out.println(英雄向下);gp.setHeroF(0);break;case 38:/ System.out.println(英雄向上);gp.setHeroF(3);break;case 37:/ System.out.println(英雄向左);gp.setHeroF(1);break;Overridepublic void keyReleased(KeyEvent arg0) / TODO Auto-generated method stubOverridepublic void keyTyped(KeyEvent arg0) / TODO Auto-generated method stub);this.setVisible(true);public static void main(String args) / TODO Auto-generated method stubnew GameFrame();6.2 游戏区这个区域主要完成游戏界面的大小等元素。a. 界面大小:this.setSize(600, 500);b. 界面实现如下图: c.游戏区总代码:package frame;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import javax.swing.JPanel;public class GamePanel extends JPanel private static final long serialVersionUID = 6792476564904637059L;private Image backImage; / 背景图片private Image me;private ImageUtil iu = new ImageUtil();/ 加载图片的工具private Hero hero = new Hero(this);private Maps map = new Maps(this);public Maps getMap() return map;public void setMap(Maps map) this.map = map;public GamePanel() this.setSize(600, 500);this.setBackground(Color.BLACK);backImage = iu.getImage(back1.jpg); / 初始化背景图片/ heroImage = iu.getImage(role1.gif); /英雄的图片/ me=iu.getImage(慧灵.jpg);new D().start();/ 启动线程Overridepublic void paint(Graphics g) g.drawImage(backImage, 0, 0, Color.BLACK, this);/ 画出背景图片g.drawImage(me, 0, 0, null);boolean yes6 = map.draw(g);/ 画地图if (yes6) / 到下一关map.setMap();map.draw(g);/ 画地图/ 画英雄hero.draw(g);/ 调用英雄的的画的方法,将并将画笔g传递过去,画出英雄/ 该 方法用于改变英雄运行的方向public void setHeroF(int f) hero.setF(f);/ 将方向的改传给英雄hero.setMoving(true);/ 因为按了键所以可以移动/ 使用线程来完成,内部类:写在类里面的类class D extends Thread public void run() / 方法必须这么写while (true) try Thread.sleep(40); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();GamePanel.this.repaint(); / 调用这个D对象外面的repaint()public Hero getHero() return hero;public void setHero(Hero hero) this.hero = hero;6.3 图片加载区 这个区域主要负责加载各类型的图片,使界面变得美观等条件。图片加载区总代码:package frame;import java.awt.Image;import java.awt.Toolkit;import java.io.IOException;import javax.imageio.ImageIO;public class ImageUtil public Image getImage(String imageUrl) Image image = null;try / 会将图片加载在内存中image = ImageIO.read(this.getClass().getClassLoader().getResourceAsStream(image/ + imageUrl); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();return image;6.4 英雄变化区这个区域主要负责英雄的变化,如下:a.英雄的起始坐标: / 存放英雄起始位置的坐标private int heroX = 200;private int heroY = 200;b.英雄起始的方向:private int f = 0;/ 0=向下 1=向左 2=向右 3=向上c.画英雄的方法:public void draw(Graphics g) if (isMoving) moving();/ 移动英雄/ g.drawImage(heroImage, 0, 0, 32, 32, 200, 200, 232, 232, this);/ 在屏幕上的左上角的X,Y和 屏幕上的右下角X,Y,之间,/ 图片的左上角X,Y,图片上右下角/ g.drawImage(heroImage, heroX, heroY, heroX+32, heroY+32,0,0,32,32,/ null);/向下g.drawImage(heroImage, heroX, heroY, heroX + 32, heroY + 32, 0, 32 * f,32, 32 * (f + 1), null);/ 控制上下左右的图片d.英雄坐标改变的方法:public void moving() switch (f) case 0:if (peng() heroY += 32;break;case 1:if (peng() heroX -= 32;break;case 2:if (peng() heroX += 32;break;case 3:if (peng() heroY -= 32;break;isMoving = false; / 每移动一次就停止/ System.out.println(现在英雄的坐标是:+heroX+-+heroY);e.碰撞检测的方法,返回能走还是不能走public boolean peng() / 1. 得到英雄在地图中的位置int row = (heroY - 100) / 32;int column = (heroX - 100) / 32;/ 2. 根椐英雄的位置及行进的方向,判断地图上是否可以行走switch (f) / 0=向下 1=向左 2=向右 3=向上case 0:/ 得到地图对象中的地图数组if (gp.getMap().getMap()row + 1column = 2| gp.getMap().getMap()row + 1column = 6) return true;if (gp.getMap().getMap()row + 1column = 10) / 前面是魔王if (gp.getMap().getMap()row + 2column = 2) / 前面前面是地板gp.getMap().getMap()row + 1column = 2;gp.getMap().getMap()row + 2column = 10;return true;if (gp.getMap().getMap()row + 2column = 6) / 前面前面是笼子gp.getMap().getMap()row + 1column = 2;gp.getMap().getMap()row + 2column = 14;return true;if (gp.getMap().getMap()row + 1column = 14) / 前面是带笼子魔王if (gp.getMap().getMap()row + 2column = 2) / 前面前面是地板gp.getMap().getMap()row + 1column = 6; / 前面就变成笼子gp.getMap().getMap()row + 2column = 10; / 前面的前面变成了魔王return true;if (gp.getMap().getMap()row + 2column = 6) / 前面前面是笼子gp.getMap().getMap()row + 1column = 6; / 前面变成笼子gp.getMap().getMap()row + 2column = 14; / 前面前面变成带笼子的魔王return true;break;case 1:if (gp.getMap().getMap()rowcolumn - 1 = 2| gp.getMap().getMap()rowcolumn - 1 = 6) return true;if (gp.getMap().getMap()rowcolumn - 1 = 10) / 前面是魔王if (gp.getMap().getMap()rowcolumn - 2 = 2) / 前面前面是地板gp.getMap().getMap()rowcolumn - 1 = 2;gp.getMap().getMap()rowcolumn - 2 = 10;return true;if (gp.getMap().getMap()rowcolumn - 2 = 6) / 前面前面是笼子gp.getMap().getMap()rowcolumn - 1 = 2;gp.getMap().getMap()rowcolumn - 2 = 14;return true;if (gp.getMap().getMap()rowcolumn - 1 = 14) / 前面是带笼子魔王if (gp.getMap().getMap()rowcolumn - 2 = 2) / 前面前面是地板gp.getMap().getMap()rowcolumn - 1 = 6; / 前面就变成笼子gp.getMap().getMap()rowcolumn - 2 = 10; / 前面的前面变成了魔王return true;if (gp.getMap().getMap()rowcolumn - 2 = 6) / 前面前面是笼子gp.getMap().getMap()rowcolumn - 1 = 6; / 前面变成笼子gp.getMap().getMap()rowcolumn - 2 = 14; / 前面前面变成带笼子的魔王return true;break;case 2:if (gp.getMap().getMap()rowcolumn + 1 = 2| gp.getMap().getMap()rowcolumn + 1 = 6) return true;if (gp.getMap().getMap()rowcolumn + 1 = 10) / 前面是魔王if (gp.getMap().getMap()rowcolumn + 2 = 2) / 前面前面是地板gp.getMap().getMap()rowcolumn + 1 = 2;gp.getMap().getMap()rowcolumn + 2 = 10;return true;if (gp.getMap().getMap()rowcolumn + 2 = 6) / 前面前面是笼子gp.getMap().getMap()rowcolumn + 1 = 2;gp.getMap().getMap()rowcolumn + 2 = 14;return true;if (gp.getMap().getMap()rowcolumn + 1 = 14) / 前面是带笼子魔王if (gp.getMap().getMap()rowcolumn + 2 = 2) / 前面前面是地板gp.getMap().getMap()rowcolumn + 1 = 6; / 前面就变成笼子gp.getMap().getMap()rowcolumn + 2 = 10; / 前面的前面变成了魔王return true;if (gp.getMap().getMap()rowcolumn + 2 = 6) / 前面前面是笼子gp.getMap().getMap()rowcolumn + 1 = 6; / 前面变成笼子gp.getMap().getMap()rowcolumn + 2 = 14; / 前面前面变成带笼子的魔王return true;break;case 3:if (gp.getMap().getMap()row - 1column = 2| gp.getMap().getMap()row - 1column = 6) return true;if (gp.getMap().getMap()row - 1column = 10) / 前面是魔王if (gp.getMap().getMap()row - 2column = 2) / 前面前面是地板gp.getMap().getMap()row - 1column = 2;gp.getMap().getMap()row - 2column = 10;return true;if (gp.getMap().getMap()row - 2column = 6) / 前面前面是笼子gp.getMap().getMap()row - 1column = 2;gp.getMap().getMap()row - 2column = 14;return true;if (gp.getMap().getMap()row - 1column = 14) / 前面是带笼子魔王if (gp.getMap().getMap()row - 2column = 2) / 前面前面是地板gp.getMap().getMap()row - 1column = 6; / 前面就变成笼子gp.getMap().getMap()row - 2column = 10; / 前面的前面变成了魔王return true;if (gp.getMap().getMap()row - 2column = 6) / 前面前面是笼子gp.getMap().getMap()row - 1column = 6; / 前面变成笼子gp.getMap().getMap()row - 2column = 14; / 前面前面变成带笼子的魔王return true;break;return false;6.5 地图绘画区 该模块主要用于画图操作,包括画墙、画箱子、画目的地和画小人等。 界面实现如下: a.读取地图的工具private ImageUtil iu = new ImageUtil();private Image back1 = null; / 墙private Image back2 = null; / 地板private Image back3 = null; / 笼子private Image back4 = null; / 魔王private Image over = null;private int map = getMission(LVL); / 当前关卡的地图public static int LVL = 1;public int getMap() return map;public void setMap() / 进入下一关this.map = getMission(+LVL);private int mapX = 100;/ 地图开始的初始坐标private int mapY = 100;private GamePanel gp; / 这样就可以得到画纸上的内容,比如英雄b. 构造方法中加载图片public Maps(GamePanel gp) this.gp = gp;back1 = iu.getImage(back1.gif);back2 = iu.getImage(back2.gif);back3 = iu.getImage(back3.gif);back4 = iu.getImage(back4.gif);over = iu.getImage(阴阳.jpg);c.接收一个关卡的编号返回地图public int getMission(int i) / 墙是1, 地板是2 ,笼子4 ,魔王8,英雄16/ 笼子+地板+魔王14switch (i) case 1:map = new int 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 , 1, 6, 6, 1, 2, 2, 2, 2, 2, 1 , 1, 6, 6, 1, 2, 10, 2, 10, 2, 1 , 1, 6, 6, 1, 10, 10, 10, 10, 18, 1 , 1, 2, 2, 2, 2, 2, 2, 2, 2, 1 , 1, 2, 2, 2, 2, 2, 2, 2, 2, 1 , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,;break;case 2:map = new int 19 ;break;return map;d.画地图的方法public boolean draw(Graphics g) boolean yes6 = true; / 为true的时候说明游戏结束了for (int i = 0; i map.length; i+) for (int j = 0; j mapi.length; j+) switch (mapij) case 1:g.drawImage(back1, mapX + j * 32, mapY + i * 32,Color.BLACK, null);/ 画出背景图片break;case 2:g.drawImage(back2, mapX + j * 32, mapY + i * 32,Color.BLACK, null);/ 画出背景图片break;case 6:g.drawImage(back2, mapX + j * 32, mapY + i * 32, null);/ 画出背景图片/ ,图片叠加不要加背景颜色g.drawImage(back3, mapX + j * 32, mapY + i * 32, null);/ 画出背景图片yes6 = false; / 如果有6说明游戏未结束break;case 10:g.drawImage(back2, mapX + j * 32, mapY + i * 32, null);/ 画出背景图片g.drawImage(back4, mapX + j * 32, mapY + i * 32, null);/ 画出背景图片break;case 18: / 发现18后要设置英雄出现的位置g.drawImage(back2, mapX + j * 32, mapY + i * 32,Color.BLACK, null);/ 画出背景图片/ 发现是18就设置英雄出现的位置gp.getHero().setHeroX(mapX + j * 32);gp.getHero().setHeroY(mapY + i * 32);/ 设置好之后,将这块设为地板mapij = 2;/ 如果不改为2,英雄就在这个位置不动了break;case 14:g.drawImage(back2, mapX + j * 32, mapY + i * 32, null);/ 画出背景图片/ ,图片叠加不要加背景颜色g.drawImage(back4, mapX + j * 32, mapY + i * 32, null);/ 画出背景图片/ ,图片叠加不要加背景颜色g.drawImage(back3, mapX + j * 32, mapY + i * 32, null);/ 画出背景图片/ ,图片叠加不要加背景颜色break;case 19:/ g.setColor(Color.black);/ g.drawOval(0, 0, 60, 60);g.drawImage(over, 0, 0, null);break;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汉堡店安全知识培训课件
- 永济市交通安全知识培训课件
- 水轮机蝶阀课件
- 建筑工程合同管理方案
- 施工人员劳动保护与安全防护方案
- 人教版PEP四年级上册 Unit 2 My schoolbag 单元测试提升B卷(含答案)
- 图形图像处理数码照片处理之摄影基础84课件
- 陶瓷造型工艺36课件
- 消防系统应急反应方案
- 水电维修基础知识培训课件
- 插板机安全操作规程
- 铭复乐IV期临床方案介绍
- ks-9000气体报警控制器使用说明书
- 《SPC统计过程控制》课件
- GB/T 14153-1993硬质塑料落锤冲击试验方法通则
- (完整版)人教版八年级下册《道德与法治》期末测试卷及答案【新版】
- 并购贷款业务培训
- 北京大学人民医院-医疗知情同意书汇编
- 建设集团有限公司安全生产管理制度汇编
- 牙体牙髓病最全课件
- 交通信号控制系统检验批质量验收记录表
评论
0/150
提交评论