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,每个坦克在移动的过程中,都会实时修改自己的坐标位置,子弹在前行过程中,不断在这个集合中做判断,比较是否在坦克所处坐标范围内。






0 0