Java2SE+Eclipse实现TankWar实战篇一

1.该项目是跟着马士兵老师的网课写的,自己添加了代码注释。2.有很多设计模式上的问题,大神勿喷。3.写这篇博客的目的也只是想重新理清下自己的思路。4.后期会对项目进行完善和改进/*该项目由初态的0.1版本更新到最终的2.6版本*本篇主要介绍项目主要使用到的一部分类,包括Tank类和Missile类*以及TankClient类*思路:1:首先继承java.wa
摘要由CSDN通过智能技术生成

1.该项目是跟着马士兵老师的网课写的,自己添加了代码注释。
2.有很多设计模式上的问题,大神勿喷。
3.写这篇博客的目的也只是想重新理清下自己的思路。
4.后期会对项目进行完善和改进


/*该项目由初态的0.1版本更新到最终的2.6版本
*本篇主要介绍项目主要使用到的一部分类,包括Tank类和Missile类
*以及TankClient类
*思路:1:首先继承java.wat包中的Frame创建一个800*600的窗口,并且不允许用户改变大小
*允许关闭窗口;2:画出玩家坦克和敌方坦克,玩家坦克由玩家通过键盘控制运动,允许沿着
*八个不同的方向前进;3:添加子弹类,根据坦克的方向和位置,可以发出多发子弹;4:玩家
*坦克能消灭敌方坦克
*/

//Tank类代码实现

import java.awt.*;
import java.awt.event.*;

public class Tank {
public static final int XSPEED=5;//坦克横向移动的速度
public static final int YSPEED=5;//坦克纵向移动的速度
public static final int WIDTH=30;
public static final int HEIGHT=30;
TankClient tc;//声明实例化的TankClient对象
private boolean live=true;//判断坦克是否是存活状态
//生成live的getter和setter方法
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
private int x,y;//Tank生成的坐标位置
private boolean good;   //区分敌我的标志
private boolean bL=false,bU=false,bR=false,bD=false;//用来表示是否按下“上下左右”四个键
enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//枚举方向
private Direction dir=Direction.STOP;//坦克前进的方向
private Direction ptDir=Direction.D;//坦克炮筒的方向

public Tank(int x, int y,boolean good) {
this.x = x;
this.y = y;
this.good=good;
}

public Tank(int x,int y,boolean good,TankClient tc){
this(x,y,good);     //调用了Tank(int x,int y,boolean good)方法
this.tc=tc;
}

public void draw(Graphics g){//画出坦克
if(!live) return ;//如果坦克被消灭,返回
Color c=g.getColor();
//根据坦克好坏,设定不同的颜色
if(good) g.setColor(Color.RED);//设置坦克为红色,代表正义
else  g.setColor(Color.BLUE);//设置坦克为蓝色,代表邪恶
g.fillOval(x, y, WIDTH, HEIGHT);
g.setColor(c);
switch(ptDir){  //根据坦克炮筒的方向画直线
case L:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y+Tank.HEIGHT/2);
break;
case LU:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x, y);

break;
case U:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y);
break;
case RU:
g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH, y);

