欢迎光临散文网 会员登陆 & 注册

快来看,新手实战必备!单机版坦克大战分步实现项目源码~

2022-03-29 17:35 作者:千锋教育  | 我要投稿


超级长文预警!





很多java初学者,在学习一段时间java后,都想写一个项目练练手来检测一下学习成果,而坦克大战就是一个非常好的试手项目。坦克大战本身就是一个非常经典的单机项目,其次使用java来实现,技术点几乎能够涉及到java所有的基础知识。

那么千锋老谢就从最开始手把手的教你实现坦克大战,简单明了,步骤详细,绝对让你写出自己的坦克大战,同时加深对java知识的理解。那我们就开始吧。

1. 窗体绘制

JFrame是指一个计算机语言-java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。

1.1 创建窗口

  • 创建类继承JFrame

  • 创建启动方法launch()

  • setTitle() 设置标题

  • setSize(width, height); 设置宽高

  • setLocationRelativeTo(null); 设置位置,null为居中

  • setResizable();  是否可拉伸

  • setVisible(); 是否可见

  • setDefaultCloseOperation(3); 1,2,3 (点差号,关闭程序)

1.2 为窗口上色

  • 重写paint()方法,参数g为图形

  • 设置图形颜色

  • 设置图形大小

1.3 添加选项文字

  • 设置字体颜色,不要和背景色一样

  • 设置字体,字体大小

  • 添加文字,及文字位置

1.4 为窗口添加键盘事件

  • 添加内部类,实现KeyAdapter类,重写keyPressed方法,监听按钮

  • 窗口添加键盘监视器

  • 设置初始纵坐标为150

    • int y = 150;

  • 在paint()方法,添加此图片

    • g.drawImage(select, 160, y, null);

  • 在launch()方法中重绘图形(每隔30毫秒)

    • //重绘

  • 重写键盘事件,1选择单人模式,2选择双人模式

//添加内部类,实现KeyAdapter类,重写keyPressed方法

  • 定义选择相应模式后,点击回车键,显示响应窗口

  • 定义模式state 0:未选择,1:单人 2:双人

    //模式state 0:未选择,1:单人 2:双人

    int state = 0;

    int a = 0;

    • 重写点击事件

    //添加内部类,实现KeyAdapter类,重写keyPressed方法

  • 写入图形判断

  • 整体代码

1.6 解决闪频

  • 创建一个图片

    • //解决闪动问题

    Image offScreemImage = null;

  • 重写paint()方法

    • 创建一个和弹出窗口宽高相同的图片,

    • 获取该图片的图形对象,把所有内容添加到该图片中

    //创建和容器一样大小的Image图片

  • 把该图片写入到窗口中

    • g.drawImage(offScreemImage, 0, 0,null);

2. 键盘控制坦克移动

2.1 添加游戏类父类

  • 属性

  • 图片

  • 位置(坐标)

  • 面板

  • 方法

  • 构造方法

  • 在图形中构建自己

  • 获取自身矩形(用于比较中弹)

2.2 添加坦克类

  • 尺寸(宽高)

  • 速度

  • 方向

  • 不同方向图片

2.3 添加玩家类

2.4 在窗口中添加玩家

  • 创建玩家对象

  • //添加玩家一到面板

  • 把玩家对象添加到图形中

    playerOne.paintSelf(g);

    

2.5使用键盘控制坦克移动

  • 在坦克类(Tank)中添加上下左右四个方法

    • 不同方向设置不同图片

    • 不同的方向

    //移动方法

    

    

  • 在PlayerOne类中按钮点击,松开方法,及移动方法

    • W上,A左,S下,D右

    boolean left, right, up, down;

    //键盘按下去方法

  • //移动的方法,每次在绘制的时候移动

  • 在主窗口类中,添加对A,S,D,W按键的监控

    //键盘监控

3. 坦克发射子弹

3.1 创建子弹类

  • 属性

    • 尺寸

    • 速度

    • 方向

  • //尺寸

        int width = 10;

        int height =10;

        //速度

        int speed = 7;

        //方向,方向和坦克方向一致

        Direction direction;

  • 方法

    • 左移,右移,下移,上移

    • 根据坦克方向不同,移动方向不同

    • //移动方法

全部代码:



3.2 实现坦克发射子弹

  • 在坦克类中

    • 获取坦克的头部坐标

    

  • 添加发射方法

  • 根据坦克头坐标,及坦克方向创建子弹

  • 把创建的子弹添加到面板中创建子弹集合中

        //发射子弹

