Java实现坦克大战小游戏代码如何编写
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,Java实现坦克大战小游戏代码如何编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。小游戏介绍:红色坦克是我们的操纵坦克
千家信息网最后更新 2026年11月04日Java实现坦克大战小游戏代码如何编写
Java实现坦克大战小游戏代码如何编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
小游戏介绍:
红色坦克是我们的操纵坦克,黑色是敌人坦克。
上下左右键控制坦克移动方向
按ctrl键发射炮弹
红色坦克可以穿墙,黑色不可以
具体页面如下:
奉上全部源代码:
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 tanks) { for (int i=0;iWall.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 tanks= new ArrayList(); //创建敌人坦克容器 List Explodes = new ArrayList();//创建爆炸容器 List Missiles = new ArrayList();//定义容器,存放炮弹 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;iExplode.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 tanks) { for (int i=0;i看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
坦克
大小
子弹
方向
炮弹
检测
碰撞
移动
屏幕
方法
容器
属性
敌人
状态
矩形
颜色
大战
小游戏
位置
敌方
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
亿人帮互联网科技有限公司
赫美联合互联网科技
互联网高科技股票
字节跳动和互联网科技
阿里互联网科技公司
江阴互联网智能科技产品进口
互联网与医疗科技
互联网科技与大数据专业
成都互联网科技公司工作好不好
链环科技传统企业怎么转型互联网
互联网科技公司营业执照怎么办理
互联网金融科技元年
互联网金融科技公司的优势
35岁以上互联网科技行业
互联网科技包装股份有限公司上市
湖北辰鑫科技互联网
互联网科技收购价值
三亚科技创新互联网基地
互联网科技创新创业项目
北京品多多互联网科技有限公司
中国互联网科技工作委员会毛军
广州互联网科技公司
善班互联网科技
深圳齐家互联网科技
深圳期待互联网科技
居家互联网科技有限公司
科技与互联网哪个更好
华夏互联网科技业
四川互联网展示科技馆设计
广州有谷有贝互联网科技有限公司