您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“java如何實現(xiàn)坦克大戰(zhàn)”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“java如何實現(xiàn)坦克大戰(zhàn)”這篇文章吧。
環(huán)境要求:
操作系統(tǒng):Windows 10
JAVA虛擬機:JDK1.8以上
開發(fā)環(huán)境:Eclipse(4.5以上)
功能提示:
1.游戲要有圖形用戶界面,界面能夠反映游戲所有的細節(jié)。
2.界面中要有坦克,墻,樹林,河流。
3.界面中要有一個“家”,“家”被攻擊中則輸了游戲。
4.坦克分兩種,敵方和我方。
5.墻也分為兩種,可以穿透的普通墻,不可以穿透的鐵墻。
6.樹和河流均只有一種,樹林坦克可以通過。
7.坦克可以發(fā)射子彈,敵我方的子彈屬性一樣。
8.我方子彈可以殺死敵方坦克,敵方子彈也可以殺死我方坦克,但需要多槍子彈才可以殺死。
9.敵方之間不可以殺死對方。
10.子彈擊中坦克要有爆炸,但擊中墻不能爆炸。
11.我方可以吃血包增加生命。
12.游戲可以暫停,重新開始,游戲幫助等功能。
13.游戲級別分別為:級別1、級別2、級別3、級別4。
需求分析:
設(shè)計一個圖形用戶界面,將所有游戲的元素都能在此用于界面上表現(xiàn)出來,界面能夠接受用戶的操作,具有人機交互功能。用戶可以選擇重新開始游戲,退出游戲,暫停游戲和查找游戲幫助。
界面中包含坦克,樹,河流,阻擋墻和游戲用戶所要保護的“家”。
坦克:坦克分為兩種,敵方坦克和用戶控制的坦克。用戶方和敵方坦克均可以發(fā)射子彈,可以改變路徑的行走,且在行走過程中遇到墻等阻礙物和游戲邊界時要改變方向,而不能一直頂著障礙物不放。坦克之間不能穿越,碰撞到后自動調(diào)換方向。
樹:界面中要包括樹林,作為遮掩物體和修飾物體,以便增加游戲的元素,使得游戲更加貼切人性化。樹的數(shù)目不限,以游戲整體界面清晰美觀來決定數(shù)目。
河流:界面中要包括河流,河流作用與樹林相同,同樣河流的數(shù)目不限,以游戲界面整體美觀度來決定數(shù)目。
墻:墻體分為兩種,普通的墻和鐵墻,普通的墻在受到子彈襲擊時會損壞,而鐵墻可以阻礙子彈的穿越。兩方的坦克均不能穿越兩種墻體,但都可以摧毀普通墻體。普通墻體的數(shù)目配合其他元素合理安排,鐵墻則不宜過多,不然游戲難度太低甚至因為坦克不能穿越鐵墻而使得游戲無法進行下去。
“家”:用戶方除了有一輛自己的坦克外還有一個要保護的家,家由普通墻體包圍,家受到子彈攻擊后游戲立即結(jié)束,用戶方則輸了本局游戲。
子彈:子彈可以由敵方和用戶方發(fā)射,且發(fā)射出去的子彈可以直線移動,直到碰到障礙物就消失,子彈可以穿越樹林和河流。敵方坦克受到一顆子彈攻擊會爆炸從而導致死亡,死亡后坦克消失。用戶方受到子彈攻擊后會減少壽命,且受到四次攻擊則死亡,此時如還有敵方坦克存在,則用戶方輸?shù)舯敬斡螒颉?/p>
爆炸:當子彈射擊到坦克身上時,要產(chǎn)生爆炸效果。
方向:坦克和子彈都有方向,可以選擇上下左右四個方向,且子彈的方向從屬于坦克的方向。
效果如圖所示:
主界面代碼如下:
public TankClient() { // printable = false; // 創(chuàng)建菜單及菜單選項 jmb = new MenuBar(); jm1 = new Menu("游戲"); jm2 = new Menu("暫停/繼續(xù)"); jm3 = new Menu("幫助"); jm4 = new Menu("游戲級別"); jm1.setFont(new Font("TimesRoman", Font.BOLD, 15));// 設(shè)置菜單顯示的字體 jm2.setFont(new Font("TimesRoman", Font.BOLD, 15));// 設(shè)置菜單顯示的字體 jm3.setFont(new Font("TimesRoman", Font.BOLD, 15));// 設(shè)置菜單顯示的字體 jm4.setFont(new Font("TimesRoman", Font.BOLD, 15));// 設(shè)置菜單顯示的字體 jmi1 = new MenuItem("開始新游戲"); jmi2 = new MenuItem("退出"); jmi3 = new MenuItem("暫停"); jmi4 = new MenuItem("繼續(xù)"); jmi5 = new MenuItem("游戲說明"); jmi6 = new MenuItem("級別1"); jmi7 = new MenuItem("級別2"); jmi8 = new MenuItem("級別3"); jmi9 = new MenuItem("級別4"); jmi1.setFont(new Font("TimesRoman", Font.BOLD, 15)); jmi2.setFont(new Font("TimesRoman", Font.BOLD, 15)); jmi3.setFont(new Font("TimesRoman", Font.BOLD, 15)); jmi4.setFont(new Font("TimesRoman", Font.BOLD, 15)); jmi5.setFont(new Font("TimesRoman", Font.BOLD, 15)); jm1.add(jmi1); jm1.add(jmi2); jm2.add(jmi3); jm2.add(jmi4); jm3.add(jmi5); jm4.add(jmi6); jm4.add(jmi7); jm4.add(jmi8); jm4.add(jmi9); jmb.add(jm1); jmb.add(jm2); jmb.add(jm4); jmb.add(jm3); jmi1.addActionListener(this); jmi1.setActionCommand("NewGame"); jmi2.addActionListener(this); jmi2.setActionCommand("Exit"); jmi3.addActionListener(this); jmi3.setActionCommand("Stop"); jmi4.addActionListener(this); jmi4.setActionCommand("Continue"); jmi5.addActionListener(this); jmi5.setActionCommand("help"); jmi6.addActionListener(this); jmi6.setActionCommand("level1"); jmi7.addActionListener(this); jmi7.setActionCommand("level2"); jmi8.addActionListener(this); jmi8.setActionCommand("level3"); jmi9.addActionListener(this); jmi9.setActionCommand("level4"); this.setMenuBar(jmb);// 菜單Bar放到JFrame上 this.setVisible(true); for (int i = 0; i < 10; i++) { // 家的格局 if (i < 4) homeWall.add(new CommonWall(350, 580 - 21 * i, this)); else if (i < 7) homeWall.add(new CommonWall(372 + 22 * (i - 4), 517, this)); else homeWall.add(new CommonWall(416, 538 + (i - 7) * 21, this)); } for (int i = 0; i < 32; i++) { if (i < 16) { otherWall.add(new CommonWall(220 + 20 * i, 300, this)); // 普通墻布局 otherWall.add(new CommonWall(500 + 20 * i, 180, this)); otherWall.add(new CommonWall(200, 400 + 20 * i, this)); otherWall.add(new CommonWall(500, 400 + 20 * i, this)); } else if (i < 32) { otherWall.add(new CommonWall(220 + 20 * (i - 16), 320, this)); otherWall.add(new CommonWall(500 + 20 * (i - 16), 220, this)); otherWall.add(new CommonWall(220, 400 + 20 * (i - 16), this)); otherWall.add(new CommonWall(520, 400 + 20 * (i - 16), this)); } } for (int i = 0; i < 20; i++) { // 金屬墻布局 if (i < 10) { metalWall.add(new MetalWall(140 + 30 * i, 150, this)); metalWall.add(new MetalWall(600, 400 + 20 * (i), this)); } else if (i < 20) metalWall.add(new MetalWall(140 + 30 * (i - 10), 180, this)); else metalWall.add(new MetalWall(500 + 30 * (i - 10), 160, this)); } for (int i = 0; i < 4; i++) { // 樹的布局 if (i < 4) { trees.add(new Tree(0 + 30 * i, 360, this)); trees.add(new Tree(220 + 30 * i, 360, this)); trees.add(new Tree(440 + 30 * i, 360, this)); trees.add(new Tree(660 + 30 * i, 360, this)); } } theRiver.add(new River(85, 100, this)); for (int i = 0; i < 20; i++) { // 初始化20輛坦克 if (i < 9) // 設(shè)置坦克出現(xiàn)的位置 tanks.add(new Tank(150 + 70 * i, 40, false, Direction.D, this)); else if (i < 15) tanks.add(new Tank(700, 140 + 50 * (i - 6), false, Direction.D, this)); else tanks .add(new Tank(10, 50 * (i - 12), false, Direction.D, this)); } this.setSize(Fram_width, Fram_length); // 設(shè)置界面大小 this.setLocation(280, 50); // 設(shè)置界面出現(xiàn)的位置 this .setTitle("坦克大戰(zhàn)——(重新開始:R鍵 開火:F鍵)"); this.addWindowListener(new WindowAdapter() { // 窗口監(jiān)聽關(guān)閉 public void windowClosing(WindowEvent e) { System.exit(0); } }); this.setResizable(false); this.setBackground(Color.GREEN); this.setVisible(true); this.addKeyListener(new KeyMonitor());// 鍵盤監(jiān)聽 new Thread(new PaintThread()).start(); // 線程啟動 } public static void main(String[] args) { new TankClient(); // 實例化 }
以上是“java如何實現(xiàn)坦克大戰(zhàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。