最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

快來看,新手實(shí)戰(zhàn)必備!單機(jī)版坦克大戰(zhàn)分步實(shí)現(xiàn)項(xiàng)目源碼~

2022-03-29 17:35 作者:千鋒教育  | 我要投稿


超級(jí)長文預(yù)警!





很多java初學(xué)者,在學(xué)習(xí)一段時(shí)間java后,都想寫一個(gè)項(xiàng)目練練手來檢測一下學(xué)習(xí)成果,而坦克大戰(zhàn)就是一個(gè)非常好的試手項(xiàng)目。坦克大戰(zhàn)本身就是一個(gè)非常經(jīng)典的單機(jī)項(xiàng)目,其次使用java來實(shí)現(xiàn),技術(shù)點(diǎn)幾乎能夠涉及到j(luò)ava所有的基礎(chǔ)知識(shí)。

那么千鋒老謝就從最開始手把手的教你實(shí)現(xiàn)坦克大戰(zhàn),簡單明了,步驟詳細(xì),絕對(duì)讓你寫出自己的坦克大戰(zhàn),同時(shí)加深對(duì)java知識(shí)的理解。那我們就開始吧。

1. 窗體繪制

JFrame是指一個(gè)計(jì)算機(jī)語言-java的GUI程序的基本思路是以JFrame為基礎(chǔ),它是屏幕上window的對(duì)象,能夠最大化、最小化、關(guān)閉。

1.1 創(chuàng)建窗口

  • 創(chuàng)建類繼承JFrame

  • 創(chuàng)建啟動(dòng)方法launch()

  • setTitle() 設(shè)置標(biāo)題

  • setSize(width, height); 設(shè)置寬高

  • setLocationRelativeTo(null); 設(shè)置位置,null為居中

  • setResizable();? 是否可拉伸

  • setVisible(); 是否可見

  • setDefaultCloseOperation(3); 1,2,3 (點(diǎn)差號(hào),關(guān)閉程序)

1.2 為窗口上色

  • 重寫paint()方法,參數(shù)g為圖形

  • 設(shè)置圖形顏色

  • 設(shè)置圖形大小

1.3 添加選項(xiàng)文字

  • 設(shè)置字體顏色,不要和背景色一樣

  • 設(shè)置字體,字體大小

  • 添加文字,及文字位置

1.4 為窗口添加鍵盤事件

  • 添加內(nèi)部類,實(shí)現(xiàn)KeyAdapter類,重寫keyPressed方法,監(jiān)聽按鈕

  • 窗口添加鍵盤監(jiān)視器

  • 設(shè)置初始縱坐標(biāo)為150

    • int y = 150;

  • 在paint()方法,添加此圖片

    • g.drawImage(select, 160, y, null);

  • 在launch()方法中重繪圖形(每隔30毫秒)

    • //重繪

  • 重寫鍵盤事件,1選擇單人模式,2選擇雙人模式

//添加內(nèi)部類,實(shí)現(xiàn)KeyAdapter類,重寫keyPressed方法

  • 定義選擇相應(yīng)模式后,點(diǎn)擊回車鍵,顯示響應(yīng)窗口

  • 定義模式state 0:未選擇,1:單人 2:雙人

    //模式state 0:未選擇,1:單人 2:雙人

    int state = 0;

    int a = 0;

    • 重寫點(diǎn)擊事件

    //添加內(nèi)部類,實(shí)現(xiàn)KeyAdapter類,重寫keyPressed方法

  • 寫入圖形判斷

  • 整體代碼

1.6 解決閃頻

  • 創(chuàng)建一個(gè)圖片

    • //解決閃動(dòng)問題

    Image offScreemImage = null;

  • 重寫paint()方法

    • 創(chuàng)建一個(gè)和彈出窗口寬高相同的圖片,

    • 獲取該圖片的圖形對(duì)象,把所有內(nèi)容添加到該圖片中

    //創(chuàng)建和容器一樣大小的Image圖片

  • 把該圖片寫入到窗口中

    • g.drawImage(offScreemImage, 0, 0,null);

2. 鍵盤控制坦克移動(dòng)

2.1 添加游戲類父類

  • 屬性

  • 圖片

  • 位置(坐標(biāo))

  • 面板

  • 方法

  • 構(gòu)造方法

  • 在圖形中構(gòu)建自己

  • 獲取自身矩形(用于比較中彈)

