Java实现坦克大战小游戏代码如何编写
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,Java实现坦克大战小游戏代码如何编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。小游戏介绍:红色坦克是我们的操纵坦克
千家信息网最后更新 2025年11月13日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安全错误
数据库的锁怎样保障安全
计算机网络安全关闭
服务器被劫持怎样恢复
潮州数字软件开发价格
公司成立网络安全领导机构
爱辉区网络安全
明日之后服务器炸了有什么奖励
数据库程序中文完整版
网络技术领域是什么
关系型数据库的组成是
腾讯云服务器s2与sa2的区别
网络安全宣传黑板报高清
网牧网络技术有限公司
扬州通用软件开发特点
地形数据库升级在哪个章节
vb读取sql数据库信息
已备份数据库结构661
镇平租房软件开发
软件开发完在哪上出售
嘉兴网络技术口碑推荐
国家电网软件开发开工报告
网络技术大二课表
32位数据库密码
2013诺顿网络安全报告
深圳房价数据库
什么叫数据库连接数
网络安全手抄报文字30字
华为系统更新服务器
局域网更换ip后才能登录服务器
修改应用数据库后应用要重启吗
腾讯服务器服务商