java實現(xiàn)坦克大戰(zhàn)課程設(shè)計_第1頁
java實現(xiàn)坦克大戰(zhàn)課程設(shè)計_第2頁
java實現(xiàn)坦克大戰(zhàn)課程設(shè)計_第3頁
java實現(xiàn)坦克大戰(zhàn)課程設(shè)計_第4頁
java實現(xiàn)坦克大戰(zhàn)課程設(shè)計_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、 基于java實現(xiàn)電子時鐘 Java實現(xiàn)坦克大戰(zhàn)小游戲摘要Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計語言。我的課程設(shè)計是用java來做一個簡單的坦克大戰(zhàn)小游戲。我將這個程序細分了多個部分,每個部分都建了獨立的類,比如:坦克的模型類,河道,樹和坦克方向等等。之所以將之細分,是遵循了java的萬事萬物皆對象的原理。在實現(xiàn)每個類時,最簡單但也是最繁瑣就是建立界面與實例化坦克,因為這牽扯了界面布局,監(jiān)聽的建立等;而有一些類,比如;河道、墻、坦克,這些類這可以依樣畫葫蘆的編寫。在編寫過程,借鑒了他人的一些圖片模型,實現(xiàn)的功能也并不是和經(jīng)典的FC坦克大戰(zhàn)相同,但是每個坦克之間的互動還是實現(xiàn)了

2、的。關(guān)鍵詞:萬事萬物皆對象 界面布局 坦克之間的互動USE JAVA TO REALIZE BATTLE CITY MINI-GAMEABSTRACTJava is a object oriented program design language what can compose cross platform application software. My curriculum design is using JAVA language to make a simple small game called Tank Battle. I break down this program int

3、o multiple parts, each part is to establish an independent class, such as: Tank Model class, River Course class, Tree class, The Direction of Tank class and so on. The reason divides into multiple parts, is because follow the principle of JAVA that everything is an object. When implements every clas

4、s, the most simple but also the most troublesome is build interface and instantiate Tank class, because it is involved of the interface layout, monitoring the establishment. While there are some classes, such as: River Course class, Wall class and Tank class, can write like stick closely to the patt

5、ern given.In the preparation process, I refer some pictures of models of others, the function of the retaliate isnt like FC Tank Battle, but the interaction between ach tank is realized. Key words: everything is an object, the interface layout, the interaction between each tank目 錄1 課程目的與要求11、1課程目標(biāo)11

6、、2 課程的實現(xiàn)環(huán)境12 概要設(shè)計23 詳細設(shè)計34 測試結(jié)果與心得體會5 參考文獻附錄源程序代碼3 1 課程的目的與要求1、1課程目標(biāo)JAVA程序設(shè)計的設(shè)計目的是加深對理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生較系統(tǒng)地掌握程序設(shè)計及其在網(wǎng)絡(luò)開發(fā)中的廣泛應(yīng)用,基本方法及技巧,為學(xué)生綜合運用所學(xué)知識,利用軟件工程為基礎(chǔ)進行軟件開發(fā)、并在實踐應(yīng)用方面打下一定基礎(chǔ)。利用java實現(xiàn)坦克大戰(zhàn)小游戲。1、2課程的實現(xiàn)環(huán)境硬件要求能運行Windows 9.X操作系統(tǒng)的微機系統(tǒng)。JAVA程序設(shè)計語言及相應(yīng)的集成開發(fā)環(huán)境,J2SDK和ECLIPSE開發(fā)工具。利用java的一些類和接口,詳細可在詳細設(shè)計中見到。

7、2概要設(shè)計2、1自定義類說明類名:Tank;作用:實現(xiàn)玩家能夠操縱己方坦克繼承的父類:無; 實現(xiàn)的接口:無;主要的方法:draw();move();一些鍵盤監(jiān)聽。類名:Missile作用:對所有的坦克的子彈進行設(shè)置繼承的父類:無; 實現(xiàn)的接口:無;主要的方法:draw();move();碰到不同物體的不同處理。類名:Blood作用:實例化坦克的血條繼承的父類:無; 實現(xiàn)的接口:無;主要的方法:draw();move();類名:Wall作用:實例化墻繼承的父類:無; 實現(xiàn)的接口:無;主要的方法:draw();類名:TankClient作用:該游戲的界面布局及各類的實例化繼承的父類:Frame;

