日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java坦克大战Summary

發布時間:2023/12/31 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java坦克大战Summary 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(由于作者本人水平有限,如有錯誤還請大家指出)

  • 畫我方坦克 :JFrame是畫框,Panel是畫板,paint(Graphics g)是畫筆。

    • JFrame中設置的大小是包括畫板和窗口共同的大小

    • TankGame的構造器中初始化MyPanel,MyPanel的構造器中初始化Hero,一環扣一環

    • 何時調用paint方法:

    • 組件第一次在屏幕上顯示時程序自動調用

    • repaint方法被調用

    • 窗口大小發生變化

  • 按鍵控制我方坦克移動:Java 的事件控---委派時間模型

    • 按鍵移動即改變方向加坐標改變

  • 畫出敵人坦克:用Vector保存(多個,有各自生命周期)

  • 按下J鍵 我方發射子彈:由于子彈有各自生命周期,每發射一顆子彈就是一個線程。shot類相當于線程數據源,由hero調用線程并發射,在MyPanel判斷是否要發射。

    由于hreo可以發射子彈 故畫板上應畫出子彈動態射擊效果,所以應不停重繪面板---run方法可實現循環的效果---故把MyPanel做成一個線程---在TankGame的構造器中啟動。

    • run方法可實現循環的效果

    • 線程的使用,一般也要注意該何時終止(這個項目中重繪卻不用終止)

  • 敵方坦克也能發射子彈:給每個敵方坦克配備多顆子彈,用Vector保存。子彈和坦克共存亡,初始化敵方坦克時也初始化子彈,畫敵方坦克時也畫子彈。【可優化的是,就算坦克消亡,子彈仍可飛完剩下的路程】

  • 我方子彈擊中敵方坦克時 敵方坦克和我方子彈消失,能做出爆炸效果更好:何為被擊中---我方子彈在敵方坦克區域內,由于這個方法會改變顯示的效果---把這個方法放在run方法中調用,判斷是否有被擊中的,則遍歷敵方坦克 一個一個判斷。

    做出爆炸效果:爆炸效果即為三張圖片切換九次,定義Bomb類確定爆炸的位置 并用“生命值”控制圖片的切換以做出更好的爆炸效果。在坦克被擊中處設置一顆炸彈 放入炸彈集合,并在重繪面板時畫出來

    • 為什么用Vector存放炸彈,而不是讓炸彈一顆一顆的存在---防止同時射中多個坦克,因為用炸彈集合就是 擊中一個坦克就放一顆炸彈到炸彈集合 然后畫的時候再依次取出畫

    • 敵方坦克被擊中不僅要把生命值設為false,還要從坦克集合中移除,不然坦克還在那兒 只是沒畫出來

    • 每變化一些功能,就要看畫出來的效果有什么變化,即paint方法中的變化

    • 怎樣考慮將一個變量設置為全局還是局部:由于一個類中多個方法都要用到該變量 則設置為全局變量

  • 敵方坦克自由移動:由于要能不停移動---做成線程,即Enemy繼承Runnable,并在run方法中讓坦克移動。在初始化敵方坦克時啟動線程

  • 控制坦克移動范圍:在移動的時候 判斷下一步還能移動嗎,直接在Tank父類中根據移動方向的不同控制

  • 我方坦克發射的子彈消亡后才能再發子彈:按下J鍵時判斷 有無子彈存在(第一次發射)、子彈是否銷毀

  • 我方坦克最多同時發射規定顆子彈:由于是多顆故放在集合中,創建一顆就放在集合中,滿個數就不創建了,在按下J鍵時調用則無需判斷了因為方法本身就判斷了

    • 由于有多顆子彈了,所以判斷是否擊中敵方坦克的方法要變,即要依次取出我方子彈了

    • 一個方法的變化,要考慮其他地方是否也要變---牽一發而動全身

  • 敵方發射的子彈消亡后才能再發射:由于敵方坦克配備的是子彈集合,而且是在Enemy的run中不停發射子彈,故而在發射時判斷Enemy子彈集合中子彈的個數是否為零(為零就說明子彈被銷毀了),為零就再創建一顆放入集合然后發射

  • 敵方可同時發射規定顆:只需再上述判斷改為判斷子彈集合中子彈的個數是否少于規定 個數

  • 敵方子彈擊中我方坦克,消失和爆炸效果:和擊中敵方坦克的判斷類似,取出敵方子彈,取出我方坦克,判斷是否在我方坦克區域

  • 防止敵方坦克重疊:將敵人坦克從集合中依次取出,判斷是否在其他坦克范圍內,故要在Enemy中定義坦克集合,并且要把MyPanel中真正的enemies設置到Enemy類(即setEnemies方法)。判斷重疊與否,根據要判斷的坦克的方向分成四大類,再根據用來判斷的坦克分為八類。如果重疊了,則不能move~了

    • 再MyPanel中把集合設置到Enemy類中,不然有越界的異常

  • 記錄玩家總成績(擊中的敵方坦克總數),存盤退出:首先在MyPanel中添加一個畫出記錄總成績的區域,在paint中調用。創建類記錄成績,在擊中敵方坦克時增加成績;能存盤退出,IO流,關閉窗口時調用

    • 記錄的路徑跟著工程走,就在src里創建文件

    • 關閉窗口時調用,addWindowListener

  • 記錄退出游戲時敵人坦克的坐標和方向,存盤退出:關閉窗口時調用的方法中再加上敵人坦克的坐標和方向即可

    • 在Recorder中創建敵人坦克集合,仍像Enemy那樣處理

  • 玩游戲時 可以選擇新開游戲還是繼續上一局:要能繼續上一局,則需從文件中讀取數據---將文件的數據恢復成Node結點集合,再根據結點恢復坦克(這些數據主要是初始化坦克時確定坐標和方向)。在游戲開始時能根據玩家選擇開始游戲,故而創建一個菜單

    • 在Recorder中創建Node集合,存放數據,在初始化的時候就用這里面的數據,就可以恢復敵方坦克的狀態【這兒不能恢復我方坦克的狀態】

    • 菜單寫在很多位置都可以,寫在TankGame的構造器,可能是因為 在選擇游戲模式后才會畫出面板,故而寫在TankGame挺好;加載面板等一系列操作寫在構造器而不是主方法,主要是體現封裝吧

    • "\r\n" 和 newLine() 都可換行

    • readLine 讀取一行內容(返回字符串),但是沒有換行,所以需要的話 要自己插入一個換行

    • 字符串轉int:Integer.parseInt(String)、 Integer.valueOf(String)

      valueOf(String)方法會返回Integer類的對象,而parseInt(String)方法返回原始的int值

    • 字符串分成幾個數據:字符串分割成數組,再根據索引獲取

  • 總結

    以上是生活随笔為你收集整理的Java坦克大战Summary的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。