推箱子游戏设计与实现.docx
《推箱子游戏设计与实现.docx》由会员分享,可在线阅读,更多相关《推箱子游戏设计与实现.docx(31页珍藏版)》请在冰豆网上搜索。
推箱子游戏设计与实现
毕业设计(论文)
课题名称 基于swing开发的推箱子游戏
学生 姓 名 吕季干
学 号 0840819035
系、年级专业 理学与信息科学系2008级信息与计算科学
指导教 师 戴亚滨
职 称 讲 师
2012年5月 25日
摘要
在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为娱乐方式。
但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的设计、艺术、声音和软件。
推箱子游戏是一款很有趣味的游戏,它由英雄、魔王、笼子、墙和地板组成,然后存储在一个数组中,用户根据键盘的向上、向左、向右和向下键操作.其开发过程有一定的技巧和方法,其中涉及到二维数组、键盘操作以及图形化函数等方面的知识。
此次设计是在Microsoft Windows7系统下,以java为开发语言,在eclipse平台上进行游戏的设计与实践.
关键词:
游戏设计、数组、开发语言
Abstract
Inthecurrentera ofrapiddevelopment ofelectronicinformation,electronic gameshasbeendeeplyPeople'sDaily life,beenjoyedbyyoungandoldformof entertainment。
But the gamedesigncombined withtomorrow’stechnology, inaproduct integrationofcomplexdesign, art,soundandsoftware, so notwell-known。
Pushed box gameisavery interesting game,itachieved byHero,Devil,Cage,FloorandWall, andthenstoredinanarray ,usersaccordingto thekeyboardfourthedirection up,left, rightand downoperation tocontrol.Pushedbox gamedevelopment processhascertainskills andmethods, whichinvolvesatwo dimensionalarray, keyboardandgraphical functionandother aspects.Thisdesign isinMicrosoftWindows7system,withJAVAfordevelopmentof language, Ecpliseplatformgamedesign andpractice.
Keywords:
Gamedesign,array,Developmentlanguage
摘要I
AbstractII
前言ﻩ1
1可行性分析2
1。
1要求2
1。
2目标ﻩ2
2项目开发计划的任务分解2
3概要设计2
3.2游戏四种基本图形ﻩ2
3。
4箭头图片3
4。
2功能需求ﻩ3
4。
3运行需求ﻩ4
5详细设计4
5.1系统模块ﻩ4
5.2 任务执行流程5
5。
3 小人移动流程5
6界面实现ﻩ5
6。
1 界面区5
6.2 游戏区8
6。
3图片加载区ﻩ11
6.4英雄变化区ﻩ11
7结束语23
参考文献24
附录ﻩ25
致 谢ﻩ26
前言
随着社会的发展,人类的生产、生活越来越离不开信息.谁拥有了更多更有效的信息,谁就将在竞争中处于有利的地位。
信息产业正在成为一个国家的支柱。
只有拥有了先进的技术和知识,才能有效地管理好浩如烟海的信息,并从中提取出对自己有用的信息来加以利用。
推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。
它既能锻炼思维的严密性,又有很多乐趣。
我个人也比较喜欢玩这个游戏,因此,我就借这个机会将这个推箱子游戏用java语言实现了出来,其中的界面使用了swing中的工具,当然,我也借鉴了前人的一些技巧经验。
然而Swing是什么?
Swing是一个用于开发Java应用程序用户界面的开发工具包。
它以抽象窗口工具包为基础使跨平台应用程序可以使用任何可插拔的外观风格。
Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。
通过本次游戏的设计,综合自己在校期间所学的理论知识,设计开发推箱子游戏,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对java,swing基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。
由于时间仓促和本人水平有限,此游戏的制作显得有些粗糙,我以后将会再接再厉.
1可行性分析
1。
1要求
在eclipse的开发环境下,利用所学java语言相关知识,开发一个推箱子小游戏,实现游戏界面规划、英雄走动、魔王动向等功能。
建立一个javaproject工程,实现游戏的编程设计。
1。
2目标
可包括:
a. 人力与设备费用的节省:
单独开发
b.界面友好美观:
自绘技术实现
c。
游戏的可操作性,通过键盘的方向键实现
d。
游戏界面的游戏区
e. 等等
2 项目开发计划的任务分解
a. 建立一个javaproject工程
b.建立一个Hero包
c。
画出游戏区域
d.调整游戏窗口大小
e. 加载游戏相关图片
f.计算游戏结果,判断是否进入下一关
3 概要设计
3。
1游戏界面
背景图片如下:
3.2游戏四种基本图形
在游戏中相对应的图片分别为:
3。
3英雄走向图形
图片如下:
3。
4箭头图片
3。
5游戏操作
操作如下:
方向键左:
左移
方向键右:
右移
方向键上:
上移
方向键下:
下移
箱子只可以推, 不可以拉,而且一次只能推动一个,胜利条件就是把所有的箱子都推到目的地。
4需求规格说明
4.1运行环境
MicrosoftWindowsXP Microsoft Windows7Eclipse
4。
2功能需求
a。
图形左右移动
b。
图形上下移动
c。
实现开始,结束按钮的功能
d。
使游戏窗口最大化失效
4。
3运行需求
硬件和软件接口:
1。
cpu :
1.6GHz以上
2.内存:
256M以上
3.操纵系统:
Micorsoft WindowsXP MicrosoftWindows7
4.运行软件:
Eclipse
5详细设计
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.界面区总代码:
importjava。
awt.Toolkit;
import java。
awt.event.KeyEvent;
importjava.awt.event。
KeyListener;
import javax.swing。
JFrame;
publicclassGameFrame extendsJFrame {
ﻩprivateGamePanel gp =newGamePanel();
ﻩprivateImageUtiliu=newImageUtil();// 加载图片的工具
ﻩpublicGameFrame(){
ﻩinit();
}
publicvoidinit() {
ﻩﻩthis.add(gp);// 加入画纸
ﻩthis.setSize(540+4, 440+62);
ﻩﻩthis。
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setCursor(Toolkit。
getDefaultToolkit()。
createCustomCursor(
ﻩﻩﻩﻩiu.getImage(”cursor。
png”),newPoint(26,29), ”aaa"));
this。
setResizable(false);// 不能改变窗体大小
this.setResizable(false);
ﻩthis。
setTitle(”英雄传说II—-—吕季干");
//加一个监听器,保镖,匿名类:
匿名类的格式new接口名(){ 接口中的方法的实现 }
ﻩﻩthis。
addKeyListener(newKeyListener(){
@Override
publicvoid keyPressed(KeyEventarg0){
ﻩﻩ//TODOAuto—generatedmethodstub
ﻩﻩswitch(arg0。
getKeyCode()){
ﻩﻩ// 0=向下 1=向左2=向右 3=向上
ﻩﻩcase39:
//System.out。
println("英雄向右");
ﻩﻩgp。
setHeroF
(2);
ﻩﻩbreak;
ﻩcase40:
//System。
out。
println("英雄向下");
ﻩgp。
setHeroF(0);
ﻩﻩﻩﻩbreak;
ﻩﻩﻩcase38:
//System.out。
println("英雄向上”);
ﻩﻩgp.setHeroF(3);
ﻩﻩﻩﻩbreak;
ﻩcase 37:
//System。
out.println(”英雄向左”);
ﻩﻩﻩgp.setHeroF(1);
ﻩﻩbreak;
ﻩﻩﻩ}
}
ﻩﻩ@Override
publicvoid keyReleased(KeyEventarg0){
ﻩ//TODOAuto-generated methodstub
ﻩ}
ﻩﻩ@Override
ﻩﻩﻩpublic voidkeyTyped(KeyEventarg0){
ﻩﻩﻩﻩ//TODO Auto—generatedmethodstub
ﻩﻩﻩ}
ﻩﻩ});
ﻩthis.setVisible(true);
}
ﻩpublicstaticvoidmain(String[]args){
ﻩﻩ//TODO Auto-generatedmethodstub
ﻩnewGameFrame();
ﻩ}
}
6。
2游戏区
这个区域主要完成游戏界面的大小等元素.
a.界面大小:
this。
setSize(600, 500);
b.界面实现如下图:
c.游戏区总代码:
packageframe;
importjava.awt。
Color;
importjava.awt。
Graphics;
importjava。
awt。
Image;
importjavax.swing.JPanel;
publicclassGamePanel extendsJPanel {
ﻩprivatestaticfinallongserialVersionUID= 6792476564904637059L;
privateImagebackImage;// 背景图片
ﻩprivate Imageme;
ﻩprivateImageUtiliu=newImageUtil();//加载图片的工具
ﻩprivate Herohero = newHero(this);
ﻩprivateMapsmap =newMaps(this);
publicMapsgetMap() {
ﻩreturn map;
ﻩ}
public voidsetMap(Mapsmap){
ﻩthis。
map=map;
ﻩ}
publicGamePanel(){
this。
setSize(600,500);
ﻩﻩthis。
setBackground(Color。
BLACK);
backImage=iu.getImage("back1.jpg");//初始化背景图片
ﻩ//heroImage=iu.getImage("role1.gif”);//英雄的图片
//me=iu.getImage(”慧灵.jpg");
ﻩnewD().start();//启动线程
}
ﻩ@Override
ﻩpublicvoidpaint(Graphicsg){
ﻩﻩ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传递过去,画出英雄
ﻩ}
//该方法用于改变英雄运行的方向
publicvoid setHeroF(int f){
ﻩhero.setF(f);//将方向的改传给英雄
ﻩhero.setMoving(true);//因为按了键所以可以移动
}
ﻩ//使用线程来完成,内部类:
写在类里面的类
classDextendsThread{
ﻩpublic voidrun() {//方法必须这么写
ﻩﻩwhile(true){
ﻩﻩﻩtry{
ﻩﻩThread.sleep(40);
ﻩﻩﻩ}catch (InterruptedExceptione) {
ﻩﻩ//TODOAuto—generatedcatchblock
ﻩﻩe。
printStackTrace();
ﻩﻩﻩ}
ﻩﻩﻩGamePanel。
this.repaint();//调用这个D对象外面的repaint()
ﻩﻩﻩ}
}
}
publicHero getHero(){
ﻩreturnhero;
}
public voidsetHero(Herohero){
this.hero=hero;
}
}
6.3图片加载区
这个区域主要负责加载各类型的图片,使界面变得美观等条件。
图片加载区总代码:
packageframe;
import java。
awt.Image;
import java.awt.Toolkit;
importjava。
io.IOException;
importjavax。
imageio.ImageIO;
publicclassImageUtil{
ﻩpublicImagegetImage(String imageUrl){
Image image=null;
try{
ﻩﻩ// 会将图片加载在内存中
ﻩﻩimage= ImageIO。
read(this.getClass()。
getClassLoader()
ﻩﻩﻩ.getResourceAsStream(”image/”+imageUrl));
ﻩ}catch(IOExceptione){
//TODOAuto-generatedcatchblock
ﻩﻩe。
printStackTrace();
ﻩ}
ﻩreturnimage;
}
}
6。
4 英雄变化区
这个区域主要负责英雄的变化,如下:
a。
英雄的起始坐标:
//存放英雄起始位置的坐标
private intheroX=200;
ﻩprivate intheroY= 200;
b.英雄起始的方向:
private int f =0;//0=向下1=向左2=向右3=向上
c。
画英雄的方法:
publicvoiddraw(Graphicsg){
ﻩ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。
英雄坐标改变的方法:
publicvoidmoving(){
ﻩﻩswitch(f){
case0:
ﻩif(peng()){
ﻩﻩheroY+= 32;
ﻩ}
ﻩﻩﻩbreak;
case1:
ﻩﻩif (peng()){
ﻩﻩheroX -=32;
ﻩﻩ}
ﻩbreak;
ﻩﻩcase2:
ﻩif(peng()){
ﻩheroX +=32;
ﻩﻩﻩ}
ﻩﻩbreak;
ﻩcase 3:
ﻩif(peng()){
ﻩﻩheroY—=32;
ﻩﻩ}
ﻩbreak;
ﻩﻩ}
isMoving=false;//每移动一次就停止
ﻩﻩ//System.out。
println("现在英雄的坐标是:
"+heroX+"—-"+heroY);
ﻩ}
e.碰撞检测的方法,返回能走还是不能走
publicbooleanpeng(){
//1。
得到英雄在地图中的位置
ﻩintrow= (heroY—100)/32;
ﻩint column =(heroX—100)/32;
ﻩ//2.根椐英雄的位置及行进的方向,判断地图上是否可以行走
ﻩﻩswitch(f){
ﻩ//0=向下1=向左2=向右3=向上
case0:
//得到地图对象中的地图数组
ﻩﻩif(gp。
getMap().getMap()[row+ 1][column]== 2
ﻩﻩ||gp.getMap().getMap()[row+1][column]==6){
ﻩﻩﻩreturn true;
ﻩ}
ﻩif (gp.getMap()。
getMap()[row+1][column] ==10) { //前面是魔王
ﻩﻩif(gp.getMap()。
getMap()[row +2][column]==2){//前面前面是地板
ﻩﻩﻩgp。
getMap()。
getMap()[row+1][column]=2;
ﻩﻩﻩﻩﻩgp.getMap()。
getMap()[row +2][column]=10;
ﻩﻩreturntrue;
ﻩﻩ}
if(gp.getMap().getMap()[row+2][column] ==6) {//前面前面是笼子
ﻩﻩﻩgp。
getMap()。
getMap()[row+ 1][column]= 2;
ﻩﻩﻩﻩgp。
getMap()。
getMap()[row + 2][column] = 14;
ﻩﻩﻩreturntrue;
ﻩ}
ﻩﻩﻩ}
ﻩﻩﻩif(gp.getMap()。
getMap()[row+ 1][column] ==14){ //前面是带笼子魔王
ﻩif (gp.getMap().getMap()[row+2][column]== 2) {// 前面前面是地板
ﻩﻩﻩgp.getMap().getMap()[row+1][column]=6;//前面就变成笼子
ﻩﻩgp。
getMap().getMap()[row +2][column]=10;// 前面的前面变成了魔王
ﻩﻩﻩreturntrue;
ﻩﻩ}
ﻩﻩﻩif(gp。
getMap()。
getMap()[row+2][column]==6){//前面