日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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坦克大战 素材_坦克大战 游戏源码+ 素材+文档(了解面向对象的具体编程)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。