java坦克大战 素材_坦克大战 游戏源码+ 素材+文档(了解面向对象的具体编程)
【實例簡介】
【實例截圖】
【核心代碼】
/**
* 功能:坦克游戲的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(times%2==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坦克大战 素材_坦克大战 游戏源码+ 素材+文档(了解面向对象的具体编程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springmvc拦截器对请求参数解密_
- 下一篇: 计算机网络按拓扑结构可分为三种基本型,2