Ubuntu运行坦克大战
?? stackoverflow看到那個(gè)java處處運(yùn)行的笑話(huà),一點(diǎn)都不好笑。
?? 運(yùn)行環(huán)境ubuntu12。代碼參照馬士兵老師,后面再自己完善的一些小功能。
?? 運(yùn)行 ubuntu,進(jìn)行vsftpd,ssh,jdk等等一系列的安裝和配置。
?? 本來(lái)是寫(xiě)實(shí)驗(yàn)報(bào)告的,當(dāng)是對(duì)jse的復(fù)習(xí)把整個(gè)大致的流程重新寫(xiě)了一次。
1.
使用awt這個(gè)抽象窗口工具,先畫(huà)出基本的邊框,再畫(huà)出一個(gè)小方塊,對(duì)鍵盤(pán)進(jìn)行監(jiān)聽(tīng),上下左右按下時(shí)分別更,改了小方塊的坐標(biāo),新建一個(gè)線(xiàn)程類(lèi)實(shí)現(xiàn)runnable接口,鍵盤(pán)一旦敲入便啟動(dòng)線(xiàn)程,repaint畫(huà)布,調(diào)用repaint()方法時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用update()方法,update方法為的是將背景和圖片重畫(huà)。
?
2.
新建坦克類(lèi),用枚舉類(lèi)型存入八個(gè)方向,斜方向還有上下左右。還有停止。主要增加鍵盤(pán)按鈕的抬起和按下。
?
3.
新建一個(gè)炮彈類(lèi),cannon,其實(shí)和坦克一個(gè)道理 ,按下z鍵之后炮彈沿著下方向發(fā)射,就是線(xiàn)程啟動(dòng)之后不停的repaint。
4.
畫(huà)出炮管,只要根據(jù)紅色方塊的坐標(biāo)和方向,將坦克的方向作為一個(gè)參數(shù)傳入大炮cannon類(lèi),這樣發(fā)出的大炮的方向就和坦克方向一致了。
5。
如果為了不讓讓炮彈連發(fā),可以在鍵盤(pán)抬起的時(shí)候再發(fā)射,左上角
g.drawString("Cannon Number:"+cannons.size(), 20, 50);
在左上角記錄發(fā)射過(guò)的炮彈的數(shù)目。用個(gè)集合arraylist存取new出來(lái)的炮彈對(duì)象即可,拿到arraylist的size即為坦克發(fā)射炮彈數(shù)目。
6.
之前的坦克是可以穿過(guò)窗口,因?yàn)樽鴺?biāo)沒(méi)有限制,當(dāng)坦克靠觸碰到窗口后,把坦克的坐標(biāo)定格在窗口的坐標(biāo)減去坦克自身的長(zhǎng)寬即可。
還有炮彈的數(shù)目不是一直計(jì)算,當(dāng)炮彈越界后應(yīng)當(dāng)不用計(jì)算,所以添加坐標(biāo)判斷,remove掉炮彈對(duì)象。
敵人坦克顏色應(yīng)該和我方區(qū)別,這樣在類(lèi)中可以加入一個(gè)boolean變量,再傳入構(gòu)造方法中,根據(jù)這個(gè)變量畫(huà)出不同顏色。
炮彈打到坦克消失,當(dāng)時(shí)想了好久,沒(méi)想到有個(gè)封裝的很好的touch方法,要讓坦克和炮彈同時(shí)消失,那就要多一個(gè)變量,live,如果變量為false,在paint的時(shí)候就將其remove掉。
???
<span style="font-size:18px;">public Rectangle touch(){return new Rectangle(x,y,length,width); }public boolean whetherhit(Tank tank){if(this.touch().intersects(tank.touch())&& tank.isLive()){tank.setLive(false);this.setLive(false);return true;}return false;}</span>?
7.
添加explore類(lèi),爆炸,boom!!!
爆炸效果的模擬,可以用從小到大再變小的圓模擬,就在碰撞的時(shí)候,new出explore,畫(huà)出不同的圓圈。
?
8.
New出10輛敵方坦克,
新建wall墻類(lèi),同樣利用碰撞,敵方不能穿墻,這里有個(gè)很美妙的算法,單純寫(xiě)碰撞后,坦克就貼在墻上不動(dòng)了,所以我們要記錄撞墻前一刻的坐標(biāo),撞上后進(jìn)行返回,
分配隨機(jī)參數(shù),使得坦克隨機(jī)發(fā)炮。
而邊框的話(huà)已經(jīng)限制了坐標(biāo),所以隨機(jī)改變坐標(biāo)之后是不會(huì)粘在邊框上的。
而讓坦克間不相互撞上,和撞墻一個(gè)道理,只要讓坦克之間進(jìn)行碰撞的檢測(cè)即可,遍歷一下所有的坦克。??
<span style="font-size:18px;">public boolean tanktank(List<Tank> tanks ){for(int i = 0; i<tanks.size();i++){Tank t = tanks.get(i);if(this != t){if(this.touch().intersects(t.touch())&& t.isLive() && this.live){//this.fantan();t.fantan();return true;}} }returnfalse;}</span>?
9。
還記得小時(shí)候紅白機(jī)的坦克有很強(qiáng)的炮彈還有不止一條命。我們給自己的坦克添加血條blood這個(gè)變量。定義為100,中一彈扣10點(diǎn)血。
絕招的話(huà),因?yàn)榭梢猿藗€(gè)方向放出炮彈,所以直接讓它一次性發(fā)出。
10.
扣血之后,一旦死掉就不好玩了,可以加一個(gè)禮物,吃完補(bǔ)血,畫(huà)出一個(gè)小方塊,利用touch方法,吃到之后blood變回100.
改進(jìn):
死掉之后可以F1可以原地復(fù)活。
同時(shí)增加關(guān)數(shù)這個(gè)變量,一共三關(guān),同時(shí),每加一關(guān),增加一輛坦克,增加難度。
當(dāng)敵方全消滅時(shí),把所有炮彈去除,進(jìn)入下一關(guān)。
三關(guān)結(jié)束后出現(xiàn)Victor,按F2退出游戲。
死掉后:
勝利!
11.
最終的圖片版。其實(shí)就是在原有圖形的基礎(chǔ)上覆蓋上圖片。
g.drawImage(m.get("ld"), x, y,null);
由于圖片素材大小切得不好,經(jīng)過(guò)細(xì)節(jié)的一些調(diào)整還是可以調(diào)節(jié)的比較好的。
?
平臺(tái)只是取巧罷了,當(dāng)時(shí)主要還是學(xué)習(xí)jse的很多東西。雖然這不是自己寫(xiě)的東西,但是確實(shí)自己一路敲過(guò)來(lái)的,改進(jìn)之后,對(duì)編程的喜愛(ài)又多了一大截。
之后懂得圖形界面的使用之后便自己寫(xiě)個(gè)俄羅斯方塊了。
最后是失敗了,思路錯(cuò)了。。。。
?項(xiàng)目結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的Ubuntu运行坦克大战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【软件工程导论】期末复习重点
- 下一篇: Ubuntu安装配置tftp服务器