• 〖編程·Java〗坦克大战2


    Missile.java
    //Missile部分
    import java.awt.*;

    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 HEIGHT = 10;

    int x, y;
    Tank.Direction dir;

    private boolean live = true;

    private TankClient 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, Tank.Direction dir, TankClient tc) {
    this(x, y, dir);
    this.tc = tc;
    }

    public void draw(Graphics g) {
    if(!live){
    return;
    }
    Color c = g.getColor();
    g.setColor(Color.BLACK);
    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;
    case STOP:
    break;
    }

    if(x < 0 || y < 0 || x > TankClient.GAME_WIDTH || y > TankClient.GAME_HEIGHT) {
    live = false;
    tc.missiles.remove(this);
    }
    }

    public boolean isLive() {
    return live;
    }
    public Rectangle getRect(){
    return new Rectangle(x,y,WIDTH,HEIGHT);
    }
    public boolean hitTank(Tank t){
    if (this.getRect().intersects(t.getRect())){
    t.setLive(false);
    this.live =false;
    return true;
    }
    return false;
    }
    }
    Tank.java
    //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;

    public boolean good;
    private boolean live = true;
    public boolean isLive() {
    return live;
    }

    public void setLive(boolean live) {
    this.live = live;
    }

    private int x, y;

    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 = x;
    this.y = y;
    this.good = 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);
    break;
    case R:
    g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT/2);
    break;
    case RD:
    g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT);
    break;
    case D:
    g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y + Tank.HEIGHT);
    break;
    case LD:
    g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT);
    break;
    }

    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;
    case STOP:
    break;
    }

    if(this.dir != Direction.STOP) {
    this.ptDir = this.dir;
    }

    if(x < 0) x = 0;
    if(y < 30) y = 30;
    if(x + Tank.WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - Tank.WIDTH;
    if(y + Tank.HEIGHT > TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGHT;
    }

    public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    switch(key) {
    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;
    }
    locateDirection();
    }

    void locateDirection() {
    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 if(!bL && !bU && !bR && !bD) dir = Direction.STOP;
    }

    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_UP :
    bU = false;
    break;
    case KeyEvent.VK_RIGHT :
    bR = false;
    break;
    case KeyEvent.VK_DOWN :
    bD = false;
    break;
    }
    locateDirection();
    }

    public Missile fire() {
    int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;
    int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;
    Missile m = new Missile(x, y, ptDir, this.tc);
    tc.missiles.add(m);
    return m;
    }
    public Rectangle getRect(){
    return new Rectangle(x,y,WIDTH,HEIGHT);
    }

    }
    TankClient.java
    //TankClient部分
    import java.awt.*;
    import java.awt.event.*;
    import java.util.List;
    import java.util.ArrayList;

    public class TankClient extends Frame {
    public static final int GAME_WIDTH = 800;
    public static final int GAME_HEIGHT = 600;

    Tank myTank = new Tank(150, 150, true, this);
    Tank badTank = new Tank(250, 250, false, this);
    List<Missile> missiles = new ArrayList<Missile>();

    Image offScreenImage = null;

    public void paint(Graphics g) {
    g.drawString("missiles count:" + missiles.size(), 10, 50);

    for(int i=0; i<missiles.size(); i++) {
    Missile m = missiles.get(i);
    m.hitTank(badTank);
    m.draw(g);
    //if(!m.isLive()) missiles.remove(m);
    //else m.draw(g);
    }

    myTank.draw(g);
    badTank.draw(g);
    }

    public void update(Graphics g) {
    if(offScreenImage == null) {
    offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
    }
    Graphics gOffScreen = offScreenImage.getGraphics();
    Color c = gOffScreen.getColor();
    gOffScreen.setColor(Color.GREEN);
    gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
    gOffScreen.setColor(c);
    paint(gOffScreen);
    g.drawImage(offScreenImage, 0, 0, null);
    }

    public void lauchFrame() {
    //this.setLocation(400, 300);
    this.setSize(GAME_WIDTH, GAME_HEIGHT);
    this.setTitle("TankWar");
    this.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    this.setResizable(false);
    this.setBackground(Color.GREEN);

    this.addKeyListener(new KeyMonitor());

    setVisible(true);

    new Thread(new PaintThread()).start();
    }

    public static void main(String[] args) {
    TankClient tc = new TankClient();
    tc.lauchFrame();
    }

    private class PaintThread implements Runnable {

    public void run() {
    while(true) {
    repaint();
    try {
    Thread.sleep(50);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }

    private class KeyMonitor extends KeyAdapter {

    public void keyReleased(KeyEvent e) {
    myTank.keyReleased(e);
    }

    public void keyPressed(KeyEvent e) {
    myTank.keyPressed(e);
    }

    }
    }



  • 相关阅读:
    转载高效的MySQL分页 枫
    [笔记]NFC笔记——WUP_REQ 和 WUP_RES 消息结构
    [笔记]NFC笔记——PSL_REQ 和 PSL_RES 消息结构
    [笔记]C语言中二级指针简单例子
    [笔记]NFC协议规范学习笔记汇总
    [笔记]C语言中预定义符 __FILE__, __LINE__, __FUNCTION__, __DATE__, __TIME__ 的使用演示
    [笔记]如何限制用户在5分钟之后才能重复同样操作
    [笔记]NFC笔记——ATR_RES 消息结构
    简单的具备自动检测行为的文本框控件
    多重AutoComplete的Textbox
  • 原文地址:https://www.cnblogs.com/shaoweinan/p/2198374.html
Copyright © 2020-2023  润新知