坦克大战第一版

目前完成了:我方坦克的移动,以及敌方坦克的生成

父类坦克

package TankGeme;


/**
 * @author Lenovo
 * 坦克模型
 */
public class Tank {
    //坦克的横坐标,纵坐标
    private int x;
    private int y;
    //坦克方向0123
    private int direction;
    //速度
    private int speed;

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

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getDirection() {
        return direction;
    }

    public void setDirection(int direction) {
        this.direction = direction;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
    //坦克移动方法

    //上
    public void moveUp(){
        y=y-speed;
    }
    //下
    public void moveDown(){
        y=y+speed;
    }//左
    public void moveLeft(){
        x=x-speed;
    }
    //右
    public void moveRight(){
        x=x+speed;
    }

}

我的坦克

package TankGeme;

/**
 * @author 小小小白白白白
 * 我的坦克
 */
public class MyTank extends Tank{

    public MyTank(int x, int y) {
        super(x, y);
    }
}

敌方坦克

package TankGeme;

/**
 * @author 小小小白白白白
 * 敌人的坦克
 */
public class EnemyTank extends Tank{
    public EnemyTank(int x, int y) {
        super(x, y);
    }
}

绘图区域

package TankGeme;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

/**
 * @author 小小小白白白白
 * 坦克大战的绘图区域
 * 为了监听键盘事件,实现keyListner
 */
public class MyPanel extends JPanel implements KeyListener {
    //定义我的坦克
    MyTank mt=null;

    /**
     * 定义敌方坦克,存入Vector集合
     * 之所以使用Vector是因为它是线程安全的
     */
    Vector<EnemyTank> wt=new Vector<>();
    //定义敌人的数量
    int amount=3;

    public MyPanel() {

        //初始化我的坦克
        mt=new MyTank(400,400);
        mt.setSpeed(10);

        //使用for来初始化敌方坦克
        for (int i = 0; i < amount; i++) {
            //创建一个坦克
            EnemyTank enemyTank = new EnemyTank(100 * (i + 1), 100);
            //将每一个坦克都初始化朝下
            enemyTank.setDirection(2);
            //将创建的坦克加入Vector
            wt.add(enemyTank);
        }
    }


    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //填充矩形,默认黑色
        g.fillRect(0,0,1000,750);

        //调用画坦克方法
        drawTank(mt.getX(),mt.getY(),g,mt.getDirection(),0);

        //画出敌方坦克,遍历Vector
        for (int i = 0; i < wt.size(); i++) {
            //取出的每一个都是一个坦克对象
            EnemyTank enemyTank = wt.get(i);
            //生成坦克
            drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirection(),1);
        }
    }



    /**
     * 编写坦克方法
     * x  坦克的左上角x坐标
     * y  坦克的左上角y坐标
     * g  画笔
     * direction  坦克方向(上下左右)
     * type  坦克类型
     */
    public void drawTank(int x,int y,Graphics g,int direction,int type) {

        //根据不同类型的坦克设置不同的颜色
        switch(type) {
            //我们的坦克
            case 0:g.setColor(Color.CYAN);break;
            //敌人的坦克
            case 1:g.setColor(Color.yellow);break;
            default:
                System.out.println("不存在");
        }

        //根据坦克方向来绘制坦克
        //0123上右下左
        switch(direction) {
            //上
            case 0:
                //左边的轮子
                g.fill3DRect(x,y,10,60,false);
                //右边的轮子
                g.fill3DRect(x+30,y,10,60,false);
                //主体
                g.fill3DRect(x+10,y+10,20,40,false);
                //圆盖
                g.fillOval(x+10,y+20,20,20);
                //炮筒
                g.drawLine(x+20,y+30,x+20,y);
                break;
            //右
            case 1:
                //左边的轮子
                g.fill3DRect(x,y,60,10,false);
                //右边的轮子
                g.fill3DRect(x,y+30,60,10,false);
                //主体
                g.fill3DRect(x+10,y+10,40,20,false);
                //圆盖
                g.fillOval(x+20,y+10,20,20);
                //炮筒
                g.drawLine(x+30,y+20,x+60,y+20);
                break;
            //下
            case 2:
                //左边的轮子
                g.fill3DRect(x,y,10,60,false);
                //右边的轮子
                g.fill3DRect(x+30,y,10,60,false);
                //主体
                g.fill3DRect(x+10,y+10,20,40,false);
                //圆盖
                g.fillOval(x+10,y+20,20,20);
                //炮筒
                g.drawLine(x+20,y+30,x+20,y+60);
                break;
            //左
            case 3:
                //左边的轮子
                g.fill3DRect(x,y,60,10,false);
                //右边的轮子
                g.fill3DRect(x,y+30,60,10,false);
                //主体
                g.fill3DRect(x+10,y+10,40,20,false);
                //圆盖
                g.fillOval(x+20,y+10,20,20);
                //炮筒
                g.drawLine(x+30,y+20,x,y+20);
                break;
            default:
                System.out.println("不存在");
        }
    }

    //有字符输出时,该方法就会被触发
    @Override
    public void keyTyped(KeyEvent e) {

    }

    //某个键被按下时,该方法就会被触发
    @Override
    public void keyPressed(KeyEvent e) {
        //按下W键
        if(e.getKeyCode() == KeyEvent.VK_W){
            mt.setDirection(0);
            mt.moveUp();
        }
        //按下D键
        else if(e.getKeyCode() == KeyEvent.VK_D){
            mt.setDirection(1);
            mt.moveRight();
        }
        //按下S键
        else if(e.getKeyCode() == KeyEvent.VK_S){
            mt.setDirection(2);
            mt.moveDown();
        }
        //按下A键
        else if(e.getKeyCode() == KeyEvent.VK_A){
            mt.setDirection(3);
            mt.moveLeft();
        }
        //重绘面板
        this.repaint();
    }

    //某个键被松开时,该方法就会被触发
    @Override
    public void keyReleased(KeyEvent e) {

    }
}

游戏入口

package TankGeme;

import javax.swing.*;

/**
 * @author 小小小白白白白
 * 框架及入口
 */
public class Game01 extends JFrame {

    //定义MyPanel
    MyPanel mp=null;
    public static void main(String[] args) {
        Game01 game01 = new Game01();
    }
    public  Game01(){
        mp=new MyPanel();
        //将游戏的绘图区域放入画框
        this.add(mp);
        //设置画框大小
        this.setSize(1000,750);
        //监听键盘事件
        this.addKeyListener(mp);
        //可视化
        this.setVisible(true);
        //退出
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1while(true){learn}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值