zoukankan      html  css  js  c++  java
  • 坦克大战【java项目】

    坦克大战(JAVA项目)

    1.项目简介

    复刻童年经典小游戏——坦克大战:用户进入游戏界面后,通过键盘上的数字1,2键选择游戏模式,选择1并按回车键进入单人模式;选择2并按回车键进入双人模式。玩家1可通过按键WASD控制坦克方向及移动,并且按空格发射子弹。玩家2通过方向键控制坦克方向移动,并且按K键发射子弹。子弹碰到围墙后消失,子弹碰到坦克后产生爆炸特效。左上角记录敌方坦克的实时数量。玩家击败所有敌方坦克,游戏胜利;若所有我方坦克被击败,或者我方基地被摧毁,则游戏失败。

    2.小组成员及分工

    成员 负责任务
    组长 黄抒鸿 博客撰写,游戏规则的制定,碰撞检测,爆炸特效的实现,随机事件的编写
    组员 雷正伟 前期调研,面向对象设计,窗体绘制,闪动问题的解决,键盘事件的编写

    3.项目功能架构图与主要功能流程图

    3.1项目功能架构图

    3.2主要功能流程图

    3.3面向对象类设计图

    4.功能详解

    4.1 窗体绘制及添加键盘事件

    4.1.1 创建窗口

    ·创建类继承JFrame

    ·创建启动方法launch()



    4.1.2 为窗口上色

    ·重写paint()方法,设置图形颜色和大小

    4.1.3 添加选项文字

    4.1.4 为窗口添加键盘事件

    添加内部类,实现KeyAdapter类,重写keyPressed方法,写入键盘事件,1选择单人模式,2选择双人模式

    窗口添加键盘监视器

    添加指针图片

    在项目文件夹下创建文件夹images,关于项目的图片,插件都放在这个文件夹内

    创建图片对象

    在launch()方法中重绘图形

    4.2双缓冲解决闪动问题

    创建一个图片

    Image offScreemImage = null;

    重写paint()方法

    创建一个和弹出窗口宽高相同的图片,
    获取该图片的图形对象,把所有内容添加到该图片中

    //创建和容器一样大小的Image图片
    		if(offScreemImage == null) {
    			offScreemImage = this.createImage(width,height);
    		}
    		
    		//获的该图片的图形
    		Graphics gImage = offScreemImage.getGraphics();
    		
    		gImage.setColor(Color.GRAY);
    		gImage.fillRect(0, 0, width, height);
    		
    		//添加游戏选项
    		gImage.setColor(Color.BLUE);
    		gImage.setFont(new Font("仿宋", Font.BOLD, 50));
    		
    		if (state == 0 ) {
    			gImage.drawString("选择游戏模式", 220, 100);
    			gImage.drawString("单人模式", 220, 200);
    			gImage.drawString("双人模式", 220, 300);
    			
    			//绘制指针
    			gImage.drawImage(select, 160, y, null);
    		} else if (state ==1 || state ==2) {
    			gImage.drawString("游戏开始", 220, 100);
    			if (state ==1) {
    				gImage.drawString("单人模式", 220, 200);
    			} else if(state ==2) {
    				gImage.drawString("双人模式", 220, 200);
    			}
    		}
    

    4.3面向对象设计

    游戏父类:


    坦克类:


    玩家一和玩家二

    玩家2和玩家1的方法都是一样的,只需要修改键盘事件。在图形界面更换打印玩家2的图片

    子弹类

    4.4敌方坦克的随机事件

    4.4.1敌方坦克随机方向移动

    用一个random类的变量,在0-3中任意生成一个数,通过switch方法,根据随机数的数值来返回相应的方向。
    新写一个int变量moveTime表示敌方坦克移动的次数,当次数大于等于20时,我们随机生成并改变敌方坦克的方向,然后重新给移动次数赋值为0;如果移动次数小于20,就加1;
    新写一个go的移动方法,首先生成一个随机的方向,最后通过switch来判断方向并调用相应的方法;最后将go方法添加到paintSelf中。

    4.4.2敌方坦克随机发射子弹

    实现随机发射,需要一个random类,让他在区间内随机返回一个数,如果这个数小于某个值,就发射子弹。

    4.5碰撞检测

    碰见检测:就是检测两个物体是否碰撞。判断坦克是否与子弹发生碰撞,如果碰撞,坦克发生爆炸。
    方法:把两个物体当作矩形,在他们移动过程中调用intersects方法判断两个矩形是否相交,如果是,证明被碰撞到了。
    考虑碰撞后续的状态变化。如果消失,用到的方法是,把它从paint遍历的列表中去掉。

    新建一个removeList,在遍历完子弹列表后,删除removeList里面要删除的子弹。
    子弹与坦克,边界,墙之间的碰撞检测:



    4.6爆炸特效

    先准备一串完整的动画,再获得爆炸坐标,通过连续切换图片实现爆炸特效。
    把爆炸连续的一串图片添加到images文件夹中,创建爆炸类:Blast

    4.7游戏规则

    设计思路:设计int 变量state,当state=1,按回车进入单人模式;当state=2,按回车进入双人模式。当state等于5时,游戏胜利;当state=3时,游戏暂停;state等于4时,游戏失败。当游戏不处于暂停模式时,先用a记录state的值,再给state赋值。

  • 相关阅读:
    问题 I: 夫子云游
    问题 H: 小k的简单问题
    问题 G: 圆桌上的晚餐
    问题 F: 超超的自闭意思
    promise与aysnc 与EventProxy
    node的实践(项目三)
    node的实践(项目二)
    node不懂的方法的使用
    github
    node的实践(项目一)
  • 原文地址:https://www.cnblogs.com/SONGminusone/p/15787869.html
Copyright © 2011-2022 走看看