2.2 添加坦克類

  • 尺寸(寬高)

  • 速度

  • 方向

  • 不同方向圖片

2.3 添加玩家類

2.4 在窗口中添加玩家

  • 創(chuàng)建玩家對(duì)象

  • //添加玩家一到面板

  • 把玩家對(duì)象添加到圖形中

    playerOne.paintSelf(g);

????

2.5使用鍵盤控制坦克移動(dòng)

  • 在坦克類(Tank)中添加上下左右四個(gè)方法

    • 不同方向設(shè)置不同圖片

    • 不同的方向

    //移動(dòng)方法

????

????

  • 在PlayerOne類中按鈕點(diǎn)擊,松開方法,及移動(dòng)方法

    • W上,A左,S下,D右

    boolean left, right, up, down;

    //鍵盤按下去方法

  • //移動(dòng)的方法,每次在繪制的時(shí)候移動(dòng)

  • 在主窗口類中,添加對(duì)A,S,D,W按鍵的監(jiān)控

    //鍵盤監(jiān)控

3. 坦克發(fā)射子彈

3.1 創(chuàng)建子彈類

  • 屬性

    • 尺寸

    • 速度

    • 方向

  • //尺寸

????????int width = 10;

????????int height =10;

????????//速度

????????int speed = 7;

????????//方向,方向和坦克方向一致

????????Direction direction;

  • 方法

    • 左移,右移,下移,上移

    • 根據(jù)坦克方向不同,移動(dòng)方向不同

    • //移動(dòng)方法

全部代碼:



3.2 實(shí)現(xiàn)坦克發(fā)射子彈

  • 在坦克類中

    • 獲取坦克的頭部坐標(biāo)

? ??

  • 添加發(fā)射方法

  • 根據(jù)坦克頭坐標(biāo),及坦克方向創(chuàng)建子彈

  • 把創(chuàng)建的子彈添加到面板中創(chuàng)建子彈集合中

????????//發(fā)射子彈

//子彈集合 在面板類中定義



  • 在PlayerOne類中添加鍵盤事件

    • 當(dāng)點(diǎn)擊空格按鈕,就會(huì)調(diào)用射擊方法

????//鍵盤按下去方法

3.3 添加子彈冷卻時(shí)間

  • 在坦克類中添加冷卻狀態(tài),冷卻時(shí)間

????????//冷卻狀態(tài)

????????boolean attackCoolDown = true;

????????//冷卻時(shí)間

????????int attackCoolTime = 1000;

  • 創(chuàng)建冷卻線程

????????//冷卻線程

  • 修改發(fā)射方法,每發(fā)射一次,啟動(dòng)冷卻線程

????????//發(fā)射子彈

4. 敵方坦克

4.1 隨機(jī)添加敵方坦克

  • 添加敵方坦克類

????????//敵方坦克

  • 批量把敵方坦克圖片添加到面板上

  • 把敵方坦克的圖片添加到項(xiàng)目中(4個(gè)方向各一個(gè))

  • 在面板中創(chuàng)建敵方坦克集合

  • 面板每重新加載100次,添加一個(gè)敵方坦克,敵方坦克最多有10各

????????//重繪次數(shù)

????????int count =0;

????????//敵方坦克個(gè)數(shù)

????????int enemyCount = 0;

  • 在重新繪制循環(huán)中,添加敵方坦克

????????//重新載入窗口

在開始游戲加載面板中顯示敵方坦克并對(duì)count自增(paint方法)

4.2 敵方坦克隨機(jī)移動(dòng)

  • 隨機(jī)生成方向(Bot)

????????//隨機(jī)生成個(gè)數(shù),表示方向

  • 添加運(yùn)動(dòng)方法,每20次,轉(zhuǎn)化一次方向(Bot)

????????//每間隔20,轉(zhuǎn)換方向一次

????????int moveTime = 20;

????????//行走方法

? ? //勿忘把重繪方法添加到繪制自己方法中



4.3 敵方坦克射擊

  • 創(chuàng)建敵方子彈類,直接繼承Bullet即可

  • 在機(jī)器人坦克類中添加攻擊發(fā)射方法

    • 機(jī)器人自行發(fā)射,把該方法添加到go()方法中

