Java坦克大战游戏(人机对战)
来源:互联网 发布:傲骨贤妻 知乎 编辑:程序博客网 时间:2024/05/17 02:48
打开IDE,无意中看到了大二的时候用java写的一个坦克大战游戏,那时刚学习java语言,很渴望写一个游戏出来,于是拼命自学java GUI,现在看来java swing的用处并不大,这可能也是当时java GUI不纳入教学计划的原因之一吧。以下是当时我在写代码过程中的一些想法以及遇到的一些问题,希望能共同探讨。
这是游戏运行的整个界面:
首先是地图部分,采用的是二维数组,0为通路,1为墙,3为边缘,在界面上所看到的这样的一个墙方块占用的是一个数组元素,它的像素是30*30,而一个坦克的像素也是30*30,因此,如果坦克每移动一步刚好是一个数组元素的话,这样看起来坦克的移动速度相当快(飞一般的感觉),为了让坦克的移动速度看起来正常,坦克的移动像素改为一个二维数组元素的1/6,也就是5个像素,这样在对撞墙的判断上增加了难度,像这种情况,坦克的一部分接触墙:
这里我分了两种情况分别讨论:先用坐标对30求余,1:如果余数为0,则说明坦克此时的位置刚好在一个二维数组的元素中,因此只需要判断下一步中的元素中的值是否为通路,2:如果余数不为0,则坦克的位置是一部分处于二维数组的一个元素中,另一部分处于另一个或多个元素中,以方向向右,部分代码如下:
if(direction==RIGHT){ if(((x*3))%30==0) x=((x*3))/30; else x=((x*3))/30+1; if((y*3)%30!=0){ if(map[(y*3)/30][x]!=0 ||map[((y*3)+30)/30][x]!=0){ return false; } }else{ if(map[(y*3)/30][x]!=0){ return false; } } }
对于由电脑控制的坦克,在撞墙后,会随机产生一个方向:
if(!isAllow(x, y-1, map)){
direction=(int) (Math.random()*3+0.5);
break;
}
如果要写得更加智能的话,是否能用回溯法产生一条可行路径,这样可能效率会很低。
由于每个坦克都有自己的运行轨迹,每个子弹都要独自判断是否击中目标,因此我让每个坦克是一个线程,每个子弹也是一个线程,这就使线程太多了,不知如何处理这种情况。还有个问题是,屏幕上的坦克每时每刻都在移动,他们的坐标时刻都在发生变化,子弹如何判断是否击中敌军坦克,我的做法是:当每产生一个坦克时,就把这个坦克加入到一个集合中,如List,每个坦克在移动的过程中,都会实时修改自己的坐标位置,子弹在前行过程中,不断在这个集合中做判断,比较是否在坦克所处坐标范围内。
- Java坦克大战游戏(人机对战)
- 07-html5游戏坦克大战第三战(坦克移动)
- 【Java_项目篇<1>】--JAVA实现坦克大战游戏--坦克移动+添加敌方坦克(二)
- 对战坦克大战(vc++)
- JAVA练手项目(三):坦克大战游戏源代码
- Java之详解坦克大战游戏(一)
- Java之详解坦克大战游戏(二)
- Java之详解坦克大战游戏(六)
- Java之详解坦克大战游戏(三)
- Java之详解坦克大战游戏(四)
- Java之详解坦克大战游戏(五)
- java版坦克大战游戏源码
- 基于java swing的坦克大战游戏
- 【Java_项目篇<1>】--JAVA实现坦克大战游戏--画出坦克(一)
- 【Java_项目篇<1>】--JAVA实现坦克大战游戏--坦克发射子弹(三)
- 【Java_项目篇<1>】--JAVA实现坦克大战游戏--修改BUG防止坦克重叠(六)
- 坦克大战小游戏(Java)
- java坦克大战(窗体)
- 继承BaseAdapter构建变化的listview
- 最近的工作记录:键盘敲入的Linux Shell命令,哈哈
- 第十七周项目一:体会函数参数传递
- NSMutableArray类方法整理
- Oracle面试题
- Java坦克大战游戏(人机对战)
- Android项目中使用Eclipse导出jar文件
- ERR_CACHE_MISS 搜尋回上一頁空白或錯誤
- 获取单选按钮的值
- NSDictionary类方法整理
- 黑马程序员——OC学习之成员变量的get,set方法多种实现
- 搜索
- disabled的使用方法
- coreseek+php之sphinx扩展安装+php调用示例