【实例简介】

【实例截图】

【核心代码】

/**

* 功能:坦克游戏的5.0[]

* 1.画出坦克.

* 2.我的坦克可以上下左右移动

* 3.可以发射子弹,子弹连发(最多5)

* 4.当我的坦克击中敌人坦克时,敌人就消失(爆炸的效果)

* 5.我被击中后,显示爆炸效果

* 6.防止敌人坦克重叠运动(*)

* 6.1决定把判断是否碰撞的函数写到EnemyTank类

* 7.可以分关(*)

* 7.1做一个开始的Panle,它是一个空的

* 7.2闪烁效果

* 8.可以在玩游戏的时候暂停和继续(*)

* 8.1当用户点击暂停时,子弹的速度和坦克速度设为0,并让坦克的方向不要变化

* 9.可以记录玩家的成绩(*)

* 9.1用文件流.

* 9.2单写一个记录类,完成对玩家记录

* 9.3先完成保存共击毁了多少辆敌人坦克的功能.

* 9.4存盘退出游戏,可以记录当时的敌人坦克坐标,并可以恢复

* 10.java如何操作声音文件(*)

* 10.1对声音文件的操作

*/

package com.test3;

import javax.imageio.ImageIO;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import java.io.*;

public class MyTankGame3 extends JFrame implements ActionListener {

MyPanel mp=null;

//定义一个开始面板

MyStartPanel msp=null;

//作出我需要的菜单

JMenuBar jmb=null;

//开始游戏

JMenu jm1=null;

JMenuItem jmil=null;

//退出系统

JMenuItem jmi2=null;

//存盘退出

JMenuItem jmi3=null;

JMenuItem jmi4=null;

public static void main(String[] args) {

// TODO Auto-generated method stub

MyTankGame3 mtg=new MyTankGame3();

}

//构造函数

public MyTankGame3()

{

//mp=new MyPanel();

//启动mp线程

//Thread t=new Thread(mp);

//t.start();

//this.add(mp);

//注册监听

//this.addKeyListener(mp);

//创建菜单及菜单选项

jmb=new JMenuBar();

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

//设置快捷方式

jm1.setMnemonic('G');

jmil =new JMenuItem("开始新游戏(N)");

jmi2 =new JMenuItem("退出游戏(E)");

jmi3 =new JMenuItem("存盘退出游戏(C)");

jmi4 =new JMenuItem("继续上局游戏(S)");

//注册监听

jmi4.addActionListener(this);

jmi4.setActionCommand("conGame");

//注册监听

jmi3.addActionListener(this);

jmi3.setActionCommand("saveExit");

jmi2.addActionListener(this);

jmi2.setActionCommand("exit");

jmi2.setMnemonic('E');

//对jmil相应

jmil.addActionListener(this);

jmil.setActionCommand("newgame");

jm1.add(jmil);

jm1.add(jmi2);

jm1.add(jmi3);

jm1.add(jmi4);

jmb.add(jm1);

msp=new MyStartPanel();

Thread t=new Thread(msp);

t.start();

this.setJMenuBar(jmb);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.add(msp);

this.setSize(600, 500);

this.setVisible(true);

}

public void actionPerformed(ActionEvent arg0) {

// TODO Auto-generated method stub

//对用户不同的点击作出不同的处理

if(arg0.getActionCommand().equals("newgame"))

{

//创建战场面板

mp=new MyPanel("newGame");

//启动mp线程

Thread t=new Thread(mp);

t.start();

//先删除旧的开始面板

this.remove(msp);

this.add(mp);

//注册监听

this.addKeyListener(mp);

//显示,刷新JFrame

this.setVisible(true);

}else if(arg0.getActionCommand().equals("exit"))

{

//用户点击了退出系统的菜单

//保存击毁敌人数量.

Recorder.keepRecording();

System.exit(0);

}//对存盘退出左处理

else if(arg0.getActionCommand().equals("saveExit"))

{

System.out.println("111");

System.out.println("mp.ets.size=" mp.ets.size());

//工作

Recorder rd=new Recorder();

rd.setEts(mp.ets);

//保存击毁敌人的数量和敌人的坐标

rd.keepRecAndEnemyTank();

//退出

System.exit(0);

}else if(arg0.getActionCommand().equals("conGame"))

{

//创建战场面板

mp=new MyPanel("con");

//启动mp线程

Thread t=new Thread(mp);

t.start();

//先删除旧的开始面板

this.remove(msp);

this.add(mp);

//注册监听

this.addKeyListener(mp);

//显示,刷新JFrame

this.setVisible(true);

}

}

}

//就是一个提示作用

class MyStartPanel extends JPanel implements Runnable

