java 坦克大战画坦克_java简易坦克大战(2)

这篇博客介绍了一个使用Java编写的坦克大战游戏。作者通过创建`Tank1`类,实现了游戏菜单、游戏面板以及坦克的绘制。游戏包含主菜单选项,如开始新游戏,并且有敌方和我方坦克的移动、碰撞检测以及子弹发射等功能。游戏中的坦克和子弹通过线程进行控制和更新。此外,游戏还包含了爆炸效果和声音播放。
摘要由CSDN通过智能技术生成

public class Tank1 extends JFrame implements ActionListener {

MyPanel mp = null;

GuanKaPanel gkmb = null;

JMenuBar cdt = null;

JMenu cd = null;

JMenuItem cdx1 = null;

public static void main(String[] args) {

Tank1 t1 = new Tank1();// 主函数的调用

}

public Tank1() {

cdt = new JMenuBar();

cd = new JMenu("游戏(G)");

cd.setMnemonic('G');

cdx1 = new JMenuItem("新游戏(N)");

cdx1.addActionListener(this);

cdx1.setActionCommand("xyx");

cd.add(cdx1);

cdt.add(cd);

JMenuItem menuItem = new JMenuItem("\u9000\u51FA\u6E38\u620F");

menuItem.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

JiLu.bcjl();

System.exit(0);

}

});

cd.add(menuItem);

/*

* mp = new MyPanel(); this.add(mp); this.addKeyListener(mp); Thread t =

* new Thread(mp);// 开启线程 t.start();

*/

gkmb = new GuanKaPanel();

getContentPane().add(gkmb);

gkmb.setLayout(null);

Thread t1 = new Thread(gkmb);

t1.start();

this.setTitle("张宇的坦克大战");

this.setJMenuBar(cdt);

this.setSize(1080, 820);

this.setLocation(250, 150);

this.setResizable(false);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

public void actionPerformed(ActionEvent e) {

if (e.getActionCommand().equals("xyx")) {

mp = new MyPanel();

this.remove(gkmb);

getContentPane().add(mp);

this.addKeyListener(mp);

Thread t = new Thread(mp);// 开启线程

t.start();

this.setVisible(true);

}

}

}

