基于java实现坦大战小游戏实例(含课程设计)

本文档详细介绍了坦克大战游戏的设计与实现,包括我方坦克和敌方坦克的功能模块。我方坦克通过键盘控制移动和射击,敌方坦克则采用随机数决定移动路径。游戏主窗口作为人机交互界面,处理玩家输入并显示游戏状态。源代码和课程设计报告可在提供的链接中获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详细设计

我方坦克功能设计模块

首先自己设计我方坦克的图形,如下图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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值