br
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
坦克大战是经典的游戏,以下是一个简单的 Java 代码实现: ```java import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import javax.swing.*; public class TankWar extends JFrame { private static final long serialVersionUID = 1L; // 窗口大小 public static final int WIDTH = 800; public static final int HEIGHT = 600; private MyPanel mp; public static void main(String[] args) { new TankWar(); } public TankWar() { mp = new MyPanel(); this.add(mp); this.setTitle("坦克大战"); this.setSize(WIDTH, HEIGHT); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.setResizable(false); } private class MyPanel extends JPanel implements KeyListener { private static final long serialVersionUID = 1L; private Tank myTank; private ArrayList<Tank> enemyTanks; private ArrayList<Missile> missiles; private ArrayList<Explode> explodes; public MyPanel() { myTank = new Tank(400, 500, true); enemyTanks = new ArrayList<Tank>(); missiles = new ArrayList<Missile>(); explodes = new ArrayList<Explode>(); for (int i = 0; i < 5; i++) { enemyTanks.add(new Tank(i * 150, 0, false)); } this.setFocusable(true); this.addKeyListener(this); new Thread(new EnemyTankThread()).start(); new Thread(new MissileThread()).start(); new Thread(new ExplodeThread()).start(); } @Override public void paint(Graphics g) { super.paint(g); g.setColor(Color.BLACK); g.fillRect(0, 0, WIDTH, HEIGHT); myTank.draw(g); for (int i = 0; i < enemyTanks.size(); i++) { enemyTanks.get(i).draw(g); } for (int i = 0; i < missiles.size(); i++) { missiles.get(i).draw(g); } for (int i = 0; i < explodes.size(); i++) { explodes.get(i).draw(g); } g.setColor(Color.WHITE); g.drawString("Missiles: " + missiles.size(), 10, 30); } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_UP) { myTank.move(Tank.UP); } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { myTank.move(Tank.DOWN); } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { myTank.move(Tank.LEFT); } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { myTank.move(Tank.RIGHT); } else if (e.getKeyCode() == KeyEvent.VK_SPACE) { missiles.add(myTank.fire()); } repaint(); } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } private class EnemyTankThread implements Runnable { @Override public void run() { while (true) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < enemyTanks.size(); i++) { enemyTanks.get(i).move((int) (Math.random() * 4)); if (Math.random() < 0.2) { missiles.add(enemyTanks.get(i).fire()); } } repaint(); } } } private class MissileThread implements Runnable { @Override public void run() { while (true) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < missiles.size(); i++) { Missile missile = missiles.get(i); if (missile.isAlive()) { missile.move(); for (int j = 0; j < enemyTanks.size(); j++) { Tank enemyTank = enemyTanks.get(j); if (enemyTank.isAlive() && missile.hit(enemyTank)) { explodes.add(new Explode(enemyTank.getX(), enemyTank.getY())); enemyTank.setAlive(false); missile.setAlive(false); } } if (myTank.isAlive() && missile.hit(myTank)) { explodes.add(new Explode(myTank.getX(), myTank.getY())); myTank.setAlive(false); missile.setAlive(false); } } else { missiles.remove(i); i--; } } repaint(); } } } private class ExplodeThread implements Runnable { @Override public void run() { while (true) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < explodes.size(); i++) { Explode explode = explodes.get(i); if (explode.isAlive()) { explode.nextStep(); } else { explodes.remove(i); i--; } } repaint(); } } } } } class Tank { public static final int UP = 0; public static final int DOWN = 1; public static final int LEFT = 2; public static final int RIGHT = 3; private static final int SIZE = 30; private static final int SPEED = 5; private int x; private int y; private boolean good; private boolean alive; private int direction; public Tank(int x, int y, boolean good) { this.x = x; this.y = y; this.good = good; this.alive = true; this.direction = UP; } public void draw(Graphics g) { if (alive) { g.setColor(good ? Color.GREEN : Color.YELLOW); g.fillOval(x, y, SIZE, SIZE); g.setColor(good ? Color.DARK_GRAY : Color.LIGHT_GRAY); switch (direction) { case UP: g.fillRect(x + SIZE / 2 - 5, y, 10, SIZE / 2); break; case DOWN: g.fillRect(x + SIZE / 2 - 5, y + SIZE / 2, 10, SIZE / 2); break; case LEFT: g.fillRect(x, y + SIZE / 2 - 5, SIZE / 2, 10); break; case RIGHT: g.fillRect(x + SIZE / 2, y + SIZE / 2 - 5, SIZE / 2, 10); break; } } } public void move(int direction) { this.direction = direction; switch (direction) { case UP: y -= SPEED; if (y < 0) { y = 0; } break; case DOWN: y += SPEED; if (y > TankWar.HEIGHT - SIZE) { y = TankWar.HEIGHT - SIZE; } break; case LEFT: x -= SPEED; if (x < 0) { x = 0; } break; case RIGHT: x += SPEED; if (x > TankWar.WIDTH - SIZE) { x = TankWar.WIDTH - SIZE; } break; } } public Missile fire() { int missileX = x + SIZE / 2 - Missile.SIZE / 2; int missileY = y + SIZE / 2 - Missile.SIZE / 2; return new Missile(missileX, missileY, direction, good); } public int getX() { return x; } public int getY() { return y; } public boolean isAlive() { return alive; } public void setAlive(boolean alive) { this.alive = alive; } } class Missile { public static final int SIZE = 10; public static final int SPEED = 10; private int x; private int y; private boolean good; private boolean alive; private int direction; public Missile(int x, int y, int direction, boolean good) { this.x = x; this.y = y; this.direction = direction; this.good = good; this.alive = true; } public void draw(Graphics g) { if (alive) { g.setColor(good ? Color.BLUE : Color.RED); g.fillOval(x, y, SIZE, SIZE); } } public void move() { switch (direction) { case Tank.UP: y -= SPEED; break; case Tank.DOWN: y += SPEED; break; case Tank.LEFT: x -= SPEED; break; case Tank.RIGHT: x += SPEED; break; } if (x < 0 || x > TankWar.WIDTH || y < 0 || y > TankWar.HEIGHT) { alive = false; } } public boolean hit(Tank tank) { if (good == tank.good) { return false; } if (x >= tank.getX() && x <= tank.getX() + Tank.SIZE && y >= tank.getY() && y <= tank.getY() + Tank.SIZE) { return true; } return false; } public boolean isAlive() { return alive; } public void setAlive(boolean alive) { this.alive = alive; } } class Explode { private static final int SIZE = 50; private static final int STEPS = 5; private int x; private int y; private boolean alive; private int step; public Explode(int x, int y) { this.x = x - SIZE / 2; this.y = y - SIZE / 2; this.alive = true; this.step = 0; } public void draw(Graphics g) { if (alive) { Color color = g.getColor(); g.setColor(Color.ORANGE); g.fillOval(x, y, SIZE - step * 10, SIZE - step * 10); g.setColor(color); nextStep(); } } public void nextStep() { step++; if (step == STEPS) { alive = false; } } public boolean isAlive() { return alive; } } ``` 这个代码实现了基本的游戏功能,包括坦克移动、开火、子弹碰撞、爆炸效果等。你可以尝试添加更多的功能来完善这个游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值