????//攻擊類,添加到go方法中

//機(jī)器人坦克自行行走

5. 碰撞檢測

5.1 我方子彈(Bullet)和敵方坦克(Bot)碰撞

  • 在面板類中定義要?jiǎng)h除/消失的子彈(GamePanal)

  • 在每次重繪時(shí),把刪除的子彈從繪制子彈集合中刪除

????????//碰撞后要?jiǎng)h除的子彈

  • 在子彈類中添加碰撞方法(Bullet)

    • 在繪制每個(gè)子彈時(shí),把當(dāng)前子彈對(duì)象和所有計(jì)算機(jī)坦克比較是否碰撞

    • 該方法要添加到繪制方法中

????????//碰撞 添加到paintSelf方法中,每次繪制時(shí),檢測

5.2 敵方子彈和我方坦克碰撞

  • 添加我方坦克集合(為后續(xù)擴(kuò)展使用)

    • 把玩家都添加到此集合中,在選擇游戲模式時(shí)添加

  • 玩家的繪制,修改成遍歷該集合

    • 不要忘記把原繪制玩家代碼刪除

????????//玩家坦克集合

  • 在敵方子彈類中添加碰撞方法

    • 該方法添加到繪制方法中

???????//碰撞 添加到paintSelf方法中,每次繪制時(shí),檢測

????

5.3 與圍墻的碰撞檢測

5.3.1面板中添加圍墻

  • 添加圍墻類

????????

5.3.2 添加圍墻和子彈碰撞檢測

  • 子彈類添加和圍墻碰撞方法(Bullet)

    • 把該方法添加到go()方法中,讓敵方子彈也可以和圍墻碰撞

????//子彈和圍墻碰撞,添加到go方法中,讓敵方子彈也可以擊破圍墻

????????

5.3.3 坦克和圍墻碰撞

  • 當(dāng)坦克和圍墻碰撞時(shí),坦克無法移動(dòng)

  • 在坦克類中添加圍墻碰撞方法

  • 然后在移動(dòng)類中判斷是否會(huì)和圍墻碰撞,如果碰撞則不移動(dòng)

????????//與圍墻碰撞檢測

????????

  • 修改所有移動(dòng)的方法

    //移動(dòng)方法 左移

????????

5.4 判斷坦克邊緣的碰撞

  • 坦克類中添加邊緣碰撞判斷(Tank)

    • 該判斷添加到移動(dòng)方法中

????????//判斷和邊緣的碰撞

5.5判斷子彈是否出界

  • 判斷子彈坐標(biāo)是否出界,如果出界則刪除

    • 該方法添加到go方法中

????????//如果子彈出界,該方法添加在go方法中,敵人子彈也可以刪除 刪除子彈,節(jié)省資源

6. 添加基地

6.1 創(chuàng)建并添加基地

  • 創(chuàng)建基地類

6.2 子彈與基地的碰撞測試

  • 在子彈類中添加碰撞方法

    • 該方法添加到go方法中

????????//與基地碰撞方法

??

?????

7. 游戲規(guī)則

  • 我方勝利

    • 把所有的敵人干倒

  • 機(jī)器贏了

    • 玩家坦克被干掉

    • 基地被倒了

????????//判斷規(guī)則,在每次重繪時(shí)

????

關(guān)注公眾號(hào)Java架構(gòu)棧,回復(fù)坦克獲取項(xiàng)目資料




快來看,新手實(shí)戰(zhàn)必備!單機(jī)版坦克大戰(zhàn)分步實(shí)現(xiàn)項(xiàng)目源碼~的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
永丰县| 宁武县| 嘉鱼县| 云霄县| 白银市| 武汉市| 和林格尔县| 盐城市| 德庆县| 海原县| 南宫市| 原阳县| 柯坪县| 奇台县| 綦江县| 铜陵市| 六安市| 许昌市| 柳河县| 体育| 巴南区| 星子县| 登封市| 双城市| 金坛市| 安图县| 晋江市| 兰西县| 长治县| 盐源县| 固阳县| 兴业县| 灵宝市| 新乡市| 巩义市| 禹城市| 宜川县| 中阳县| 连城县| 西青区| 响水县|