{

int times=0;

public void paint(Graphics g)

{

super.paint(g);

g.fillRect(0, 0, 400, 300);

//提示信息

if(times2==0)

{

g.setColor(Color.yellow);

//开关信息的字体

Font myFont=new Font("华文新魏",Font.BOLD,30);

g.setFont(myFont);

g.drawString("stage: 1", 150, 150);

}

}

public void run() {

// TODO Auto-generated method stub

while(true)

{

//休眠

try {

Thread.sleep(100);

} catch (Exception e) {

e.printStackTrace();

// TODO: handle exception

}

times ;

//重画

this.repaint();

}

}

}

//我的面板

class MyPanel extends JPanel implements KeyListener,Runnable

{

//定义一个我的坦克

Hero hero=null;

//定义敌人的坦克组

Vector ets=new Vector();

Vector nodes=new Vector();

//定义炸弹集合

Vector bombs=new Vector();

int enSize=3;

//定义三张图片,三张图片才能组成一颗炸弹

Image image1=null;

Image image2=null;

Image image3=null;

//构造函数

public MyPanel(String flag)

{

//恢复记录

Recorder.getRecoring();

hero=new Hero(100,100);

if(flag.equals("newGame"))

{

//初始化敌人的坦克

for(int i=0;i

{

//创建一辆敌人的坦克对象

EnemyTank et=new EnemyTank((i 1)*50,0);

et.setColor(0);

et.setDirect(2);

//将MyPanel的敌人坦克向量交给该敌人坦克

et.setEts(ets);

//启动敌人的坦克

Thread t=new Thread(et);

t.start();

//给敌人坦克添加一颗子弹

Shot s=new Shot(et.x 10,et.y 30,2);

//加入给敌人坦克

et.ss.add(s);

Thread t2=new Thread(s);

t2.start();

//加入

ets.add(et);

}

}else{

System.out.println("接着玩");

nodes=new Recorder().getNodesAndEnNums();

//初始化敌人的坦克

for(int i=0;i

{

Node node=nodes.get(i);

//创建一辆敌人的坦克对象

EnemyTank et=new EnemyTank(node.x,node.y);

et.setColor(0);

et.setDirect(node.direct);

//将MyPanel的敌人坦克向量交给该敌人坦克

et.setEts(ets);

//启动敌人的坦克

Thread t=new Thread(et);

t.start();

//给敌人坦克添加一颗子弹

Shot s=new Shot(et.x 10,et.y 30,2);

//加入给敌人坦克

et.ss.add(s);

Thread t2=new Thread(s);

t2.start();

//加入

ets.add(et);

}

}

try {

image1=ImageIO.read(new File("bomb_1.gif"));

image2=ImageIO.read(new File("bomb_2.gif"));

image3=ImageIO.read(new File("bomb_3.gif"));

} catch (Exception e) {

e.printStackTrace();

// TODO: handle exception

}

//播放开战声音

AePlayWave apw=new AePlayWave("./111.wav");

apw.start();

//初始化图片d

//image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));

//image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));

//image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif"));

}

//画出提示信息

public void showInfo(Graphics g)

{

//画出提示信息坦克(该坦克不参与战斗)

this.drawTank(80,330, g, 0, 0);

g.setColor(Color.black);

g.drawString(Recorder.getEnNum() "", 110, 350);

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

g.setColor(Color.black);

g.drawString(Recorder.getMyLife() "", 165, 350);

//画出玩家的总成绩

g.setColor(Color.black);

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

g.setFont(f);

g.drawString("您的总成绩", 420, 30);

this.drawTank(420, 60, g, 0, 0);

g.setColor(Color.black);

g.drawString(Recorder.getAllEnNum() "", 460, 80);

}

//重新paint

public void paint(Graphics g)

{

super.paint(g);

g.fillRect(0, 0, 400, 300);

//画出提示信息

this.showInfo(g);

//画出自己的坦克

if(hero.isLive)

{

this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);

}

//从ss,中取出每颗子弹,并画出

for(int i=0;i

{

Shot myShot=hero.ss.get(i);

//画出子弹,画出一颗子弹

if(myShot!=null&&myShot.isLive==true)

{

g.draw3DRect(myShot.x, myShot.y, 1, 1,false);

}

if(myShot.isLive==false)

{

//从ss中删除掉该子弹

hero.ss.remove(myShot);

}

}

//画出炸弹

for(int i=0;i

{

System.out.println("bombs.size()=" bombs.size());

//取出炸弹

Bomb b=bombs.get(i);

if(b.life>6)

{

g.drawImage(image1, b.x, b.y, 30, 30, this);

}else if(b.life>3)

{

g.drawImage(image2, b.x, b.y, 30, 30, this);

}else{

g.drawImage(image3, b.x, b.y, 30, 30, this);

}

//让b的生命值减小

b.lifeDown();

//如果炸弹生命值为0,就把该炸弹重bombs向量去掉

if(b.life==0)

{

bombs.remove(b);

}

}

//画出敌人的坦克

for(int i=0;i

{

EnemyTank et=ets.get(i);

if(et.isLive)

{

this.drawTank(et.getX(), et.getY(), g, et.getDirect(), 0);

//再画出敌人的子弹

//System.out.println("坦克子弹有:" et.ss.size());

for(int j=0;j

{

//取出子弹

Shot enemyShot=et.ss.get(j);

if(enemyShot.isLive)

{

//System.out.println("第 " i "坦克的 " j "颗子弹x=" enemyShot.x);

g.draw3DRect(enemyShot.x, enemyShot.y, 1, 1,false);

}else{

//如果敌人的坦克死亡就从Vector去掉

et.ss.remove(enemyShot);

}

}

}

}

}

//敌人的坦克是否击中我

public void hitMe()

{

//取出每一个敌人的坦克

for(int i=0;i

{

//取出坦克

EnemyTank et=ets.get(i);

//取出每一颗子弹

for(int j=0;j

{

//取出子弹

Shot enemyShot=et.ss.get(j);

if(hero.isLive)

{

if(this.hitTank(enemyShot, hero))

{

}

}

}

}

}

//判断我的子弹是否击中敌人的坦克

public void hitEnemyTank()

{

//判断是否击中敌人的坦克

for(int i=0;i

{

//取出子弹

Shot myShot=hero.ss.get(i);

//判断子弹是否有效

if(myShot.isLive)

{

//取出每个坦克,与它判断

for(int j=0;j

{

//取出坦克

EnemyTank et=ets.get(j);

if(et.isLive)

{

if(this.hitTank(myShot, et))

{

//减少敌人数量

Recorder.reduceEnNum();

//增加我的记录

Recorder.addEnNumRec();

}

}

}

}

}

}

//写一个函数专门判断子弹是否击中敌人坦克

public boolean hitTank(Shot s,Tank et)

{

boolean b2=false;

//判断该坦克的方向

switch(et.direct)

{

//如果敌人坦克的方向是上或者是下

case 0:

case 2:

if(s.x>et.x&&s.xet.y&&s.y

{

//击中

//子弹死亡

s.isLive=false;

//敌人坦克死亡

et.isLive=false;

b2=true;

//创建一颗炸弹,放入Vector

Bomb b=new Bomb(et.x,et.y);

//放入Vector

bombs.add(b);

}

break;

case 1:

case 3:

if(s.x>et.x&&s.xet.y&&s.y

{

//击中

//子弹死亡

s.isLive=false;

//敌人坦克死亡

et.isLive=false;

b2=true;

//创建一颗炸弹,放入Vector

Bomb b=new Bomb(et.x,et.y);

//放入Vector

bombs.add(b);

}

}

return b2;

}

//画出坦克的函数(扩展)

public void drawTank(int x,int y,Graphics g,int direct,int type)

{

//判断是什么类型的坦克

switch(type)

{

case 0:

g.setColor(Color.cyan);

break;

case 1:

g.setColor(Color.yellow);

break;

}

//判断方向

switch(direct)

{

//向上

case 0:

//画出我的坦克(到时再封装成一个函数)

//1.画出左边的矩形

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

//2.画出右边矩形

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

//3.画出中间矩形

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

//4.画出圆形

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

//5.画出线

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

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 30, y 10);

break;

case 2:

//向下

//画出我的坦克(到时再封装成一个函数)

//1.画出左边的矩形

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

//2.画出右边矩形

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

//3.画出中间矩形

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

//4.画出圆形

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

//5.画出线

g.drawLine(x 10, y 15, x 10, y 30);

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, y 10);

break;

}

}

//键按下处理 a 表示向左 s 表示 下 w 表示向上 d表示右

public void keyPressed(KeyEvent arg0) {

// TODO Auto-generated method stub

if(arg0.getKeyCode()==KeyEvent.VK_W)

{

//设置我的坦克的方向

this.hero.setDirect(0);

this.hero.moveUp();

}else if(arg0.getKeyCode()==KeyEvent.VK_D)

{

//向右

this.hero.setDirect(1);

this.hero.moveRight();

}else if(arg0.getKeyCode()==KeyEvent.VK_S)

{

//向下

this.hero.setDirect(2);

this.hero.moveDown();

}else if(arg0.getKeyCode()==KeyEvent.VK_A)

{

//向左

this.hero.setDirect(3);

this.hero.moveLeft();

}

if(arg0.getKeyCode()==KeyEvent.VK_J)

{

//判断玩家是否按下j

//开火

//System.out.println("this.hero.ss.size()=" this.hero.ss.size());

if(this.hero.ss.size()<=4)

{

this.hero.shotEnemy();

}

}

//必须重新绘制Panel

this.repaint();

}

public void keyReleased(KeyEvent arg0) {

// TODO Auto-generated method stub

}

public void keyTyped(KeyEvent arg0) {

// TODO Auto-generated method stub

}

public void run() {

// TODO Auto-generated method stub

//每隔100毫秒去重绘

while(true)

{

try {

Thread.sleep(100);

} catch (Exception e) {

e.printStackTrace();

// TODO: handle exception

}

this.hitEnemyTank();

//函数,判断敌人的子弹是否击中我

this.hitMe();

//重绘

this.repaint();

}

}

}

java坦克大战 素材_坦克大战 游戏源码 素材 文档(了解面向对象的具体编程)相关推荐

  1. 仙剑java单机游戏_仙剑游戏源码(含文档)

    [实例简介]java游戏 [实例截图] [核心代码] │  .gitattributes │  README.md │  运行方式.txt │  项目报告.doc │ └─WLGC16-2-XJQXZ ...

  2. JAVA毕业设计工厂生产计划与进度管理系统计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计工厂生产计划与进度管理系统计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计工厂生产计划与进度管理系统计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构 ...

  3. JAVA毕业设计高校学生资助管理信息系统计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计高校学生资助管理信息系统计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计高校学生资助管理信息系统计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B ...

  4. JAVA毕业设计互联网校园家教兼职平台计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计互联网校园家教兼职平台计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计互联网校园家教兼职平台计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S ...

  5. JAVA毕业设计装修设计管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计装修设计管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计装修设计管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构 ...

  6. JAVA毕业设计高校社区生鲜配送系统计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计高校社区生鲜配送系统计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计高校社区生鲜配送系统计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 ...

  7. JAVA毕业设计Web端校园报修系统计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计Web端校园报修系统计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计Web端校园报修系统计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 ...

  8. java计算机毕业设计线上花店购物商城源码+lw文档+系统+数据库

    java计算机毕业设计线上花店购物商城源码+lw文档+系统+数据库 java计算机毕业设计线上花店购物商城源码+lw文档+系统+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...

  9. java毕业设计社区流浪猫狗救助网站源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计社区流浪猫狗救助网站源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计社区流浪猫狗救助网站源码+lw文档+mybatis+系统+mysql数据库+调试 本源 ...

  10. java毕业设计体育城场地预定系统前台源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计体育城场地预定系统前台源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计体育城场地预定系统前台源码+lw文档+mybatis+系统+mysql数据库+调试 ...

最新文章

  1. android异常 More than one file was found with OS independent path ‘META-INF/XXX‘
  2. 【毕业求职季】-听说你想去大厂看学妹,教你京东软件产品经理面试如何一把过
  3. unicode 字符集环境下的mfc 读写 ini 配置文件的_WSL:在Windows下优雅地玩Linux
  4. springboot 使用的配置
  5. Android 手把手带你玩转自己定义相机
  6. Go学习笔记(三)Go 语言基础语法
  7. ajax动态生成表格
  8. java中使用switch case报错case expressions must be constant expressions
  9. java鼠标事件_Java 模拟鼠标事件
  10. java并发编程(2)--线程 原子性 volatile AtomicInteger
  11. GENTLE.NET快速上手
  12. 程序流程图生成器 程序源代码生成/转换成流程图 函数调用关系图
  13. RBAC权限系统设计
  14. Go语言utf8汉字字符串截取处理小记
  15. 【语义分割】 DRANet Scene Segmentation With Dual Relation-Aware Attention Network
  16. python爬斗鱼直播房间名和主播名_python3爬取斗鱼某些版块的主播人气
  17. MIT6.824-lab3AB-2022(万字推导思路及代码构建)
  18. 目前市场上做一个网站大约需要多少钱?
  19. linux下安装mariadb
  20. 如何去掉a标签的下划线

热门文章

  1. u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot
  2. acdsee 15中文版的许可证密钥+激活方法
  3. [Asp.Net Core]Session的使用
  4. Unity Koreographer 之 音乐制作插件介绍学习,一般使用步骤介绍(包括:一般音乐游戏制作流程简绍) 一
  5. Winrar 5.60 beta 4 个性破解注册码(2018.5.22)
  6. stm32无源蜂鸣器定时器_【STM32H7教程】第20章 STM32H7的GPIO应用之无源蜂鸣器...
  7. hp服务器修改风扇转速,如何改变惠普笔记本风扇转速
  8. Webpack5构建微前端和Web应用程序2022教程
  9. 《HBase权威指南》一3.4 行锁
  10. matlab中的取整函数(ceil、floor、round)