文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java实现坦克大战小游戏代码如何编写

2023-06-26 03:52

关注

Java实现坦克大战小游戏代码如何编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

小游戏介绍:

红色坦克是我们的操纵坦克,黑色是敌人坦克。
上下左右键控制坦克移动方向
按ctrl键发射炮弹
红色坦克可以穿墙,黑色不可以

具体页面如下:

Java实现坦克大战小游戏代码如何编写

奉上全部源代码:

Tank.java

import java.awt.*;import java.awt.event.*;import java.util.*;public class Tank {    private int x;    private int y;    private  int oldx;    private  int oldy;    private int life = 100;private boolean bL = false ,bU = false ,bR = false ,bD= false;//产生随机数private static Random r = new Random();//九种坦克运动方向enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//初始化坦克方向private Direction  dir = Direction.STOP;//初始化炮筒方向private Direction ptDir = Direction.U;//坦克移动速度private static final int XSPEED = 5;private static final int  YSPEED = 5;//坦克大小private static final int WIDTH = 30;private static final int HIGHT =30;//定义TankClient类TankClient tc;public int getLife(){    return  life;    }public void setLife(int life){    this.life =life;}private boolean good =true ;//定义坦克类型,敌方还是我方public boolean isgood(){    return good;}//定义坦克状态private boolean live = true;//设置enemy坦克随机移动步数private static int step = r.nextInt(12)+3;//构造坦克状态方法public boolean islive (){    return live;}public void setlive(boolean live){    this.live = live;}//构造方法public Tank(int x, int y) {        this.x = x;        this.y = y;    }public Tank (int x,int y,Boolean good ,Direction dir,TankClient tc){    this (x,y);    this.good = good;    this.dir = dir ;    this.tc = tc;}public void draw (Graphics g)    {        if (!live)         {            if (!good)            {                tc.tanks.remove(this);            }            return;        }        Color c = g.getColor();//?        if(good==true)            {g.setColor(Color.RED);}//定义我方坦克颜色        else g.setColor(Color.BLACK);//定义敌方坦克颜色        g.fillOval(x,y, WIDTH, HIGHT);//定义坦克位置及大小        g.setColor(c);//?        move();        switch (ptDir)//画炮筒        {        case L:            g.drawLine(x + Tank.WIDTH / 2, y + Tank.HIGHT / 2, x, y                    + Tank.HIGHT / 2);            break;        case LU:            g.drawLine(x + Tank.WIDTH / 2, y + Tank.HIGHT / 2, x, y);            break;        case U:            g.drawLine(x + Tank.WIDTH / 2, y + Tank.HIGHT / 2, x + Tank.WIDTH                    / 2, y);            break;        case RU:            g.drawLine(x + Tank.WIDTH / 2, y + Tank.HIGHT / 2, x + Tank.WIDTH,                    y);            break;        case R:            g.drawLine(x + Tank.WIDTH / 2, y + Tank.HIGHT / 2, x + Tank.WIDTH,                    y + Tank.HIGHT / 2);            break;        case RD:            g.drawLine(x + Tank.WIDTH / 2, y + Tank.HIGHT / 2, x + Tank.WIDTH,                    y + Tank.HIGHT);            break;        case D:            g.drawLine(x + Tank.WIDTH / 2, y + Tank.HIGHT / 2, x + Tank.WIDTH                    / 2, y + Tank.HIGHT);            break;        case LD:            g.drawLine(x + Tank.WIDTH / 2, y + Tank.HIGHT / 2, x, y                    + Tank.HIGHT);            break;        }    }private void stay(){    this.x=oldx;    this.y=oldy;    }//坦克移动void move (){    this.oldx=x;    this.oldy=y;    switch(dir)    {    case L:    x-=XSPEED;    break;    case LU:    x-=XSPEED;    y-=YSPEED;    break;    case U:    y-=YSPEED;    break;    case RU:    x+=XSPEED;    y-=YSPEED;    break;    case R:    x+=XSPEED;    break;    case RD:    x+=XSPEED;    y+=YSPEED;    break;    case D:    y+=YSPEED;    break;    case LD:    x-=XSPEED;    y+=YSPEED;    break;    case STOP:    break;    }    if (this.dir!=Direction.STOP)    {        ptDir = dir;    }    if (x<0) x=0;    if (y<20) y=20;    if (x>TankClient.WinWidth-Tank.WIDTH) x=TankClient.WinWidth-Tank.WIDTH;    if (y>TankClient.WinHigh-Tank.HIGHT) y=TankClient.WinHigh-Tank.HIGHT;    //让enemy坦克自由移动    if (!good)    {        Direction[] dirs= Direction.values();//将枚举转化为数组        if (step ==0)        {            step = r.nextInt(12)+3;            int rn = r.nextInt(dirs.length);//产生随机数            dir = dirs[rn];        }        step--;    if (r.nextInt(40)>38)            {this.fire();}    }}//坦克方向void localDirection(){    if (bL&&!bU&&!bR&&!bD) dir= Direction.L;    else if (bL&&bU&&!bR&&!bD) dir= Direction.LU;    else if (!bL&&bU&&!bR&&!bD) dir= Direction.U;    else if (!bL&&bU&&bR&&!bD) dir= Direction.RU;    else if (!bL&&!bU&&bR&&!bD) dir= Direction.R;    else if (!bL&&!bU&&bR&&bD) dir= Direction.RD;    else if (!bL&&!bU&&!bR&&bD) dir= Direction.D;    else if (bL&&!bU&&!bR&&bD) dir= Direction.LD;    else dir =Direction.STOP;}public void keyPressed(KeyEvent e)     {        int key = e.getKeyCode();            switch (key)        {            case KeyEvent.VK_CONTROL:                fire();                break;            case KeyEvent.VK_LEFT:                bL=true;                break;            case KeyEvent.VK_UP:                bU=true;                break;            case KeyEvent.VK_RIGHT:                bR=true;                break;            case KeyEvent.VK_DOWN:                bD=true;                break;        }        localDirection();//获取执行方向    }public void keyReleased(KeyEvent e) {    int key = e.getKeyCode();    switch (key){    case KeyEvent.VK_LEFT:        bL=false;        break;    case KeyEvent.VK_UP:        bU=false;        break;    case KeyEvent.VK_RIGHT:        bR=false;        break;    case KeyEvent.VK_DOWN:        bD=false;        break;}    localDirection();    }//定义坦克发射子弹类    public Missile fire()    {        if (!live) return null;        int x= this.x+Tank.WIDTH/2-Missile.WIDTH/2;        int y= this.y +Tank.HIGHT/2-Missile.HIGHT/2;        Missile m = new Missile(x,y,ptDir,good,tc);        tc.Missiles.add(m);        return m;    }//《碰撞检测》获取坦克矩形属性    public Rectangle getRect()    {        return new Rectangle(x,y,WIDTH,HIGHT);    }    //《碰撞检测》    public boolean tankHitWall(Wall w)    {        if(this.getRect().intersects(w.getRect()))        {            stay();            return true;        }        return false;    }    public boolean tankHitTank(java.util.List<Tank> tanks)    {        for (int i=0;i<tanks.size();i++)        {            Tank t = tanks.get(i);                    if (this!=t)            {                if (this.live&&t.islive()&&this.getRect().intersects(t.getRect()))                {                    this.stay();                    t.stay();                    return true ;                }            }        }        return false;    }}

Wall.java

import java.awt.*;public class Wall {     int x;     int y;     int width;     int height;     TankClient tc;    public Wall (int x,int y,int width,int height, TankClient tc)    {        this.x= x;        this.y= y;        this.width = width;        this.height = height;        this.tc = tc;    }    public void draw(Graphics g)    {        Color c = g.getColor();        g.setColor(Color.GRAY);        g.fillRect(x, y, width, height);        g.setColor(c);            }    //《碰撞检测》获取矩形属性        public Rectangle getRect()        {            return new Rectangle(x,y,width,height);        }    }

TankClient.java

import java.awt.*;import java.awt.event.*;import java.util.List;import java.util.ArrayList;public class TankClient extends Frame {    Tank myTank = new Tank(400,430,true,Tank.Direction.STOP,this);//创建自己的坦克    List <Tank>  tanks= new ArrayList<Tank>(); //创建敌人坦克容器    List<Explode> Explodes = new ArrayList<Explode>();//创建爆炸容器    List<Missile> Missiles = new ArrayList<Missile>();//定义容器,存放炮弹    Wall wall1 = new Wall(100,100,30,400,this);    Wall wall2 = new Wall(350,400,400,30,this);        public static final int WinWidth=800;    public static final int WinHigh=600;    //定义框架大小    public void launchFrame()    {        //添加10辆敌人坦克        for (int i = 0;i<10;i++)        {            tanks.add(new Tank(50+40*i,100,false,Tank.Direction.D,this));        }        this.setLocation(40,40);//定义窗口位置        this.setSize(WinWidth,WinHigh);//设置窗口大小        this.setTitle("坦克大战");//设置窗口        //设置监听器,使窗口关闭        this.addWindowListener(new WindowAdapter()                {                    public void windowClosing(WindowEvent e)                    {                        System.exit(0);                    }                });        this.setBackground(Color.WHITE);//设置窗口背景颜色        this.setVisible(true);//设置窗口可见        this.setResizable(false);//设置为不可调整窗口大小        this.addKeyListener(new KeyMonitor());        new Thread(new PaintThread()).start();    }    //定义一个新图片为空,双缓冲    Image OffScreenImage = null;        public void paint(Graphics g)    {    //g.drawString("当前炮弹数"+Missiles.size(), 40, 80);        //g.drawString("当前爆炸数"+Explodes.size(), 40, 100);        g.drawString("Tank数量"+tanks.size(),40,40);        g.drawString("MyTank血量"+myTank.getLife(),40,60);        for (int i=0;i<Missiles.size();i++)        {            Missile m = Missiles.get(i);                 m.hitTanks(tanks);            m.hitTank(myTank);            m.hitWall(wall1);            m.hitWall(wall2);            m.draw(g);        }        for (int i=0;i<Explodes.size();i++)        {            Explode e = Explodes.get(i);            e.draw(g);        }        for (int i = 0;i<tanks.size();i++)        {            Tank t = tanks.get(i);            t.tankHitWall(wall1);            t.tankHitWall(wall2);            t.tankHitTank(tanks);            t.draw(g);        }        myTank.draw(g);        wall1.draw(g);        wall2.draw(g);    }    //重写update 刷新屏幕先调用update方法再调用画笔工具,故刷新屏幕让其直接调用update方法    public void update (Graphics g)    {        if (OffScreenImage == null )        {            OffScreenImage = this.createImage(WinWidth,WinHigh);        }        Graphics gOffScreen = OffScreenImage.getGraphics();        Color c = gOffScreen.getColor();        gOffScreen.setColor(Color.WHITE);        gOffScreen.fillRect(0,0,WinWidth,WinHigh);        gOffScreen.setColor(c);        paint(gOffScreen);        g.drawImage(OffScreenImage,0,0,null);    }    public static void main(String[] args)    {        TankClient tankClient = new TankClient();        tankClient.launchFrame();    }    //线程类--刷新屏幕    private class PaintThread implements Runnable    {        public void run()        {            while(true)            {                repaint();  //刷新屏幕                try                {                    Thread.sleep(40);                }catch (InterruptedException e)                {                    e.printStackTrace();                }            }        }    }            private class KeyMonitor extends KeyAdapter {            //按键时            public void keyPressed(KeyEvent e) {                myTank.keyPressed(e);            }            //松键时            public void keyReleased(KeyEvent e)             {                myTank.keyReleased(e);            }                    }}

Explode.java

import java.awt.*;public class Explode {    int x;    int y;    private boolean live = true;    private TankClient tc ;    int[] diameter = {30,40,50,40,30,10,5};    int step = 0;    //结构    public Explode (int x ,int y,TankClient tc) {        this.x =x;        this.y = y;        this.tc = tc;    }    public void draw (Graphics g) {        if(!live){        tc.Explodes.remove(this);            return ;        }        if (step ==diameter.length) {            live = false ;            step = 0;            return ;        }        Color c = g.getColor();        g.setColor(Color.RED);        g.fillOval(x, y, diameter[step], diameter[step]);        g.setColor(c);        step++;    }}

Missile.java

import java.awt.*;import java.util.List;//定义子弹类public class Missile {    //定义子弹速度    public static final int XSPEED=10;    public static final int YSPEED=10;    //定义子弹大小    public static final int WIDTH =10;    public static final int HIGHT =10;    private boolean live= true ;//定义炮弹状态    //定义发出的炮弹归属    private boolean good;    public boolean islive()    {        return live;    }    int x,y ;//子弹坐标    TankClient tc;    Tank.Direction dir;    public Missile (int x,int y ,Tank.Direction dir)    {        this.x=x;        this.y=y;        this.dir=dir;     }    public Missile(int x,int y,Tank.Direction dir,boolean good,TankClient tc)    {        this(x,y,dir);        this.good = good;        this.tc=tc;    }    public void draw (Graphics g)    {    if (!live) {        tc.Missiles.remove(this);    }        Color c= g.getColor();        if (good)        {            g.setColor(Color.RED);        }else {            g.setColor(Color.BLACK);        }        g.fillOval(x, y, WIDTH,HIGHT);//设置炮弹大小        g.setColor(c);        move();    }    void move ()    {        switch(dir)        {        case L:        x-=XSPEED;        break;        case LU:        x-=XSPEED;        y-=YSPEED;        break;        case U:        y-=YSPEED;        break;        case RU:        x+=XSPEED;        y-=YSPEED;        break;        case R:        x+=XSPEED;        break;        case RD:        x+=XSPEED;        y+=YSPEED;        break;        case D:        y+=YSPEED;        break;        case LD:        x-=XSPEED;        y+=YSPEED;        break;        }        if (x<0||y<0||x>TankClient.WinWidth||y>TankClient.WinHigh)        {            live =false;        }    }//《碰撞检测》获取子弹矩形属性    public Rectangle getRect()    {        return new Rectangle(x,y,WIDTH,HIGHT);    }//《碰撞检测》    public boolean hitTank(Tank t)    {        if(this.live&&this.getRect().intersects(t.getRect())&&t.islive()&& this.good!=t.isgood())        {    if (t.isgood())            {                t.setLife(t.getLife()-20);                if (t.getLife()<=0)                {t.setlive(false);}            }else{t.setlive(false);}            this.live = false;            Explode e = new Explode(x-10,y-10,tc);            tc.Explodes.add(e);            return true;        }        return false;    }    public boolean hitTanks(List<Tank> tanks)    {        for (int i=0;i<tanks.size();i++)        {            if (hitTank(tanks.get(i)))            {                return true;            }        }        return false ;    }    //撞墙碰撞检测        public boolean hitWall (Wall w)        {            if (this.live&&this.getRect().intersects(w.getRect()))            {                this.live =false;                return true;            }            return false ;        }}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