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

超級(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)問題
重寫paint()方法
創(chuàng)建一個(gè)和彈出窗口寬高相同的圖片,
獲取該圖片的圖形對(duì)象,把所有內(nèi)容添加到該圖片中
Image offScreemImage = null;
//創(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)目資料