經典再現 基於JAVA平台開辟坦克年夜戰游戲。本站提示廣大學習愛好者:(經典再現 基於JAVA平台開辟坦克年夜戰游戲)文章只能為提供參考,不一定能成為您想要的結果。以下是經典再現 基於JAVA平台開辟坦克年夜戰游戲正文
1、需求描寫
1.功效性需求
在功效需求剖析階段,我們的重要義務是指定體系必需供給哪些辦事,界說軟件完成哪些功效,供給給那些人應用,功效需求是軟件開辟的一項根本需求,是需求剖析必弗成少的一部門。坦克年夜戰是一款經典游戲了,本游戲進修了一些先輩們的經歷,全體來講講,游戲分為敵我兩邊,重要介入戰役的坦克有玩家掌握,仇敵坦克可以智能隨機湧現在屏幕上,而且挪動,發射必定數目的槍彈;玩家可以在劃定的區域內隨便挪動坦克,當有槍彈擊中玩家時,玩家逝世亡,游戲停止;仇敵坦克智能運轉,敵方坦克因為須要具有必定智能性,隨機湧現在屏幕上,自在的遷移轉變例如:碰著界限曉得轉向;槍彈的運轉:坦克有玩家掌握打出,依據分歧的坦克地位發射槍彈,假如擊中目的,則會發生爆炸後果;在屏幕下面也將消逝。
2.體系機能需求
游戲關於基於盤算機體系的機能設置裝備擺設請求是保證能使法式疾速,穩固的運轉,運轉時可以或許實時的呼應,當游戲中玩家坦克被擊毀,實時提醒游戲掉敗的信息,能實時有所回應,以知足游戲的規矩需求,別的還要包管玩游戲時刻,主窗口的年夜小是不克不及夠隨便修改的,包管有可玩性。
3.功效處理的成績
游戲中須要代碼應用率很好,究竟是一個及時運轉的作品,每毫秒都邑有許多個槍彈發射,和許多個坦克的坐標挪動,有數次的比較槍彈能否擊中坦克,關於鍵盤監聽事宜,和完成線程這個接口,畫圖的重繪刷新等成績;邏輯感須要較強,和面向對象展示的極盡描摹;乃至之間的關系弄不清晰,很輕易湧現不測的情形;游戲中為了使參加一下雅觀,增加了爆炸這一景象,那末這就須要當仇敵坦克逝世亡的時刻在裡面的面板上完成對固定處所圖片停止長久疾速的輪播,完成一個爆炸後果;
總的來講關於坦克年夜戰所要完成的根本的功效有:圖形化界面、敵我坦克款式差別、坦克可以發射槍彈進擊對方,但卻不克不及進擊隊友,坦克設置必定的性命值;
2、重要功效剖析
在坦克年夜戰游戲開辟進程中,完成的重要的功效;供給給用戶所應用,所以起首要畫出來個坦克。
1.畫出玩家坦克: 須要在JPanel面板下面設置一張畫紙paint()並用畫筆draw出坦克的年夜致外形;
2.玩家的坦克可以挪動: 假如如果坦克活動起來,須要轉變坦克的坐標,而且一直的重繪面板,但甚麼時刻讓坦克挪動,可以在面板的類中完成事宜監聽機制(鍵盤監聽)的接口,當玩家摁下w/d/s/a鍵可以對應高低閣下挪動;
3.並在我的畫紙paint()下面畫出仇敵坦克;因為仇敵坦克與玩家坦克在統一界面,須要畫出在統一畫板上;
4.玩家的坦克可以發射槍彈: 玩家要想發射槍彈,要有事宜源,就是當用戶摁下J鍵,事宜監聽當連忙發射一發槍彈,但有須要顯示在用戶的面前看出後果,所以在面板下面paint()畫出槍彈;因為槍彈發射出來須要朝著發射放一直的挪動,所以不進要一向轉變槍彈的坐標,還要在槍彈速度適當,所以須要用線程完成,並讓面板的一直重繪,看出後果;
5.玩家槍彈可以連發而且最多發五顆: 玩家若要掌握槍彈的個數,須要在玩家摁下J鍵時刻,來得出以後存活的槍彈數目能否小於5,當相符前提,就創立一顆槍彈,當玩家發射槍彈年夜小跨越五顆,則不再挪用體系的開仗函數;因為發射槍彈不是只發射一顆,所以設置聚集寄存槍彈,開仗一次發生一個槍彈,曉得槍彈碰著界限逝世亡等於溢出槍彈聚集;
6.玩家坦克擊中仇敵坦克則消逝,並發生爆炸後果;起首要斷定玩家坦克的槍彈能否擊中了仇敵,所以要有一直斷定擊中仇敵的函數,當槍彈運轉到仇敵坦克上,坦克性命須要終結,並發生一顆炸彈,並在paint()畫出炸彈;
7.仇敵的坦克可以智能挪動: 假如如果坦克只能挪動,須要隨機發生挪動偏向,因為一直的活動,所以將辦法寫入到線程的run函數外面,並掌握線程休眠來完成挪動速度成績;
8.仇敵坦克以可以發射槍彈: 在畫出仇敵的同時,在線程中設定必定休眠發生分歧偏向,分歧數目坦克的槍彈,並在面板上掏出每顆槍彈,並畫出;
9.仇敵槍彈擊中玩家,玩家消逝: 一直的掏出仇敵的每顆槍彈,與玩家坦克停止比對,當槍彈觸碰著玩家,玩家爆炸消逝;
3、概要設計
•腳色屬性設置
坦克:坦克發生的地位,分歧類型坦克的色彩,坦克性命標識符,坦克活動的速度,和分歧偏向的坦克;
玩家坦克:繼續坦克根本屬性以後,在次基本上完成,玩家坦克的自在高低閣下挪動;和玩家坦克具有開仗發射槍彈這類功效;
仇敵坦克:繼續根本坦克屬性以後,須要完成仇敵坦克要智能的活動,同時也要在分歧地位的坦克對其停止發射槍彈線程;
槍彈:槍彈要有坐標地位,速度,性命值,和槍彈應當可以動,和槍彈也要逝世亡函數辦法的完成;
炸彈:炸彈的坐標,性命,和性命漸消逝的後果辦法函數;
•功效屬性設置
畫紙:paint()應當畫出來玩家坦克,仇敵坦克,和顯示出逝世亡坦克爆炸後果;
事宜監聽:當用戶摁下wdsa,對應的玩家坦克應當停止偏向的轉變,當用戶發射j則朝發射偏向有顆槍彈,而且應當一向運轉到逝世亡,除非擊中敵方;
擊中坦克:當槍彈擊中到敵方坦克,發生爆炸添加到爆炸集中,並將爆炸信息畫到面紙上;
仇敵擊中玩家:掏出游戲裡所以的仇敵,和每一個仇敵的槍彈與我的坦克去婚配,斷定能否擊中;
玩家擊中仇敵:掏出玩家的每顆槍彈,與每個仇敵的坦克去婚配,斷定能否擊中;並將擊中坦克相干的斷定,放到線程run()外面停止一直並發的斷定;
詳細功效剖析圖以下:
•坦克腳色屬性剖析圖
功效畫板剖析圖
坦克Xmind全體剖析圖
坦克腳色屬性Xmind圖
坦克功效屬性Xmind圖
4、體系完成
•Members.java
//Members.java
package mytank9;
import java.util.*;
class Bomb
{
// 界說炸彈坐標
int x, y;
// 炸彈的性命
int life = 9;
boolean isLive = true;
public Bomb(int x, int y)
{
this.x = x;
this.y = y;
}
// 削減性命值
public void lifeDown()
{
if(life > 0)
{
life--;
}
else{
this.isLive = false;
}
}
}
class Shot implements Runnable
{
int x;
int y;
int direct;
int speed = 1;
boolean isLive = true;
public Shot(int x, int y, int direct)
{
this.x = x;
this.y = y;
this.direct = direct;
}
public void run()
{
while(true)
{
try{
Thread.sleep(50);
}catch(Exception e){
e.printStackTrace();
}
switch(direct)
{
case 0:
y-=speed;
break;
case 1:
x+=speed;
break;
case 2:
y+=speed;
break;
case 3:
x-=speed;
break;
}
// 斷定字段能否碰著邊沿
if(x<0||x>400||y<0||y>300)
{
this.isLive = false;
break;
}
}
}
}
class Tank
{
// 坦克橫坐標
int x = 0;
// 克縱坐標
int y = 0;
// 坦克偏向
// 0 表現上,1表現右,2 表現下,3 表現左
int direct = 0;
// 坦克速度
int speed = 1;
// 坦克色彩
int Color;
boolean isLive = true;
public int getColor() {
return Color;
}
public void setColor(int color) {
Color = color;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
public Tank(int x, int y){
this.x = x;
this.y = y;
}
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;
}
}
// 仇敵的坦克
class EnemyTank extends Tank implements Runnable
{
int times = 0;
// 界說一個向量,可以寄存仇敵的槍彈
Vector<Shot>ss = new Vector<Shot>();
// 仇敵添加槍彈應當在方才創立坦克和仇敵的坦克槍彈逝世亡以後
public EnemyTank(int x, int y)
{
super(x, y);
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
switch(this.direct)
{
case 0:
// 解釋坦克正在向上走
for(int i = 0; i < 30; i++)
{
// 仇敵坦克在我的規模內挪動
if(y>0)
{
y-=speed;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 1:
for(int i = 0; i < 30; i++)
{
if(x<400)
{
x+=speed;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 2:
for(int i = 0; i < 30; i++)
{
if(y<300)
{
y+=speed;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 3:
for(int i = 0; i < 30; i++)
{
if(x > 0)
{
x-=speed;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
}
// 斷定能否須要給坦克參加新的槍彈
this.times++;
if(times%2==0)
{
if(isLive)
{
if(ss.size()<5)
{
Shot s =null;
switch(direct)
{
case 0:
// 創立一顆槍彈
s = new Shot(x+10, y, 0);
// 把槍彈參加到向量
ss.add(s);
break;
case 1:
s = new Shot(x+30, y+10, 1);
ss.add(s);
break;
case 2:
s = new Shot(x+10, y+30, 2);
ss.add(s);
break;
case 3:
s = new Shot(x, y+10, 3);
ss.add(s);
break;
}
// 啟動槍彈線程
Thread t = new Thread(s);
t.start();
}
}
}
// 讓坦克隨機發生一個新的偏向
this.direct = (int)(Math.random()*4);
// 斷定仇敵坦克能否逝世亡
if(this.isLive == false)
{
// 讓坦克逝世亡後,加入過程
break;
}
}
}
}
// 我的坦克
class Hero extends Tank
{
Vector<Shot> ss = new Vector<Shot>();
Shot s = null;
public Hero(int x, int y)
{
super(x, y);
}
// 開仗
public void shotEnemy()
{
switch(this.direct)
{
case 0:
// 創立一顆槍彈
s = new Shot(x+10, y, 0);
// 把槍彈參加到向量
ss.add(s);
break;
case 1:
s = new Shot(x+30, y+10, 1);
ss.add(s);
break;
case 2:
s = new Shot(x+10, y+30, 2);
ss.add(s);
break;
case 3:
s = new Shot(x, y+10, 3);
ss.add(s);
break;
}
Thread t = new Thread(s);
t.start();
}
// 坦克向上挪動
public void moveUP()
{
y-=speed;
}
// 坦克向右挪動
public void moveRight()
{
x+=speed;
}
public void moveDown()
{
y+=speed;
}
public void moveLeft()
{
x-=speed;
}
}
•MyTankGame4.java
//MyTankGame4.java
/*
* 功效:坦克游戲2.0
* 1: 畫出坦克
* 2:我的坦克可以高低挪動
* 3: 畫出仇敵坦克
* 4: 我的坦克可以發槍彈
* 5:槍彈可以連發(最多可以連發五顆)
* 6: 當我的坦克擊中仇敵坦克時刻,仇敵消逝(爆炸
* 『 斷定槍彈能否擊中坦克;甚麼時刻挪用;』
* 爆炸:1先預備三張圖;2界說Bomb類;3在擊中仇敵坦克時放入炸彈Vector 4繪制
* 7: 仇敵坦克在我劃定規模挪動
* 8:仇敵坦克也能發槍彈
* 9: 當仇敵坦克擊中我的坦克,我的坦克消逝
*/
package mytank9;
import java.awt.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import java.util.*;
public class MyTankGame4 extends JFrame{
MyPanel mp = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
MyTankGame4 mytankgame1 = new MyTankGame4();
}
public MyTankGame4(){
mp = new MyPanel();
Thread t = new Thread(mp);
t.start();
this.add(mp);
// 注冊監聽
this.addKeyListener(mp);
this.setSize(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class MyPanel extends JPanel implements KeyListener,Runnable{
// 界說一個我的坦克
Hero hero = null;
// 界說仇敵的坦克
Vector<EnemyTank> ets = new Vector<EnemyTank>();
// 界說一個炸彈的聚集
Vector<Bomb> bombs = new Vector<Bomb>();
// 仇敵坦克若干
int enSize = 3;
//
// 界說三張圖片的圖片的切換,能力構成一顆炸彈
Image image1 = null;
Image image2 = null;
Image image3 = null;
// 結構
public MyPanel(){
hero = new Hero(100,100);
// 仇敵的坦克初始化
for(int i = 0; i <enSize; i++)
{
// 創立仇敵的坦克對象
EnemyTank et = new EnemyTank((i+1)*50, 0);
et.setColor(0);
et.setDirect(2);
// 啟動仇敵坦克
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();
}
// 初始化三張圖片
// 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"));
}
//從新paint
public void paint(Graphics g){
super.paint(g);
g.fillRect(0, 0, 400, 300);
// 畫出本身的坦克
if(hero.isLive==true)
{
this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);
}
// 從ss中掏出每顆槍彈,並繪制
for(int i = 0; i <hero.ss.size(); 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 < bombs.size();i++)
{
Bomb b = bombs.get(i);
if(b.life > 6)
{
g.drawImage(image1, b.x, b.y,30,30, this);
}else if(b.life>4)
{
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踢出去
if(b.life == 0)
{
bombs.remove(b);
}
}
// 畫出仇敵坦克
for(int i = 0 ; i < ets.size(); i++)
{
EnemyTank et = ets.get(i);
if(et.isLive)
{
this.drawTank(et.getX(), et.getY(), g,et.getDirect(), 0);
// 畫出仇敵槍彈
for(int j = 0; j < et.ss.size();j++)
{
Shot enemyShot = et.ss.get(j);
if(enemyShot.isLive)
{
g.draw3DRect(enemyShot.x, enemyShot.y, 1, 1, false);
}else{
// 仇敵坦逝世亡了
et.ss.remove(enemyShot);
}
}
}
}
}
// 仇敵槍彈能否擊我
public void hitMe()
{
// 掏出每個仇敵坦克
for(int i = 0; i < this.ets.size(); i++)
{
// 掏出仇敵坦克
EnemyTank et = ets.get(i);
if(et.isLive==true)
{
for(int j = 0; j < et.ss.size(); j++)
{
// 掏出槍彈
Shot enemyShot = et.ss.get(j);
if(enemyShot.isLive==true)
{
this.hitTank(enemyShot, hero);
}
}
}
}
}
// 我的槍彈能否擊中仇敵坦克
public void hitEnemyTank()
{
// 斷定能否擊中仇敵的坦克
for(int i = 0; i < hero.ss.size(); i++)
{
Shot myShot = hero.ss.get(i);
// 斷定槍彈能否有用
if(myShot.isLive==true)
{
// 掏出每個坦克與它斷定
for(int j = 0; j < ets.size(); j++)
{
EnemyTank et = ets.get(j);
if(et.isLive==true)
{
this.hitTank(myShot,et);
}
}
}
}
}
// 寫一個函數專門斷定槍彈能否擊中坦克
public void hitTank(Shot s, Tank et)
{
switch(et.direct)
{
// 假如仇敵坦克偏向是上或許是下
case 0:
case 2:
if(s.x>et.x&&s.x<et.x+20&&s.y>et.y&&s.y<et.y+30)
{
// 擊中逝世亡
s.isLive = false;
// 坦克逝世亡
et.isLive = false;
// 創立一顆炸彈,放入Vector
Bomb b = new Bomb(et.x, et.y);
bombs.add(b);
}
case 1:
case 3:
if(s.x>et.x&&s.x<et.x+30&&s.y>et.y&&s.y<et.y+20)
{
{
// 擊中逝世亡
s.isLive = false;
// 仇敵坦克逝世亡
et.isLive = false;
Bomb b = new Bomb(et.x, et.y);
bombs.add(b);
}
}
}
}
// 畫出坦克
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:
// 畫出右邊坦克
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);
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:
// 畫出下邊坦克
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+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 向下 d向右 w向上
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_W)
{
this.hero.setDirect(0);
this.hero.moveUP();
}else if(e.getKeyCode()==KeyEvent.VK_D)
{
this.hero.setDirect(1);
this.hero.moveRight();
}else if(e.getKeyCode()==KeyEvent.VK_S)
{
this.hero.setDirect(2);
this.hero.moveDown();
}
else if(e.getKeyCode()==KeyEvent.VK_A)
{
this.hero.setDirect(3);
this.hero.moveLeft();
}
if(e.getKeyCode()==KeyEvent.VK_J)
{
// 斷定玩家能否摁下J
// 開仗
if(this.hero.ss.size()<=4&&this.hero.isLive==true)
{
this.hero.shotEnemy();
}
}
// 必需從新繪制Panel
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
public void run(){
while(true)
{
try{
Thread.sleep(100);
}catch(Exception e)
{
e.printStackTrace();
}
this.hitEnemyTank();
// 函數斷定仇敵的槍彈能否擊中我
this.hitMe();
this.repaint();
}
}
}
5、測試後果
黃色為玩家,擊中玩家
仇敵發射槍彈
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。