8、實現(xiàn)的接口:Runnable;主要的方法:paint();update();lauchFrame();PaintThread();KeyMonitor();3詳細設(shè)計以下將各類的方法以表格的形式詳細敘述:類名方法方法的作用TankDraw()設(shè)置坦克的形狀,及隨血條的變化而發(fā)生的外觀變化Move()控制坦克的移動,玩家可操縱自己的坦克,而電腦操控的坦克則隨機移動(碰到墻會反方向走)Fire()用了方法重載,區(qū)分玩家坦克與電腦坦克的子彈的不同類名方法方法的作用MissileDraw()設(shè)置子彈的外觀Move()設(shè)置子彈的運行軌跡hitTank();hitTanks;hitWall子彈碰到三種不同

9、物體的不同結(jié)果類名方法方法的作用BloodDraw()設(shè)置血條的位置及外觀Move()使得血條跟隨坦克移動類名方法方法的作用ExplodeDraw();循環(huán)的方法將對應(yīng)圖片覆蓋在對象上類名方法方法的作用WallDraw()設(shè)置墻的形狀類名方法方法的作用TankClientPaint()指明子彈、爆炸、坦克的數(shù)量以及坦克的生命值Update()刷新界面LauchFrame()壓面板,控件PaintThread()線程控制KeyMonitor()鍵盤監(jiān)聽4測試結(jié)果與心得體會4、1程序運行情況當(dāng)程序正常運行的時候,它能清晰的顯示游戲界面。玩家可以通過鍵盤方向鍵控制紅色的坦克移動,通過鍵盤A鍵控制子彈

10、發(fā)射,如下圖4、1:圖4、14、2程序的異常處理當(dāng)線程在活動之前或活動期間處于正在等待、休眠或占用狀態(tài)且該線程被中斷時,拋出該異常。有時候,一種方法可能希望測試當(dāng)前線程是否已被中斷,如果已被中斷,則立即拋出此異常。利用trycatch來捕獲出現(xiàn)的異常。try Thread.sleep(1000); /線程暫停一秒(1000毫秒) catch (InterruptedException ex) ex.printStackTrace(); /輸出出錯信息 4、3心得體會本次Java課程設(shè)計我的題目是時鐘,題目不算難,但我做的很艱苦。主要就是動手能力太差,理論知識掌握的不全面,自以為會不少,但真做起

11、來,卻不知道從哪下手了。又回去溫習(xí)理論知識,請教老師,上網(wǎng)查資料,忙的不亦樂乎。不過經(jīng)過努力總算是做出來了,還通過此次課程設(shè)計,將我本學(xué)期所學(xué)的JAVA知識得到鞏固和應(yīng)用。在設(shè)計的過程中我遇到的很多問題,在老師的幫助和自己的思考下還是很好的完成了。這此課程設(shè)計我懂得了寫程序不能脫離實際,只憑主觀辦事,要努力拓寬知識面,拓展思維。 事情就是如此,努力代表收獲。通過這次課程設(shè)計,我才真正領(lǐng)悟到“艱苦奮斗”這一詞的真正含義,我才感受到早期電子設(shè)計者為現(xiàn)代的社會付出。設(shè)計確實有些辛苦,但苦中也有樂,在如今單一的理論學(xué)習(xí)中,很少有機會能有實踐的機會,但現(xiàn)在可以,這些天的設(shè)計中得到的東西卻不比理

