详细设计
我方坦克功能设计模块
首先自己设计我方坦克的图形,如下图5.1:
图5.1坦克图形
我方坦克有四个方向把该照片进行旋转得到其余三个方向的坦克gif,它们分别用W,S,A,D,来控制,W为上,S为下,A为向左,D向右,空格键为设计子弹,通过按空格键射出子弹,如果子弹击中敌方坦克这消灭敌方坦克。具体实现为,为窗口添加 KeyListener(键盘监听器),监听键盘的按下和抬起。在 TankClient 类中添加内部的适配器类,由于不需要其它类访问,将其设计为 private 的, 以保证面向对象设计的封装性。
具体代码编写如下:
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
switch (key){
case KeyEvent.VK_A:
left = true;
break;
case KeyEvent.VK_S:
down = true;
break;
case KeyEvent.VK_D:
right = true;
break;
case KeyEvent.VK_W:
up = true;
break;
case KeyEvent.VK_SPACE:
this.attack();
break;
default:
break;
}
}
public void leftward(){
direction = Direction.LEFT;
setImg(leftImage);
if(!hitWall(x-speed, y) && !moveToBorder(x-speed, y) && alive){
this.x -= speed;
}
}
public void rightward(){
direction = Direction.RIGHT;
setImg(rightImage);
if(!hitWall(x+speed, y) && !moveToBorder(x+speed, y) && alive){
this.x += speed;
}
}
public void upward(){
direction = Direction.UP;
setImg(upImage);
if(!hitWall(x, y-speed) && !moveToBorder(x, y- speed) && alive){
this.y -= speed;
}
}
public void downward(){
direction = Direction.DOWN;
setImg(downImage);
if(!hitWall(x, y+speed) && !moveToBorder(x, y+speed) && alive){
this.y += speed;
}
5.2敌方坦克功能设计模块
首先设计敌方坦克的图形,如下图5.2:
图5.2我方坦克
敌方坦克也是四个方向进行移动,按照生成随机数,对其方向做出改变,在paint中画出敌方坦克,坦克主要由 Tank 类来实现。坦克的属性:速度(有 X 轴和 Y 轴的速度之分),坦克大小,坦克所在新的位置(X 坐标和 Y 坐标),坦克是否还活着,行动方向等。所有的这些属性都有一个初始化值,从而在游戏一开始就可以运行在设计过程中,坦克出现的位置由坐标而定。用户之后的位置由键盘监听
方向,按指定方向以恒定的速度前进——此速度为全局静态变量,当没有接受
到键盘的控制时,则保持静止。敌方的坦克则是根据随机数来控制随机的方向
和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦
克撞到阻碍物不回头的问题,这个功能由 Tank 类里的getHeadPoint()方法
实现。
5.3 游戏主窗口
游戏主窗口是人机交互的窗口,对玩家而言,他们只和游戏主窗口打交道, 并不关心游戏内部是如何实现的,所以游戏主窗口部分最重要的便是游戏数据 的输入、输出。 在程序中须创建一个类,继承自 Frame 来创建一个窗口。
private class KeyMonitor extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
//super.keyPressed(e);
int key = e.getKeyCode();
switch (key){
case KeyEvent.VK_1:
y = 150;
a = 1;
break;
case KeyEvent.VK_2:
y = 250;
a = 2;
break;
case KeyEvent.VK_ENTER:
state = a;
//添加玩家
if(state == 1 && !start){
tankList.add(playerOne);
}else{
tankList.add(playerOne);
tankList.add(playerTwo);
}
start = true;
break;
case KeyEvent.VK_P:
if(state != 3){
a = state;
state = 3;
}
else{
state = a;
if(a == 0) {
a = 1;
}
}
break;
default:
playerOne.keyPressed(e);
playerTwo.keyPressed(e);
break;
}
}
@Override
public void keyReleased(KeyEvent e){
playerOne.keyReleased(e);
playerTwo.keyReleased(e);
}
}
大家多多点赞收藏,附上源代码以及课程设计报告
链接:https://pan.baidu.com/s/1dioSVintDKiHlSwbeV2IPQ
提取码:dzyy