//子弹集合 在面板类中定义



  • 在PlayerOne类中添加键盘事件

    • 当点击空格按钮,就会调用射击方法

    //键盘按下去方法

3.3 添加子弹冷却时间

  • 在坦克类中添加冷却状态,冷却时间

        //冷却状态

        boolean attackCoolDown = true;

        //冷却时间

        int attackCoolTime = 1000;

  • 创建冷却线程

        //冷却线程

  • 修改发射方法,每发射一次,启动冷却线程

        //发射子弹

4. 敌方坦克

4.1 随机添加敌方坦克

  • 添加敌方坦克类

        //敌方坦克

  • 批量把敌方坦克图片添加到面板上

  • 把敌方坦克的图片添加到项目中(4个方向各一个)

  • 在面板中创建敌方坦克集合

  • 面板每重新加载100次,添加一个敌方坦克,敌方坦克最多有10各

        //重绘次数

        int count =0;

        //敌方坦克个数

        int enemyCount = 0;

  • 在重新绘制循环中,添加敌方坦克

        //重新载入窗口

在开始游戏加载面板中显示敌方坦克并对count自增(paint方法)

4.2 敌方坦克随机移动

  • 随机生成方向(Bot)

        //随机生成个数,表示方向

  • 添加运动方法,每20次,转化一次方向(Bot)

        //每间隔20,转换方向一次

        int moveTime = 20;

        //行走方法

    //勿忘把重绘方法添加到绘制自己方法中



4.3 敌方坦克射击

  • 创建敌方子弹类,直接继承Bullet即可

  • 在机器人坦克类中添加攻击发射方法

    • 机器人自行发射,把该方法添加到go()方法中

    //攻击类,添加到go方法中

//机器人坦克自行行走

5. 碰撞检测

5.1 我方子弹(Bullet)和敌方坦克(Bot)碰撞

  • 在面板类中定义要删除/消失的子弹(GamePanal)

  • 在每次重绘时,把删除的子弹从绘制子弹集合中删除

        //碰撞后要删除的子弹

  • 在子弹类中添加碰撞方法(Bullet)

    • 在绘制每个子弹时,把当前子弹对象和所有计算机坦克比较是否碰撞

    • 该方法要添加到绘制方法中

        //碰撞 添加到paintSelf方法中,每次绘制时,检测

5.2 敌方子弹和我方坦克碰撞

  • 添加我方坦克集合(为后续扩展使用)

    • 把玩家都添加到此集合中,在选择游戏模式时添加

  • 玩家的绘制,修改成遍历该集合

    • 不要忘记把原绘制玩家代码删除

        //玩家坦克集合

  • 在敌方子弹类中添加碰撞方法

    • 该方法添加到绘制方法中

       //碰撞 添加到paintSelf方法中,每次绘制时,检测

    

5.3 与围墙的碰撞检测

5.3.1面板中添加围墙

  • 添加围墙类

        

5.3.2 添加围墙和子弹碰撞检测

  • 子弹类添加和围墙碰撞方法(Bullet)

    • 把该方法添加到go()方法中,让敌方子弹也可以和围墙碰撞

    //子弹和围墙碰撞,添加到go方法中,让敌方子弹也可以击破围墙

        

5.3.3 坦克和围墙碰撞

  • 当坦克和围墙碰撞时,坦克无法移动

  • 在坦克类中添加围墙碰撞方法

  • 然后在移动类中判断是否会和围墙碰撞,如果碰撞则不移动

        //与围墙碰撞检测

        

  • 修改所有移动的方法

    //移动方法 左移

        

5.4 判断坦克边缘的碰撞

  • 坦克类中添加边缘碰撞判断(Tank)

    • 该判断添加到移动方法中

        //判断和边缘的碰撞

5.5判断子弹是否出界

  • 判断子弹坐标是否出界,如果出界则删除

    • 该方法添加到go方法中

        //如果子弹出界,该方法添加在go方法中,敌人子弹也可以删除 删除子弹,节省资源

6. 添加基地

6.1 创建并添加基地

  • 创建基地类

6.2 子弹与基地的碰撞测试

  • 在子弹类中添加碰撞方法

    • 该方法添加到go方法中

        //与基地碰撞方法

  

     

7. 游戏规则

  • 我方胜利

    • 把所有的敌人干倒

  • 机器赢了

    • 玩家坦克被干掉

    • 基地被倒了

        //判断规则,在每次重绘时

    

关注公众号Java架构栈,回复坦克获取项目资料




快来看,新手实战必备!单机版坦克大战分步实现项目源码~的评论 (共 条)

分享到微博请遵守国家法律