java坦克大战 素材_坦克大战 游戏源码 素材 文档(了解面向对象的具体编程)
【實(shí)例簡(jiǎn)介】
【實(shí)例截圖】
【核心代碼】
/**
* 功能:坦克游戲的5.0[]
* 1.畫(huà)出坦克.
* 2.我的坦克可以上下左右移動(dòng)
* 3.可以發(fā)射子彈,子彈連發(fā)(最多5)
* 4.當(dāng)我的坦克擊中敵人坦克時(shí),敵人就消失(爆炸的效果)
* 5.我被擊中后,顯示爆炸效果
* 6.防止敵人坦克重疊運(yùn)動(dòng)(*)
* 6.1決定把判斷是否碰撞的函數(shù)寫(xiě)到EnemyTank類(lèi)
* 7.可以分關(guān)(*)
* 7.1做一個(gè)開(kāi)始的Panle,它是一個(gè)空的
* 7.2閃爍效果
* 8.可以在玩游戲的時(shí)候暫停和繼續(xù)(*)
* 8.1當(dāng)用戶(hù)點(diǎn)擊暫停時(shí),子彈的速度和坦克速度設(shè)為0,并讓坦克的方向不要變化
* 9.可以記錄玩家的成績(jī)(*)
* 9.1用文件流.
* 9.2單寫(xiě)一個(gè)記錄類(lèi),完成對(duì)玩家記錄
* 9.3先完成保存共擊毀了多少輛敵人坦克的功能.
* 9.4存盤(pán)退出游戲,可以記錄當(dāng)時(shí)的敵人坦克坐標(biāo),并可以恢復(fù)
* 10.java如何操作聲音文件(*)
* 10.1對(duì)聲音文件的操作
*/
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;
//定義一個(gè)開(kāi)始面板
MyStartPanel msp=null;
//作出我需要的菜單
JMenuBar jmb=null;
//開(kāi)始游戲
JMenu jm1=null;
JMenuItem jmil=null;
//退出系統(tǒng)
JMenuItem jmi2=null;
//存盤(pán)退出
JMenuItem jmi3=null;
JMenuItem jmi4=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
MyTankGame3 mtg=new MyTankGame3();
}
//構(gòu)造函數(shù)
public MyTankGame3()
{
//mp=new MyPanel();
//啟動(dòng)mp線程
//Thread t=new Thread(mp);
//t.start();
//this.add(mp);
//注冊(cè)監(jiān)聽(tīng)
//this.addKeyListener(mp);
//創(chuàng)建菜單及菜單選項(xiàng)
jmb=new JMenuBar();
jm1 =new JMenu("游戲(G)");
//設(shè)置快捷方式
jm1.setMnemonic('G');
jmil =new JMenuItem("開(kāi)始新游戲(N)");
jmi2 =new JMenuItem("退出游戲(E)");
jmi3 =new JMenuItem("存盤(pán)退出游戲(C)");
jmi4 =new JMenuItem("繼續(xù)上局游戲(S)");
//注冊(cè)監(jiān)聽(tīng)
jmi4.addActionListener(this);
jmi4.setActionCommand("conGame");
//注冊(cè)監(jiān)聽(tīng)
jmi3.addActionListener(this);
jmi3.setActionCommand("saveExit");
jmi2.addActionListener(this);
jmi2.setActionCommand("exit");
jmi2.setMnemonic('E');
//對(duì)jmil相應(yīng)
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
//對(duì)用戶(hù)不同的點(diǎn)擊作出不同的處理
if(arg0.getActionCommand().equals("newgame"))
{
//創(chuàng)建戰(zhàn)場(chǎng)面板
mp=new MyPanel("newGame");
//啟動(dòng)mp線程
Thread t=new Thread(mp);
t.start();
//先刪除舊的開(kāi)始面板
this.remove(msp);
this.add(mp);
//注冊(cè)監(jiān)聽(tīng)
this.addKeyListener(mp);
//顯示,刷新JFrame
this.setVisible(true);
}else if(arg0.getActionCommand().equals("exit"))
{
//用戶(hù)點(diǎn)擊了退出系統(tǒng)的菜單
//保存擊毀敵人數(shù)量.
Recorder.keepRecording();
System.exit(0);
}//對(duì)存盤(pán)退出左處理
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);
//保存擊毀敵人的數(shù)量和敵人的坐標(biāo)
rd.keepRecAndEnemyTank();
//退出
System.exit(0);
}else if(arg0.getActionCommand().equals("conGame"))
{
//創(chuàng)建戰(zhàn)場(chǎng)面板
mp=new MyPanel("con");
//啟動(dòng)mp線程
Thread t=new Thread(mp);
t.start();
//先刪除舊的開(kāi)始面板
this.remove(msp);
this.add(mp);
//注冊(cè)監(jiān)聽(tīng)
this.addKeyListener(mp);
//顯示,刷新JFrame
this.setVisible(true);
}
}
}
//就是一個(gè)提示作用
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);
//開(kāi)關(guān)信息的字體
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 ;
//重畫(huà)
this.repaint();
}
}
}
//我的面板
class MyPanel extends JPanel implements KeyListener,Runnable
{
//定義一個(gè)我的坦克
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;
//構(gòu)造函數(shù)
public MyPanel(String flag)
{
//恢復(fù)記錄
Recorder.getRecoring();
hero=new Hero(100,100);
if(flag.equals("newGame"))
{
//初始化敵人的坦克
for(int i=0;i
{
//創(chuàng)建一輛敵人的坦克對(duì)象
EnemyTank et=new EnemyTank((i 1)*50,0);
et.setColor(0);
et.setDirect(2);
//將MyPanel的敵人坦克向量交給該敵人坦克
et.setEts(ets);
//啟動(dòng)敵人的坦克
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);
//創(chuàng)建一輛敵人的坦克對(duì)象
EnemyTank et=new EnemyTank(node.x,node.y);
et.setColor(0);
et.setDirect(node.direct);
//將MyPanel的敵人坦克向量交給該敵人坦克
et.setEts(ets);
//啟動(dòng)敵人的坦克
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
}
//播放開(kāi)戰(zhàn)聲音
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"));
}
//畫(huà)出提示信息
public void showInfo(Graphics g)
{
//畫(huà)出提示信息坦克(該坦克不參與戰(zhàn)斗)
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);
//畫(huà)出玩家的總成績(jī)
g.setColor(Color.black);
Font f=new Font("宋體",Font.BOLD,20);
g.setFont(f);
g.drawString("您的總成績(jī)", 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);
//畫(huà)出提示信息
this.showInfo(g);
//畫(huà)出自己的坦克
if(hero.isLive)
{
this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);
}
//從ss,中取出每顆子彈,并畫(huà)出
for(int i=0;i
{
Shot myShot=hero.ss.get(i);
//畫(huà)出子彈,畫(huà)出一顆子彈
if(myShot!=null&&myShot.isLive==true)
{
g.draw3DRect(myShot.x, myShot.y, 1, 1,false);
}
if(myShot.isLive==false)
{
//從ss中刪除掉該子彈
hero.ss.remove(myShot);
}
}
//畫(huà)出炸彈
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);
}
}
//畫(huà)出敵人的坦克
for(int i=0;i
{
EnemyTank et=ets.get(i);
if(et.isLive)
{
this.drawTank(et.getX(), et.getY(), g, et.getDirect(), 0);
//再畫(huà)出敵人的子彈
//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()
{
//取出每一個(gè)敵人的坦克
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)
{
//取出每個(gè)坦克,與它判斷
for(int j=0;j
{
//取出坦克
EnemyTank et=ets.get(j);
if(et.isLive)
{
if(this.hitTank(myShot, et))
{
//減少敵人數(shù)量
Recorder.reduceEnNum();
//增加我的記錄
Recorder.addEnNumRec();
}
}
}
}
}
}
//寫(xiě)一個(gè)函數(shù)專(zhuān)門(mén)判斷子彈是否擊中敵人坦克
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;
//創(chuàng)建一顆炸彈,放入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;
//創(chuàng)建一顆炸彈,放入Vector
Bomb b=new Bomb(et.x,et.y);
//放入Vector
bombs.add(b);
}
}
return b2;
}
//畫(huà)出坦克的函數(shù)(擴(kuò)展)
public void drawTank(int x,int y,Graphics g,int direct,int type)
{
//判斷是什么類(lèi)型的坦克
switch(type)
{
case 0:
g.setColor(Color.cyan);
break;
case 1:
g.setColor(Color.yellow);
break;
}
//判斷方向
switch(direct)
{
//向上
case 0:
//畫(huà)出我的坦克(到時(shí)再封裝成一個(gè)函數(shù))
//1.畫(huà)出左邊的矩形
g.fill3DRect(x, y, 5, 30,false);
//2.畫(huà)出右邊矩形
g.fill3DRect(x 15,y , 5, 30,false);
//3.畫(huà)出中間矩形
g.fill3DRect(x 5,y 5 , 10, 20,false);
//4.畫(huà)出圓形
g.fillOval(x 5, y 10, 10, 10);
//5.畫(huà)出線
g.drawLine(x 10, y 15, x 10, y);
break;
case 1:
//炮筒向右
//畫(huà)出上面矩形
g.fill3DRect(x, y, 30, 5,false);
//畫(huà)出下面的矩形
g.fill3DRect(x, y 15, 30, 5, false);
//畫(huà)出中間的矩形
g.fill3DRect(x 5, y 5, 20, 10, false);
//畫(huà)出圓形
g.fillOval(x 10, y 5, 10, 10);
//畫(huà)出線
g.drawLine(x 15, y 10, x 30, y 10);
break;
case 2:
//向下
//畫(huà)出我的坦克(到時(shí)再封裝成一個(gè)函數(shù))
//1.畫(huà)出左邊的矩形
g.fill3DRect(x, y, 5, 30,false);
//2.畫(huà)出右邊矩形
g.fill3DRect(x 15,y , 5, 30,false);
//3.畫(huà)出中間矩形
g.fill3DRect(x 5,y 5 , 10, 20,false);
//4.畫(huà)出圓形
g.fillOval(x 5, y 10, 10, 10);
//5.畫(huà)出線
g.drawLine(x 10, y 15, x 10, y 30);
break;
case 3:
//向左
//畫(huà)出上面矩形
g.fill3DRect(x, y, 30, 5,false);
//畫(huà)出下面的矩形
g.fill3DRect(x, y 15, 30, 5, false);
//畫(huà)出中間的矩形
g.fill3DRect(x 5, y 5, 20, 10, false);
//畫(huà)出圓形
g.fillOval(x 10, y 5, 10, 10);
//畫(huà)出線
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)
{
//設(shè)置我的坦克的方向
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
//開(kāi)火
//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();
//函數(shù),判斷敵人的子彈是否擊中我
this.hitMe();
//重繪
this.repaint();
}
}
}
總結(jié)
以上是生活随笔為你收集整理的java坦克大战 素材_坦克大战 游戏源码 素材 文档(了解面向对象的具体编程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python统计英文句子每个单词字数_P
- 下一篇: ElasticSearch 安装IK分词