Java实现的坦克
设计思路:
坦克游戏主类:TankGame
控制自己坦克的类:MyTank
自己发出的炮弹的线程类:MyShell
敌人坦克运动线程类:EnemyTank
敌人炮弹线程类:Shell
监听敌人敌人炮弹队列的线程类:ShellThread
定时产生敌人坦克的线程类:CreateTank
游戏参数配置借口:Config
坦克游戏主类:TankGame
1.坦克游戏主类是程序运行开始的入口。
2.包含显示窗体的方法showUI();
3.以及重写后的重绘方法paint(g);
重绘方法中调用了以下方法:
drawNumber();//显示我方坦克剩余数
deploy();// 调用显示障碍物的方法
paintEnemyTank();//显示敌方坦克
drawMyTank();// 画出我自己的坦克
控制自己坦克的类:MyTank
MyTank类是控制自己坦克的类,这是一个监听器处理类,它继承了抽象类java.awt.event.KeyAdapter,用来监听键盘按键并控制我方坦克的运动。
java.awt.event.KeyAdapter类是键盘事件的抽象类,它实现了java.awt.event.KeyListener接口。
KeyListener接口中有3个方法:
keyPressed:按下按键时调用的方法;
keyTyped:键入某个键时调用此方法 ,可响应多次键击组合生成的字符 ;
keyReleased:释放按键时调用的方法。
自己发出的炮弹的线程类:MyShell
MyShell继承了Thread类。
用于控制我方发出的炮弹的运动情况。
其中含有几个判断方法
判断炮弹是否打出游戏区域
判断炮弹是否打中敌方坦克
通过遍历敌人坦克队列中的坦克对象,获取坦克对象的坐标并比较座标间的关系来判断是否打中坦克。
判断炮弹是否打到障碍物
敌人坦克运动线程类:EnemyTank
继承了Thread类的线程类,每一个EnemyTank的实例化对象就是一个敌人坦克。每一个线程对象独立控制各个敌人坦克的运动情况,包括:
坦克的运动方向
随机生成一个数字,根据数字判断运动方向
坦克是否运动到游戏区域边界,并限制它在游戏区域内运动
不能让坦克穿过实体障碍物(如:砖块和石头)
坦克控制发射炮弹
监听自己是否中弹,若中弹则消失
线程中每一次循环,都调用判断是否中弹的方法。获取我的炮弹的坐标跟敌人坦克的坐标进行比较。
敌人炮弹线程类:Shell
Shell继承了Thread类。
用于表示敌方发出的炮弹的运动情况。
其中含有几个判断方法
判断炮弹是否打出游戏区域
判断炮弹是否打中我方坦克
若打中,则我方坦克消失,敌人炮弹消失
判断炮弹是否打中敌方坦克
若打中,则只是炮弹消失
判断炮弹是否打到障碍物
若打中砖块,砖块消失
若打中石头,则只是炮弹消失
监听敌人炮弹队列的线程类:ShellThread
在敌方坦克线程中,每实例化一个敌人炮弹线程对象,就将这个炮弹线程对象添加到一个炮弹线程对象队列中。
队列的创建如下:
protected static java.util.ArrayList<Shell> shellList = new java.util.ArrayList<Shell>();
在ShellThread线程中,通过不断地询问炮弹队列中的炮弹是否已经消失,将已经消失的炮弹从队列中移除。
定时产生敌人坦克的线程类:CreateTank
根据游戏区域现有的敌方坦克数目和既定的时间,产生新的敌方坦克。
每隔一定时间判断一下游戏区域现有的敌方坦克数目是否小于既定的数目,如果小于则实例化敌方坦克对象,补充敌方坦克。
游戏参数配置接口:Config
窗体的大小参数
游戏区域大小参数
障碍物大小参数
坦克大小参数
坦克每次移动的距离
炮弹每次移动距离
障碍物布局二维数组等
碰到的问题
问题一、敌方坦克发射炮弹时,敌方坦克就会不停地闪烁。
尝试的解决方法:
1.最初尝试使用双缓冲技术,降低了闪烁频率。
2.使用双缓冲技术虽然在一定程度上解决了闪烁问题,但是出现了新的问题。在使用双缓冲技术之前,游戏区域的背景色是黑色,而在之后,背景色为无色。
3.经过分析,发现坦克闪烁的根源是:发射的炮弹把坦克覆盖了。于是,改进方案是:
1、改变发射炮弹的初始坐标,使初始坐标不在坦克的图片范围内。
2、改变炮弹图片的大小,将炮弹图片缩小。如:原来的图片是30*30的,可以将图片改成15*15,或10*10.
问题二、敌方坦克在中弹后还会继续运动一小段距离才会爆炸消失。
问题分析:
最初的设计是:在我的炮弹类中监听是否打中敌方坦克。若打中敌方坦克,就将我的炮弹设置为死亡,同时将被打中的坦克对象中的isOver属性设置为“true”,即终结坦克线程的run()方法中while循环。但是,由于各个线程独立运行,在坦克对象接收到新的isOver值有一定的时差,所以导致问题的出现。
解决方案:
改进前,只是在我的炮弹类中判断是否打中敌方坦克。改进后,在每一个敌方坦克线程对象中,都判断是否被我的炮弹击中,一旦被击中,则坦克线程会立即终止循环,终止线程。
<!--EndFragment-->
分享到:
相关推荐
《坦克大战js小游戏源码:HTML5重构经典游戏体验》 HTML5的崛起为游戏开发...通过学习和分析这个游戏的源码,我们可以深入理解Web游戏开发的各个环节,从而提升自己的编程技巧,甚至创造出更多富有创意的游戏作品。
《C语言实现的坦克大战游戏源代码解析》 在编程世界中,C语言以其高效、灵活的特点被广泛应用于系统开发、游戏制作等多个领域。本文将深入探讨一款基于C语言编写的坦克大战游戏的源代码,旨在帮助读者了解游戏开发...
Android坦克大战游戏分析资料。欢迎大家下载学习
在这个坦克游戏中,Canvas被用来绘制游戏场景、坦克、子弹和障碍物等动态元素。开发者通过JavaScript控制Canvas上的每一像素,实现了游戏的动态效果。 2. **JavaScript**:JavaScript是实现游戏逻辑的关键。游戏的...
通过分析和学习【韩顺平坦克游戏源码】,不仅可以了解游戏开发的基本流程,还能提升编程技巧,增强解决问题的能力。对于想要进入游戏开发领域的初学者来说,这是一个很好的起点,可以帮助他们逐步掌握游戏编程的各个...
《坦克大战游戏代码》是一个专为C#初学者设计的学习资源,它包含了可执行文件以及相关的源代码,旨在帮助新手理解游戏开发的基本概念和技术。在这个项目中,你可以深入探究C#编程语言在创建互动游戏中的应用,特别是...
本文档是基于 Java 的游戏坦克大战毕业论文的知识点概述,涵盖了游戏开发的整个生命周期,从游戏的可行性分析到游戏的测试和实现。 游戏开发概述 游戏开发是指通过软件技术来创建游戏的过程,涉及到软件设计、开发...
《C++ 完整的坦克游戏》是一款基于C++编程语言开发的小型游戏,它集成了多关卡设计,提供了一次丰富的游戏体验。通过学习和分析这个游戏的源代码,我们可以深入理解C++编程在游戏开发中的应用,以及游戏逻辑、图形...
【Java坦克游戏】是一款利用Java编程语言开发的互动娱乐软件,它将经典的坦克对战元素融入到现代化的计算机程序中,让玩家通过鼠标和键盘控制坦克进行战斗。这款游戏的亮点在于其良好的用户界面,提供了直观且吸引人...
《90坦克游戏开发源码注解版》是一款基于C#编程语言的坦克游戏开发教程,其中包含了完整的源代码和详细的注释,非常适合初学者和有一定基础的IT专业人士进行学习和实践。通过这个项目,你可以深入理解游戏开发的基本...
【vb.net 90Tank坦克游戏】是一款基于Visual Basic .NET开发的经典坦克大战游戏,它为初学者提供了深入了解和学习VB.NET编程语言中类的使用的机会。VB.NET是微软.NET框架的一部分,它提供了丰富的功能和易用性,使得...
【标题】"symbian坦克游戏源码"指的是在Symbian操作系统平台上开发的一款坦克游戏的源代码。Symbian是一种历史悠久的智能手机操作系统,广泛应用于早期的诺基亚手机,以其开源、可定制化和高效能著称。这个游戏源码...
《我的坦克游戏制作详解》 在游戏开发领域,个人独立制作的游戏往往蕴含着开发者独特的创意与热情。这次我们要探讨的是一款由我亲自制作的坦克游戏,它以90坦克为原型,是我初次尝试大型游戏开发的成果。在这个项目...
- 实际上,根据提供的代码片段来看,这个游戏更像是一款类似俄罗斯方块的游戏,而非坦克游戏。 #### 描述 - **描述**:“c语言非常经典的小游戏开发程序,适合初学者练习。” - 这段描述准确地概括了这段代码的...
【标题】"基于.Net的坦克游戏"是一款使用C#编程语言开发的小型游戏,它展示了在.Net框架下创建游戏的基本概念和技术。游戏包含了两种模式,为玩家提供了不同的体验,是初学者学习C#和游戏开发的实用案例。 【描述】...
《基于MATLAB的坦克游戏(东百往事版)》是一款利用MATLAB编程语言开发的趣味游戏,它将计算科学与娱乐结合在一起,为用户提供了独特的体验。MATLAB,全称Matrix Laboratory,通常被用于数值计算、符号计算、数据...
【坦克局域网对战游戏】是一款基于局域网实现的多人在线坦克对战游戏,其核心在于通过网络连接...通过学习和分析这个游戏的代码,开发者可以提升自己的技能,理解多人在线游戏的开发流程,并为未来的项目积累宝贵经验。
以上就是【坦克游戏源代码】中涉及的主要知识点,通过分析和学习这个项目,不仅可以提升Java编程技能,也能对游戏开发的基本流程和原理有更深入的理解。对于初学者来说,这是一个非常实用的学习资源。