12、論課上得到的少多少,我感覺我和Java的距離更加近了;我想說,確實很累,但當(dāng)我看到自己所做的成果時,心中也不免產(chǎn)生興奮; 學(xué)習(xí)有成果了么。 對Java編程有了一個基本的了解。這些天溫習(xí)的內(nèi)容越多,敲得代碼越多,自己的學(xué)習(xí)積極性也越在提高,感覺也越充實。越來越發(fā)現(xiàn)現(xiàn)在學(xué)習(xí)的只是Java的基礎(chǔ),但涉及的面還是很廣泛的,這些都為以后進一步學(xué)習(xí)Java的高級特性打下了扎實的基礎(chǔ)。隨著課程難度的慢慢加強,今后遇到的困難也必將會越來越多,但我相信自己一定能做好這些的。 在本次Java課程設(shè)計中,我要非常感謝我的指導(dǎo)老師丁老師,不但在課堂上教給了我很多的Java的編程知識,編程

13、思想,而且在這次課程設(shè)計中更教會了我動手的能力,真正的編出了自己的東西,還要感謝我的同學(xué),他們在我遇到困難時也給了我很多幫助。 參考文獻1 David Flanagan編. Java 實例技術(shù)手冊 附錄源程序代碼:/Tank類package com.bjsxt.tank;import java.awt.*;import java.awt.event.*;import java.util.*;public class Tank public static final int XSPEED = 5;public static final int Y

14、SPEED = 5;public static final int WIDTH = 30;public static final int HEIGHT = 30;private boolean live = true;private BloodBar bb = new BloodBar();private int life = 100;TankClient tc;private boolean good;private int x, y;private int oldX, oldY;private static Random r = new Random();private boolean b

15、L=false, bU=false, bR=false, bD = false;private Direction dir = Direction.STOP;private Direction ptDir = Direction.D;private int step = r.nextInt(12) + 3;public Tank(int x, int y, boolean good) this.x = x;this.y = y;this.oldX = x;this.oldY = y;this.good = good;public Tank(int x, int y, boolean good,

16、 Direction dir, TankClient tc) this(x, y, good);this.dir = dir;this.tc = tc;public void draw(Graphics g) if(!live) if(!good) tc.tanks.remove(this);return;Color c = g.getColor();if(good) g.setColor(Color.RED);else g.setColor(Color.BLUE);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);if(good) bb.draw(g

17、);switch(ptDir) case L:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT/2);break;case LU:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y);break;case U:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y);break;case RU:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGH

18、T/2, x + Tank.WIDTH, y);break;case R:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT/2);break;case RD:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT);break;case D:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y + Ta

19、nk.HEIGHT);break;case LD:g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT);break;move();void move() this.oldX = x;this.oldY = y;switch(dir) case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPE

