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

超级长文预警!
很多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 解决闪频
创建一个图片
//解决闪动问题
重写paint()方法
创建一个和弹出窗口宽高相同的图片,
获取该图片的图形对象,把所有内容添加到该图片中
Image offScreemImage = null;
//创建和容器一样大小的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架构栈,回复【坦克】获取项目资料