java怎么制作坦克大战
来源:爱站网时间:2020-05-11编辑:网友分享
对于一些小游戏的实现方法是很多小伙伴们都好奇的,也有很多小游戏是由Java而制作的,那么你知道java怎么制作坦克大战吗?接下来的内容中我们就一起去看看吧。
对于一些小游戏的实现方法是很多小伙伴们都好奇的,也有很多小游戏是由Java而制作的,那么你知道java怎么制作坦克大战吗?接下来的内容中我们就一起去看看吧。
详情请参照注释,这里就不多废话了,实现一下儿时的经典而已。
Blood.java
package com.hkm.TankWar; import java.awt.*; /** * 血块类,我方坦克吃了可回血; * @author Hekangmin * */ public class Blood { private int x,y,w,h;//血块的位置和宽度高度; private TankWarClient tc; private int step=0;//纪录血块移动的步数; private boolean live=true; public boolean isLive() { return live; } public void setLive(boolean live) { this.live = live; } /** * 纪录血块的位置; */ private int[][] pos={{400,300},{400,320},{420,320},{440,300},{440,330},{480,400},{520,400},{540,400}}; public Blood() { x=pos[0][0]; y=pos[0][1]; w=h=18; } public void draw(Graphics g) { if(!live) return; Color c=g.getColor(); g.setColor(Color.CYAN); g.fillOval(x, y, w, h); g.setColor(c); move(); } /** * 移动血块 */ public void move() { step++; if(step>=pos.length) step=0; else{ x=pos[step][0]; y=pos[step][1]; } } public Rectangle getRect() { return new Rectangle(x,y,w,h); } }
Explode.java
package com.hkm.TankWar; import java.awt.*; /** * 爆炸类 * @author Hekangmin * */ public class Explode { private int x,y;//爆炸发生的位置 private boolean Live=true; int dia[]={4,8,12,16,32,40,20,14,4};//用园模拟,代表圆的直径; int step=0;//区别移到第几个直径 private TankWarClient tc;//持有引用 public Explode(int x,int y,TankWarClient tc) { this.x=x; this.y=y; this.tc=tc; } public void draw(Graphics g) { if(!Live) { tc.explodes.remove(this); return; } if(step==dia.length)//如果到了最后一个直径爆炸死亡; { Live=false; step=0; return; } Color c=g.getColor(); g.setColor(Color.YELLOW); g.fillOval(x, y, dia[step], dia[step]); g.setColor(c); step++; } }
Missile.java
package com.hkm.TankWar; import java.awt.*; import java.awt.Event.*; import java.awt.event.KeyEvent; import java.util.List; /** * 子弹类 * @author Hekangmin * */ public class Missile { private int x,y;//子弹的位置 private Tank.Direction dir;//坦克方向 private static final int XSPEED=10;//坦克x方向的移动速度, private static final int YSPEED=10;//坦克y方向的移动速度, public static final int WIDTH=10; public static final int HEIGHT=10; private boolean Live=true;//判断子弹是否活着 private boolean good;//区分敌军子弹和我军子弹 private TankWarClient tc; public Missile(int x, int y, Tank.Direction dir) { this.x = x; this.y = y; this.dir = dir; } public Missile(int x,int y,boolean good,Tank.Direction dir,TankWarClient tc) { this(x,y,dir); this.good=good;//将坦克好坏的属性与子弹还坏属性设为相同; this.tc=tc; } /** * 画出子弹 * @param g为画笔 */ public void draw(Graphics g) { if(!Live) { tc.missiles.remove(this); return; } Color c=g.getColor(); if(good) { g.setColor(Color.BLUE); } else g.setColor(Color.ORANGE); g.fillOval(x, y, WIDTH, HEIGHT); g.setColor(c); move(); } /** * 根据坦克的方向让子弹移动 */ private 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(xTankWarClient.GAME_WIDTH||y>TankWarClient.GAME_HEIGHT)//子弹越界则让其死亡; { Live=false; } } public boolean isLive() { return Live; } public Rectangle getRect()//获取子弹的矩形区域; { return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT); } /** * 判断子弹与坦克碰撞; * @param t为坦克 * @return返回true则表示发生碰撞,否则没有碰撞; */ 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()-10); if(t.getLife() tanks) { for(int i=0;i
Tank.java
package com.hkm.TankWar; import java.awt.*; import java.awt.event.KeyEvent; import java.util.*; /** * 坦克类 * @author Hekangmin * */ public class Tank { public static final int XSPEED=5;//坦克x方向速度 public static final int YSPEED=5; public static final int WIDTH=30; public static final int HEIGHT=30; private BloodBar bb=new BloodBar();//血条 private int life=100; public int getLife() { return life; } public void setLife(int life) { this.life = life; } private static Random r=new Random(); private static int step=r.nextInt(12)+3;//定义一个数表示敌军坦克随机东的步数; private boolean bL=false,bU=false,bR=false,bD=false; enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//利用枚举类型定义坦克方向; private int x,y; private int oldX,oldY;//纪录上一步坦克的位置; private boolean live=true;//判断是否活着 public boolean isLive() { return live; } public void setLive(boolean live) { this.live = live; } private boolean good;//坦克是好是坏 public boolean isGood() { return good; } private Direction ptDir=Direction.D;//新增炮筒的方向; TankWarClient tc;//为了持有对方的引用以可以方便访问其成员变量; Direction dir=Direction.STOP;//一开始将坦克方向设为stop; public Tank(int x,int y,boolean good,Direction dir,TankWarClient tc) { this.x=x; this.y=y; this.oldX=x; this.oldY=y; this.good=good; this.dir=dir; this.tc=tc;//持有对方的引用; } public void draw(Graphics g) { if(!live)//如果死亡则不再draw; { if(!good) { tc.tanks.remove(this); if(tc.tanks.size()TankWarClient.GAME_WIDTH) x=TankWarClient.GAME_WIDTH-30; if(y+Tank.HEIGHT>TankWarClient.GAME_HEIGHT) y=TankWarClient.GAME_HEIGHT-30; if(!good) { Direction[] dirs=Direction.values();//将枚举类型转化成数组; if(step==0) { step=r.nextInt(12)+3; int rn=r.nextInt(dirs.length);//产生length以内随机的整数; dir=dirs[rn]; } step--; if(r.nextInt(40)>20) this.fire();//使敌军坦克发射子弹; } } /** * 处理按键 * @param e键盘事件; */ public void KeyPressed(KeyEvent e) { int key=e.getKeyCode(); switch(key) { case KeyEvent.VK_LEFT: bL=true; break; case KeyEvent.VK_RIGHT: bR=true; break; case KeyEvent.VK_UP: bU=true; break; case KeyEvent.VK_DOWN: bD=true; break; } locationDir(); } public void keyReleased(KeyEvent e) { int key=e.getKeyCode(); switch(key) { case KeyEvent.VK_CONTROL: fire(); break; case KeyEvent.VK_LEFT: bL=false; break; case KeyEvent.VK_RIGHT: bR=false; break; case KeyEvent.VK_UP: bU=false; break; case KeyEvent.VK_DOWN: bD=false; break; case KeyEvent.VK_A: superFire(); break; case KeyEvent.VK_F2: reBorn(); break; } locationDir(); } /** * 发射子弹 * @return返回子弹类型 */ public Missile fire() { if(!live) return null; int mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;//计算子弹发射的位置; int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2; Missile m=new Missile(mx,my,good,ptDir,this.tc);////根据炮筒方向发射子弹 tc.missiles.add(m); return m; } public Missile fire(Direction dir) { if(!live) return null; int mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2; int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2; Missile m=new Missile(mx,my,good,dir,this.tc);//根据坦克的方向发射子弹; tc.missiles.add(m); return m; } public void superFire() { Direction[] dirs=Direction.values(); for(int i=0;i tanks) { for(int i=0;i
TankWarClient.java
package com.hkm.TankWar; import java.awt.*; import java.awt.event.*; import java.util.List; import java.util.ArrayList; /** * 这个是游戏的运行窗口; * @author Hekangmin * */ public class TankWarClient extends Frame{ /** * 游戏窗口的宽度; */ public static final int GAME_WIDTH=800; /** * 游戏窗口的高度; */ public static final int GAME_HEIGHT=600; Tank MyTank=new Tank(700,400,true,Tank.Direction.STOP,this); Listtanks=new ArrayList (); List explodes=new ArrayList (); List missiles=new ArrayList (); Wall w1=new Wall(300,200,20,200,this); Wall w2=new Wall(600,300,30,150,this); Blood b=new Blood(); /** * 画一张虚拟图片; */ Image OffScreenImage=null; public TankWarClient(String name)//设置文字 { super(name); } /** * 运行窗口; */ public void launchFrame() { for(int i=0;i
Wall.java
package com.hkm.TankWar; import java.awt.*; /** * 生成阻碍物墙这个类; * @author Hekangmin * */ public class Wall { /** * x,y为墙的位置,w,h为宽度高度; */ int x,y,w,h; /** * 持有引用 */ TankWarClient tc; public Wall(int x, int y, int w, int h, TankWarClient tc) { this.x = x; this.y = y; this.w = w; this.h = h; this.tc = tc; } public void draw(Graphics g) { Color c=g.getColor(); g.setColor(Color.GRAY); g.fillRect(x,y,w,h); g.setColor(c); } /** * 得到墙的矩形区域; * @return */ public Rectangle getRect() { return new Rectangle(x,y,w,h); } }
java怎么制作坦克大战?坦克大战是我们小时候的经典游戏,本文主要面向于学过Java的人群,与学了一段时间的人提供的实现方法。
下一篇:Java中的弱引用的介绍