class MyPanel extends JPanel implements KeyListener, Runnable {

MyTank mt = null;

// 敌方坦克集合类,arr单线程 vec多线程。

Vector bzjh = new Vector();// 爆炸类集合。

Vector dtk = new Vector();

int tksl = 18;// 敌方坦克数量

Image tp1 = null;

Image tp2 = null;

Image tp3 = null;

public void tjsj(Graphics g) {

/*

* this.drawTank(330, 660, g, 0, 0); g.setColor(Color.black);

* g.drawString(JiLu.getMtsl()+"" ,360, 680);

*/

this.drawTank(330, 660, g, 0, 1);

g.setColor(Color.black);

g.drawString(JiLu.getDtsl() + "", 360, 680);

g.drawString(JiLu.getSdtj() + "", 980, 300);

this.drawTank(900, 200, g, 0, 1);

g.setColor(Color.black);

JiLu.dqjl();

Font f = new Font("楷体", Font.BOLD, 20);

g.setFont(f);

g.drawString("你消灭的坦克总数", 800, 300);

// g.drawString("消灭坦克999辆有惊喜", 800, 600);

}

public MyPanel() {

mt = new MyTank(330, 530);

for (int i = 0; i < tksl; i++) {

DiTank dt = new DiTank((i) * 45 + 5, 10);

Thread t = new Thread(dt);// 启动敌方坦克线程

t.start();

dtk.add(dt);

dt.setDtk(dtk);// 修改敌方坦克的集合类

/*

* ZiDan zd=new ZiDan(dt.x,dt.y+0, 2); dt.dzd.add(zd);//装子弹 Thread

* dzdfs =new Thread(zd); dzdfs.start();//坦克初始子弹。

*/

// 装敌方坦克

}

tp1 = Toolkit.getDefaultToolkit().getImage(

Panel.class.getResource("/bzxg1.gif"));

tp2 = Toolkit.getDefaultToolkit().getImage(

Panel.class.getResource("/bzxg2.gif"));

tp3 = Toolkit.getDefaultToolkit().getImage(

Panel.class.getResource("/bzxg3.gif"));

Shengyin sy = new Shengyin("./newmagua.wav");

// Shengyin sy=new Shengyin("./tank.wav");

sy.start();

}

public void paint(Graphics g) {// 注意方法名,不要搞混了。

super.paint(g);

this.tjsj(g);

g.fillRect(0, 0, 800, 600);

if (mt.shengming) {

this.drawTank(mt.getX(), mt.getY(), g, mt.getFangxiang(), 0);// 控制方向

// 画我方坦克

}

for (int i = 0; i < dtk.size(); i++) {

DiTank dt = dtk.get(i);

if (dt.shengming) {

this.drawTank(dt.getX(), dt.getY(), g, dt.getFangxiang(), 1);

for (int j = 0; j < dt.dzd.size(); j++) {

ZiDan dtzd = dt.dzd.get(j);

if (dtzd.shengming)// 敌方坦克子弹

{

g.setColor(Color.white);

g.fill3DRect(dtzd.x + 8, dtzd.y, 3, 3, false);

} else {

dt.dzd.remove(dtzd);

}

}

this.repaint();

// 画敌方坦克

}

}

// 子弹

for (int i = 0; i < mt.aa.size(); i++) {

ZiDan zd = mt.aa.get(i);

if (zd != null && zd.shengming == true) {

g.setColor(Color.red);

g.fill3DRect(zd.x, zd.y, 3, 3, false);

}

if (zd.shengming == false) {

mt.aa.remove(zd);

}

}

// 爆炸

for (int i = 0; i < bzjh.size(); i++) {

BaoZha bz = bzjh.get(i);

if (bz.shengcunqi > 6) {

System.out.println("666");

g.drawImage(tp1, bz.x, bz.y, 30, 30, this);

} else if (bz.shengcunqi > 3) {

g.drawImage(tp2, bz.x, bz.y, 30, 30, this);

} else {

g.drawImage(tp3, bz.x, bz.y, 30, 30, this);

}

try {

Thread.sleep(30);

this.repaint();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

this.repaint();

bz.scqjs();

if (bz.shengcunqi == 0) {

bzjh.remove(bz);

}

}

}

public void jzwf() {

for (int i = 0; i < dtk.size(); i++) {

DiTank dt = dtk.get(i);

for (int j = 0; j < dt.dzd.size(); j++) {

ZiDan zd = dt.dzd.get(j);

this.jzsf(zd, mt);

}

}

}

public void jzdf() {

for (int i = 0; i < mt.aa.size(); i++) {

// 每发子弹和每个坦克

ZiDan zd = mt.aa.get(i);// 装子弹

// System.out.println("1");

if (zd.shengming) {

for (int j = 0; j < dtk.size(); j++) {

DiTank dt = dtk.get(j);// 装坦克

// System.out.println("2");

if (dt.shengming) {

if (this.jzsf(zd, dt)) {

JiLu.dtjs();// 敌方坦克数量减少

JiLu.sdtj();// 记录杀敌数

}

}

}

}

this.repaint();

}

}

public boolean jzsf(ZiDan zd, Tank dt) {

Boolean b = false;

switch (dt.fangxiang) {

case 0:

case 2:

if (zd.x > dt.x && zd.x < dt.x + 20 && zd.y > dt.y

&& zd.y < dt.y + 30) {

zd.shengming = false;

dt.shengming = false;

b = true;

BaoZha bz = new BaoZha(dt.x, dt.y);

bzjh.add(bz);

}

// System.out.println("4");

break;

case 1:

case 3:

if (zd.x > dt.x && zd.x < dt.x + 30 & zd.y > dt.y

&& zd.y < dt.y + 20) {

zd.shengming = false;

dt.shengming = false;

b = true;

BaoZha bz = new BaoZha(dt.x, dt.y);

bzjh.add(bz);

}

// System.out.println("4");

break;

}

return b;

}

public void drawTank(int x, int y, Graphics g, int fangxiang, int leixing) {// 高封装度

// 任意定义敌我坦克

switch (leixing) {

case 0:// 我的坦克

g.setColor(Color.yellow);

break;

case 1:// 敌方的坦克

g.setColor(Color.green);

break;

default:

break;

}

switch (fangxiang) {

case 0:

g.fill3DRect(x, y, 5, 30, false);

g.fill3DRect(x + 15, y, 5, 30, false);

g.fill3DRect(x + 5, y + 5, 10, 20, false);

g.fillOval(x + 5, y + 10, 10, 10);

g.drawLine(x + 10, y + 15, x + 10, y - 3);

break;

case 1:

g.fill3DRect(x, y, 30, 5, false);

g.fill3DRect(x, y + 15, 30, 5, false);

g.fill3DRect(x + 5, y + 5, 20, 10, false);

g.fillOval(x + 10, y + 5, 10, 10);

g.drawLine(x + 15, y + 10, x - 3, y + 10);

break;

case 2:

g.fill3DRect(x, y, 5, 30, false);

g.fill3DRect(x + 15, y, 5, 30, false);

g.fill3DRect(x + 5, y + 5, 10, 20, false);

g.fillOval(x + 5, y + 10, 10, 10);

g.drawLine(x + 10, y + 15, x + 10, y + 33);

break;

case 3:

g.fill3DRect(x, y, 30, 5, false);

g.fill3DRect(x, y + 15, 30, 5, false);

g.fill3DRect(x + 5, y + 5, 20, 10, false);

g.fillOval(x + 10, y + 5, 10, 10);

g.drawLine(x + 15, y + 10, x + 33, y + 10);

break;

}

}

public void keyPressed(KeyEvent e) {// 键盘监听

if (e.getKeyCode() == KeyEvent.VK_W) {

mt.setFangxiang(0);

mt.xiangshang();

}

else if (e.getKeyCode() == KeyEvent.VK_A) {

mt.setFangxiang(1);

mt.xiangzuo();

}

else if (e.getKeyCode() == KeyEvent.VK_S) {

mt.setFangxiang(2);

mt.xiangxia();

}

else if (e.getKeyCode() == KeyEvent.VK_D) {

mt.setFangxiang(3);

mt.xiangyou();

}

if (e.getKeyCode() == KeyEvent.VK_J) {

if (mt.aa.size() < 8) {

mt.fszd();// 启动子弹

}

}

this.repaint();

}

public void keyReleased(KeyEvent e) {

}

public void keyTyped(KeyEvent e) {

}

public void run() {

while (true) {// 节约cpu,内存资源。

try {

Thread.sleep(50);

// System.out.println("麻瓜");

}

catch (InterruptedException e) {

System.out.println("爆炸");

}

// System.out.println("0");

this.jzdf();

this.jzwf();

/*

* 检错:

*

* 1、代码的错误 2、逻辑的错误 3、变量的错误

*/

}

}

}

package t1;

import java.util.Vector;

class Tank

{

int x=0,y=0;//定义坦克的坐标

int fangxiang=2;//定义方向

int sudu=3;//定义速度

boolean shengming=true;

public int getFangxiang() {

return fangxiang;

}

public void setFangxiang(int fangxiang) {

this.fangxiang = fangxiang;

}

public int getSudu() {

return sudu;

}

public void setSudu(int sudu) {

this.sudu = sudu;

}

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 Tank(int x, int y) {

super();

this.x = x;

this.y = y;

}

}

package t1;

class ZiDan implements Runnable

{

int x,y;//定义坐标

int fangxiang;//定义方向

int sudu=5;//行走速度

boolean shengming=true;

public ZiDan(int x, int y,int fangxiang) {

super();

this.x = x;

this.y = y;

this.fangxiang=fangxiang;

}

public void run() {

// TODO Auto-generated method stub

while(true)

{//死循环需要睡眠

try {

Thread.sleep(50);

} catch (InterruptedException e) {

e.printStackTrace();

}

switch (this.fangxiang) {

case 0:

y-=sudu;

break;

case 1:

x-=sudu;

break;

case 2:

y+=sudu;

break;

case 3:

x+=sudu;

break;

}

if(x<0x>800y<0y>600)

{

shengming=false;

break;

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值