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