zoukankan      html  css  js  c++  java
  • JAVA课程设计-飞机大战

    JAVA课程设计-飞机大战

    1.团队名称、团队成员介绍

    1.1 团队名称:做个飞机哦

    1.2团队成员介绍:

    余俊良(组长):编写博客、游戏主界面设计与实现、英雄机与子弹类的实现、场景设计
    林祥涛:游戏音效设计、玩家类编码与设计、小Boss类设计、ppt设计
    高凯:画uml类图、积分榜设计、游戏道具定义实现、游戏状态设计

    2.项目git地址

    https://gitee.com/net_201821123052/Planewar.git

    3.项目git提交记录截图

    4.前期调查及游戏介绍

    玩家通过控制飞机发射子弹击中不同的敌机获取积分,击中快速移动的浮标获得奖励(获得双倍子弹奖励、生命值增加)。游戏过程伴随着背景音乐,而且击中敌机或生命耗尽后会产生相应音效。与敌机相撞则扣除生命值1点,直到生命值为0,游戏结束,玩法简单有趣,锻炼反应能力。

    5.项目功能架构图、主要功能流程图

    6.面向对象设计包图、类图

    包图

    类图

    7.项目运行截图

    主界面显示

    英雄机

    普通敌机

    精英机

    小boss

    切换飞机

    双倍子弹模式

    排行榜

    奖励

    游戏结束

    8.项目关键代码

    8.1鼠标事件

    使用鼠标事件监听MouseAdapter对鼠标进行监听,当鼠标移动时获取鼠标的坐标,点击时开启游戏,鼠标移出窗体后游戏暂停,移入则继续。

    		MouseAdapter m = new MouseAdapter() {
    			// 鼠标移动事件
    			public void mouseMoved(MouseEvent e) {// 鼠标坐标获取
    				if (Running == state) {
    					hero.moveTo(e.getX(), e.getY());
    				}
    			}
    
    			// 鼠标点击事件
    			public void mouseClicked(MouseEvent e) {
    				if (Start == state) {// 点击开始游戏
    					state = Running;
    				} else if (Over == state) {// 游戏结束后点击重新开始
    					state = Start;
    					score = 0;// 积分,飞行物重置
    					hero = new Heroplane();
    					flyobj = new ArrayList<AbstractFlyingObject>();
    					bullets = new ArrayList<Bullet>();
    				}
    			}
    
    			// 鼠标移出事件
    			public void mouseExited(MouseEvent e) {
    				if (Running == state) {// 移出窗体,游戏暂停
    					state = Pause;
    				}
    			}
    
    			// 鼠标移入事件
    			public void mouseEntered(MouseEvent e) {// 移回窗体,游戏继续
    				if (Pause == state) {
    					state = Running;
    				}
    			}
    		};
    

    8.2双缓冲技术消除闪屏

    闪屏的出现是因为在while循环中执行线程时每循环一次便会重绘一次,而update()方法即会先清理掉当前的画面再重新绘制新的画面。可以在内存中重新开辟新空间,作为后台图像,本应该在界面上进行清理与重绘现在内存中先实现,生成新画面,最后显示到屏幕上。

    private Image offScreenImage = null;// 利用双缓冲技术消除屏幕闪烁
    public void update(Graphics g) {
    	if (offScreenImage == null) {
    		offScreenImage = this.createImage(WIDTH, HEIGHT);
    	}
    	Graphics gOff = offScreenImage.getGraphics();
    	paint(gOff);
    	g.drawImage(offScreenImage, 0, 0, null);
    }
    

    8.3飞行物显示

    通过根据状态不断重绘飞行物来达到动画效果

    		Timer timer = new Timer();
    		int timeGap = 10;// 设定时间隔
    		timer.schedule(new TimerTask() {
    			public void run() {
    				if (state == Running) {
    					heroBulletEnter();// 英雄子弹的入场
    					enemyEnter();// 敌机的入场
    					enemyStep();// 敌机的移动
    					outBoundDel();// 删除越界(底)的敌机和子弹
    					enemyCrash();// 英雄机子弹与敌人相撞(子弹和敌机退场)
    					checkGame();// 检查游戏是否结束(敌机和英雄机相撞)
    				}
    				repaint();// 重画
    			}
    		}, timeGap, timeGap);// timeGap为每一次到下一次的触发间隔
    
    

    9.项目代码扫描结果及改正

    9.1第一次扫描结果

    9.2扫描修正

    在所有的覆写方法前增加@Override注释
    常量名应当全部大写,单词用下划线隔开
    switch块中,每个case都应通过break/default来终止
    方法内部单行注释,在被注释语句上方另一行使用//注释,多行注释使用/**/注释

    9.3全部修正后结果

    10.项目总结

    10.1不足

    原先计划能够在完成单人模式的基础上增加联网模式,但是在基本完成单人模式后剩余的时间的确不够去实现联网。设计的敌机类型也不够多,道具类型也可以再增加。

    10.2展望

    在课设完成后利用课余时间增加网络模式,并在网络中进行线上合作与排行

  • 相关阅读:
    【lc-database】595. 大的国家
    Visual Studio 2010软件安装教程
    Win10系统下安装VC6.0教程
    HTTP协议
    正则表达式
    类装饰器
    装饰器工厂函数
    装饰器函数
    闭包
    web服务器
  • 原文地址:https://www.cnblogs.com/yujun59/p/12168882.html
Copyright © 2011-2022 走看看