1、清华大学出版社,2009四、要求的设计(调查/论文)成果1.课程设计报告2.课程设计软件五、进程安排布置任务,查找资料、需求分析1天总体设计1天详细设计1.5天编制源程序实现3.5天测试与修改1天撰写课设报告2天六、主要参考资料1 张广彬. Java课程设计案例精编(第二版).北京:清华大学出版社, 2011. 2 耿祥义. Java课程设计(第二版).北京:清华大学出版社, 2008.3 耿祥义JAVA大学实用教程北京:4 邹林达陈国君 Java2程序设计基础北京:清华大学出版社,20105 邹林达Java2程序设计基础实验指导北京:清华大学,2010指导教师(签名): 20 年 月 日1需
2、求与总体设计1.1需求分析提供一个友好的用户交互界面,简单明了容易操作。并且游戏有一定的难度和娱乐性。开发一个Mario类。一个场景类,以及敌人类,障碍物类。让超级玛丽能够在场景中完成各种动作。并且有场景的切换等等功能。游戏中设计了一些很有意思的陷阱,玩家一步小心掉入陷阱,超级玛丽就会死亡。这样会给人意想不到的惊奇,达到娱乐大众,增加游戏难度的效果。游戏的设计匠心独具,并且都经过了各种测试,除了为玩家增加一些意想不到的游戏陷阱以外,还必须保证玩家能够通关。1.2程序功能图如图1所示:图11.3程序类图系统的整体类图的框架如图2所示。首先是窗体类。他需要调用到Mario和BackGround类中
3、的方法。以便动态的显示Mario类和BackGround。而BackGround里面又包含了Enemy和Obstruction。Enemy,Obstruction和Mario类又调用静态类StaticValue的方法,用以显示真实的图片。而StaticValue则是一个静态类,将存储在硬盘的图片资源加载进入内存以便其他模块调用。图22详细设计2.1 MyFrame实现2.1.1窗体对象的序列图窗体对象继承了JFrame类并且实现了Runnable接口。作为窗体对象,它首先显示窗体,绘制背景。然后启动线程。在run方法里面动态得绘制窗体中需要显示的Mario的图片,障碍物的图片,敌人的图片。该窗
4、体的run方法是一个死循环,每次执行一个 循环调用sleep方法睡眠50毫秒。序列图如图3所示。图32.1.2 Myframe详细类图private Mario mario;/Mario对象private boolean isStart = false;/标识游戏是否已经开始this.paintAllEnemys(g2);/绘制所有的敌人this.paintAllObstruction(g2);/绘制所有障碍物2.2 Mario实现2.2.1 Mario对象的序列图因为需要有一个专门的线程来实时监测Mario的移动状况,和障碍物和敌人的碰撞情况。所以让Mario类继承了Runnable接口。M
5、ario先启动线程。该线程的run方法也是一个死循环。首先根据Mario的状态changeMarioImage方法修改Mario的显示图片。再根据Mario的determinexy方法决定Mario的移动。然后通过deterMarioWithObstruction方法检测Mario和障碍物之间的碰撞,在根据marioTouchEnemys方法检测Mario和敌人之间的碰撞。然后调用sleep()方法让线程休息5毫秒。如此结束一个循环。序列图如图4所示。图42.2.2 Mario类图类图中:private int x;/Mario的x坐标private int y;/Mario的y坐标priva
6、te int life;/Mario的生命BackGround bg = null;/Mario所在的背景private int uptime;/Mario的上升时间String status;/Mario的移动状态int score;/Mario的分数Thread t;/Mario的线程int xmove;/Mario的x移动距离int ymove;/Mario的y移动距离private boolean isClear = false;/标识用户是否通关。isClear为true时代表用户通关了2.3 Enemy类的实现/敌人的x坐标/敌人的y坐标private int startX;/敌人
7、的初始x坐标private int startY;/敌人的初始y坐标private boolean startIsLeftOrUp;/敌人初始的移动方向private int startImageType;/初始的显示图片private int type;/敌人的类型1代表蘑菇,2代表食人花,3代表乌龟private BufferedImage bufferedImage;private BackGround bg;/障碍物所在的背景private int imageType;/移动的极限范围详细类图如下:2.4 Obstruction类的实现/障碍物的x坐标/障碍物的y坐标private B
8、ufferedImage showImage = null;/障碍物的显示图片/障碍物的类型private int startType;/障碍物的初始类型 /标识该障碍物在哪一个场景中2.5 BackGround类实现private int sort;/背景的序列号private boolean flag;/标识是否是最后一张图片,flag为true时代表到了最后一张图片 private boolean isOver = false;/标识游戏是否已经结束private boolean isDown = false;/标志是否降旗结束3编码实现源代码import java.awt.image.
9、BufferedImage;import java.util.ArrayList;import java.util.List;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Iterator;import javax.swing.JFrame;import javax.swing.JOptionPane;import java.io.File;import javax.imageio
10、.ImageIO;public class MyFrame extends JFrame implements KeyListener,Runnable public static void main(String args) new MyFrame(); private List allBg = new ArrayList(); /当前背景 private BackGround nowBg = null; private Mario mario; private boolean isStart = false; public void setNowBg(BackGround nowBg) t
11、his.nowBg = nowBg; private Thread t; /* */ public MyFrame() this.setSize(900,600); this.setTitle(马里奥游戏); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; this.setLocati
12、on(width - 900) / 2,(height - 600) / 2); this.addKeyListener(this); StaticValue.init(); this.setVisible(true); /绘制出所有的背景 for(int i = 1; i = 4; i+) this.allBg.add(new BackGround(i, i = 4 ? true : false); this.nowBg = this.allBg.get(0); this.mario = new Mario(0, 480); this.mario.setBg(nowBg); this.set
13、Resizable(false); t = new Thread(this); t.start(); Override public void paint(Graphics g) BufferedImage image = new BufferedImage(900, 600, BufferedImage.TYPE_4BYTE_ABGR); if(isStart) Graphics g2 = image.getGraphics(); g2.drawImage(this.nowBg.getBgImage(), 0, 0, this);/绘制背景 g2.drawString(生命: + this.
14、mario.getLife(), 800, 60);/显示生命数分数: + this.mario.getScore(), 60, 60); this.paintAllEnemys(g2); this.paintAllObstruction(g2); else g2.drawImage(StaticValue.startImage, 0, 0, this);/绘制游戏开始的图片 g.drawImage(image, 0, 0, this); public void keyPressed(KeyEvent e)/ int k = e.getKeyCode(); /获得键盘的ASCII码 Syste
15、m.out.println(k); if(this.isStart) if(e.getKeyCode() = 39) this.mario.rightMove(); if(e.getKeyCode() = 37) this.mario.leftMove(); if(e.getKeyCode() = 32) this.mario.jump(); /按下空格键,Mario的生命加10 if(70 = e.getKeyCode() this.mario.setLife(this.mario.getLife() + 10); this.isStart = true; this.nowBg.enemys
16、StartMove(); public void keyReleased(KeyEvent e) if(e.getKeyCode() = 39) this.mario.rightStop(); if(e.getKeyCode() = 37) this.mario.leftStop(); public void keyTyped(KeyEvent e) / TODO Auto-generated method stub public void run() while(true) this.repaint(); if(840 = this.mario.getX() this.intoNewBack
17、Ground();/进入下一张图片 if(this.mario.isClear() JOptionPane.showMessageDialog(this, 恭喜您通关了,敬请期待新的关卡 System.exit(0); if(this.mario.isDead() this.gameOver();/游戏结束 this.sleep(); /进入下一张图片 private void intoNewBackGround() this.nowBg = this.allBg.get(this.nowBg.getSort(); this.mario.setBg(this.nowBg); this.mari
18、o.setX(0); this.mario.setY(480); this.mario.setUptime(0); this.nowBg.enemysStartMove(); /绘制所有的敌人 private void paintAllEnemys(Graphics g2) Iterator iterEnemy = this.nowBg.getAllEnemy().iterator(); while(iterEnemy.hasNext() Enemy e = iterEnemy.next(); g2.drawImage(e.getBufferedImage(), e.getX(), e.get
19、Y(), this); /绘制所有障碍物 private void paintAllObstruction(Graphics g2)Obstruction iter = this.nowBg.getAllObstruction().iterator(); while(iter.hasNext() Obstruction ob = iter.next(); g2.drawImage(ob.getShowImage(), ob.getX(), ob.getY(), this); g2.drawImage(mario.getShowImage(), mario.getX(), mario.getY(
20、), this); private void sleep() try Thread.sleep(20); catch (InterruptedException e) e.printStackTrace(); /游戏结束 private void gameOver() JOptionPane.showMessageDialog(this, 马里奥死亡 this.mario.setDead(false); System.exit(0);class BackGround private BufferedImage bgImage = null; private int sort; private
21、boolean flag;/标识是否是最后一张图片,flag为true时代表到了最后一张图片 allEnemy = new ArrayList/所有敌人的集合 /所有障碍物的集合 allObstruction = new ArrayList /所有被移除的敌人的集合 removeEnemy = new ArrayList /所有被移除的障碍物的集合 removeObstruction = new ArrayList private boolean isOver = false; private boolean isDown = false; public boolean isDown() re
22、turn isDown; public void setDown(boolean isDown) this.isDown = isDown; public boolean isOver() return isOver; public void setOver(boolean isOver) this.isOver = isOver; public boolean isFlag() return flag; public void setFlag(boolean flag) this.flag = flag; public int getSort() return sort; public vo
23、id setSort(int sort) this.sort = sort; public BufferedImage getBgImage() return bgImage; public List getAllObstruction() return allObstruction; getRemoveObstruction() return removeObstruction; getAllEnemy() return allEnemy; getRemoveEnemy() return removeEnemy; * * param sort 背景的序列号 * param flag 标识是否是最后一张背景 public BackGround(int sort, boolean flag) if(flag) bgImage = StaticValue.endImage; bgImage = StaticValue.bgImage; switch(sort) case 1: this.creat1Map(); break; case 2: this.creat2Map(); case 3: this.creat3Map(); case 4: this.creat4Map(); public void reset() thi
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2