20、ED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;if(this.dir != Direction.STOP) this.ptDir = this.dir;if(x < 0) x = 0;if(y < 30) y = 30;if(x + Tank.WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - Tank.WI

21、DTH;if(y + Tank.HEIGHT > TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGHT;if(!good) Direction dirs = Direction.values();if(step = 0) step = r.nextInt(12) + 3;int rn = r.nextInt(dirs.length);dir = dirsrn;step -;if(r.nextInt(40) > 38) this.fire();private void stay() x = oldX;y =

22、oldY;public void keyPressed(KeyEvent e) int key = e.getKeyCode();switch(key) case KeyEvent.VK_F2 :if(!this.live) this.live = true;this.life = 100;break;case KeyEvent.VK_LEFT :bL = true;break;case KeyEvent.VK_UP :bU = true;break;case KeyEvent.VK_RIGHT :bR = true;break;case KeyEvent.VK_DOWN :bD = true

23、;break;locateDirection();void locateDirection() if(bL && !bU && !bR && !bD) dir = Direction.L;else if(bL && bU && !bR && !bD) dir = Direction.LU;else if(!bL && bU && !bR && !bD) dir = Direction.U;else if(!bL && bU &&

24、amp; bR && !bD) dir = Direction.RU;else if(!bL && !bU && bR && !bD) dir = Direction.R;else if(!bL && !bU && bR && bD) dir = Direction.RD;else if(!bL && !bU && !bR && bD) dir = Direction.D;else if(bL && !bU &&

25、amp; !bR && bD) dir = Direction.LD;else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;public void keyReleased(KeyEvent e) int key = e.getKeyCode();switch(key) case KeyEvent.VK_CONTROL:fire();break;case KeyEvent.VK_LEFT :bL = false;break;case KeyEvent.VK_UP :bU = f

26、alse;break;case KeyEvent.VK_RIGHT :bR = false;break;case KeyEvent.VK_DOWN :bD = false;break;case KeyEvent.VK_A :superFire();break;locateDirection();public Missile fire() if(!live) return null;int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;Missile m

27、= new Missile(x, y, good, ptDir, this.tc);tc.missiles.add(m);return m;public Missile fire(Direction dir) if(!live) return null;int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;Missile m = new Missile(x, y, good, dir, this.tc);tc.missiles.add(m);return

28、 m;public Rectangle getRect() return new Rectangle(x, y, WIDTH, HEIGHT);public boolean isLive() return live;public void setLive(boolean live) this.live = live;public boolean isGood() return good;/* * 撞墻 * param w 被撞的墻 * return 撞上了返回true,否則false */public boolean collidesWithWall(Wall w) if(this.live

29、&& this.getRect().intersects(w.getRect() this.stay();return true;return false;public boolean collidesWithTanks(java.util.List<Tank> tanks) for(int i=0; i<tanks.size(); i+) Tank t = tanks.get(i);if(this != t) if(this.live && t.isLive() && this.getRect().intersects(t.g

30、etRect() this.stay();t.stay();return true;return false;private void superFire() Direction dirs = Direction.values();for(int i=0; i<8; i+) fire(dirsi);public int getLife() return life;public void setLife(int life) this.life = life;private class BloodBar public void draw(Graphics g) Color c = g.get

31、Color();g.setColor(Color.RED);g.drawRect(x, y-10, WIDTH, 10);int w = WIDTH * life/100 ;g.fillRect(x, y-10, w, 10);g.setColor(c);public boolean eat(Blood b) if(this.live && b.isLive() && this.getRect().intersects(b.getRect() this.life = 100;b.setLive(false);return true;return false;/m

32、issile類package com.bjsxt.tank;import java.awt.*;import java.util.List;public class Missile public static final int XSPEED = 10;public static final int YSPEED = 10;public static final int WIDTH = 10;public static final int HEIGHT = 10;int x, y;Direction dir;private boolean good;private boolean live =

33、 true;private TankClient tc;public Missile(int x, int y, Direction dir) this.x = x;this.y = y;this.dir = dir;public Missile(int x, int y, boolean good, Direction dir, TankClient tc) this(x, y, dir);this.good = good;this.tc = tc;public void draw(Graphics g) if(!live) tc.missiles.remove(this);return;C

34、olor c = g.getColor();if(good) g.setColor(Color.RED); else g.setColor(Color.BLACK);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);move();private void move() switch(dir) case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R

35、:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;if(x < 0 | y < 0 | x > TankClient.GAME_WIDTH | y > TankClient.GAME_HEIGHT) live = false;public boolean isLive() return live;public Rectangle getRect() r

36、eturn new Rectangle(x, y, WIDTH, HEIGHT);public boolean hitTank(Tank t) if(this.live && this.getRect().intersects(t.getRect() && t.isLive() && this.good != t.isGood() if(t.isGood() t.setLife(t.getLife()-20);if(t.getLife() <= 0) t.setLive(false); else t.setLive(false);this.

37、live = false;Explode e = new Explode(x, y, tc);tc.explodes.add(e);return true;return false;public boolean hitTanks(List<Tank> tanks) for(int i=0; i<tanks.size(); i+) if(hitTank(tanks.get(i) return true;return false;public boolean hitWall(Wall w) if(this.live && this.getRect().inters

38、ects(w.getRect() this.live = false;return true;return false;/blood類package com.bjsxt.tank;import java.awt.*;public class Blood int x, y, w, h;TankClient tc; int step = 0;private boolean live = true;/指明血塊運動的軌跡,由pos中各個點構(gòu)成private int pos = 350, 300, 360, 300, 375, 275, 400, 200, 360, 270, 365, 290, 340

39、, 280 ;public Blood() x = pos00;y = pos01;w = h = 15;public void draw(Graphics g) if(!live) return;Color c = g.getColor();g.setColor(Color.MAGENTA);g.fillRect(x, y, w, h);g.setColor(c);move();private void move() step +;if(step = pos.length)step = 0;x = posstep0;y = posstep1;public Rectangle getRect(

40、) return new Rectangle(x, y, w , h);public boolean isLive() return live;public void setLive(boolean live) this.live = live;/explode類package com.bjsxt.tank;import java.awt.*;public class Explode int x, y;private boolean live = true;private TankClient tc ;private static Toolkit tk = Toolkit.getDefault

41、Toolkit();private static Image imgs = tk.getImage(Explode.class.getClassLoader().getResource("images/0.gif"),tk.getImage(Explode.class.getClassLoader().getResource("images/1.gif"),tk.getImage(Explode.class.getClassLoader().getResource("images/2.gif"),tk.getImage(Explode

42、.class.getClassLoader().getResource("images/3.gif"),tk.getImage(Explode.class.getClassLoader().getResource("images/4.gif"),tk.getImage(Explode.class.getClassLoader().getResource("images/5.gif"),tk.getImage(Explode.class.getClassLoader().getResource("images/6.gif&qu

43、ot;),tk.getImage(Explode.class.getClassLoader().getResource("images/7.gif"),tk.getImage(Explode.class.getClassLoader().getResource("images/8.gif"),tk.getImage(Explode.class.getClassLoader().getResource("images/9.gif"),tk.getImage(Explode.class.getClassLoader().getResour

44、ce("images/10.gif");int step = 0;private static boolean init = false;public Explode(int x, int y, TankClient tc) this.x = x;this.y = y;this.tc = tc;public void draw(Graphics g) if(!init) for (int i = 0; i < imgs.length; i+) g.drawImage(imgsi, -100, -100, null);init = true;if(!live) tc.e

45、xplodes.remove(this);return;if(step = imgs.length) live = false;step = 0;return;g.drawImage(imgsstep, x, y, null);step +;/wall類package com.bjsxt.tank;import java.awt.*;public class Wall int x, y, w, h;TankClient tc ;public Wall(int x, int y, int w, int h, TankClient tc) this.x = x;this.y = y;this.w

46、= w;this.h = h;this.tc = tc;public void draw(Graphics g) Color c = g.getColor();g.setColor(Color.DARK_GRAY);g.fillRect(x, y, w, h);g.setColor(c);public Rectangle getRect() return new Rectangle(x, y, w, h);/tankclient類package com.bjsxt.tank;import java.awt.*;import java.awt.event.*;import java.util.L

47、ist;import java.util.ArrayList;/* * 這個類的作用是坦克游戲的主窗口 * author mashibing * */public class TankClient extends Frame /* * 整個坦克游戲的寬度 */public static final int GAME_WIDTH = 800;public static final int GAME_HEIGHT = 600;Tank myTank = new Tank(50, 50, true, Direction.STOP, this);Wall w1 = new Wall(100, 200,

48、 20, 150, this), w2 = new Wall(300, 100, 300, 20, this);List<Explode> explodes = new ArrayList<Explode>();List<Missile> missiles = new ArrayList<Missile>();List<Tank> tanks = new ArrayList<Tank>();Image offScreenImage = null;Blood b = new Blood();public void paint

49、(Graphics g) /* * 指明子彈-爆炸-坦克的數(shù)量 * 以及坦克的生命值 */g.drawString("missiles count:" + missiles.size(), 10, 50);g.drawString("explodes count:" + explodes.size(), 10, 70);g.drawString("tanks count:" + tanks.size(), 10, 90);g.drawString("tanks life:" + myTank.getLife(), 10, 110);if(tanks.size() <= 0) for(int i=0; i<5; i+) tanks.add(new Tank(50 + 40*(i+1), 50, false, Direction.D, this);for(int i=0; i<missiles.size(); i+) Missile m = missiles.get(i);m.hitTanks(ta

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論