聲明:1.本文章為原創(chuàng)文章,轉(zhuǎn)載注明出處,蟹蟹~??
? ?2.初學(xué)java,水平有限,還有很多不足和應(yīng)當(dāng)修正的地方,歡迎評(píng)論指點(diǎn)? ?
寫這個(gè)小游戲是為了總結(jié)并實(shí)踐一下最近學(xué)的java用戶界面方面和按鍵監(jiān)聽的知識(shí),以及對(duì)下一章節(jié)IO流文件操作的入門練習(xí),也算是承上啟下吧。最開始本來想加入時(shí)間限制的,但貌似涉及到多線程(還沒學(xué)),就先簡(jiǎn)化了。游戲和代碼原創(chuàng),但玩法和普通迷宮也沒啥特別的,如有雷同純屬巧合。
首先曬一下游戲界面:



UI風(fēng)格看看就好,我也不知道怎么把它做的好看,就盡量用圖片去美化了。
這是大致框架:

歡迎界面就是兩JLabel和兩按鈕控件披上了圖片的外衣,有人就會(huì)說啦,妖怪吧你的按鈕這么特別,其實(shí)就是將默認(rèn)的一些屬性給取消然后加上圖片再添加監(jiān)聽器而已。更細(xì)致一點(diǎn)話,由于設(shè)置成圖片沒有了默認(rèn)按鈕的按下去的效果,所以可以設(shè)置一下按下的時(shí)候更換一張按鈕圖片來模擬默認(rèn)按鈕按下去的效果。這里我就不具體展開了。
按鈕的美化具體如下:(添加監(jiān)聽器和放置位置部分等省略)
?//設(shè)定透明效果
按鈕名.setOpaque(false);
//去掉背景點(diǎn)擊效果
按鈕名 .setContentAreaFilled(false);
//去掉聚焦線
按鈕名 .setFocusPainted(false);
//去掉邊框
按鈕名 .setBorder(null);
//設(shè)置顯示的圖片
按鈕名 .setIcon(圖片位置和信息);
? ? ? 其實(shí)以上都是強(qiáng)行使用Jbutton,反正是用圖片,那標(biāo)簽不也行???是的,標(biāo)簽上放置圖片然后添加監(jiān)聽器達(dá)到的效果是一樣的,還更簡(jiǎn)潔,只是這里我想用一下Jbutton而已,僅此而已。
接下來就是游戲界面:
? ? ? ?模式特有的LOGO,模式信息提示,背景圖片都是標(biāo)簽放上圖片,這里不多贅述。(注意JFrame中先加的圖片在上層,所以背景圖片的初始化要放在最后)
? ? ? ?迷宮墻體實(shí)則也是一個(gè)一個(gè)的標(biāo)簽放置圖片,但不可能每個(gè)都用代碼去寫,太麻煩了。這里我事先將迷宮墻體在邏輯上用1表示,0則表示空白(可以走的地方)放到txt文件中。以下圖片是迷宮數(shù)據(jù)的一部分:

? ? ? 其中1代表墻體,0代表空白,然后通過文件讀取,把這些數(shù)據(jù)存到事先定義好的數(shù)組中,這樣一來,邏輯上的迷宮地圖就完成了。這部分我也是現(xiàn)學(xué)現(xiàn)賣,這不,在mooc上看視頻截的圖還在,我也基本是按照視頻里老師說的寫的,只是視頻里是按行讀并輸出,我是改成了每個(gè)數(shù)都放到數(shù)組中而已。(圖中是往a.txt寫,從Main.java里面讀。)

? ? ? ? 邏輯上的迷宮初始化還有人物和終點(diǎn)(對(duì)于道具模式還有紅藍(lán)寶石),這里我就是從空白處(數(shù)據(jù)上為0)隨機(jī)生成的。整個(gè)迷宮從數(shù)據(jù)上看是? 1:墻? ? ?2:人? ? 3:藍(lán)寶石? ? ?4:紅寶石? ? 5:終點(diǎn)? ? 6:燈? ? ? 7:勝利標(biāo)志(游戲狀態(tài)函數(shù)會(huì)用到)? ?其中燈是用戶按空格鍵才有的,勝利標(biāo)志則是是否到達(dá)終點(diǎn)的判斷標(biāo)志(數(shù)組上我設(shè)置的是到達(dá)終點(diǎn)將7賦值給數(shù)組的第一個(gè)元素)。
? ? ? ?接下來是圖形上的迷宮初始化,這里分為公共部分和模式專有(迷霧模式有視野初始化,道具模式有紅藍(lán)寶石),就是按照邏輯上的數(shù)組數(shù)據(jù)對(duì)應(yīng)的標(biāo)簽數(shù)組進(jìn)行初始化,是什么數(shù)字就往標(biāo)簽上加對(duì)應(yīng)的圖片就好了,至于迷霧模式的視野問題,反應(yīng)到標(biāo)簽上就是可視化的問題。
這是初始化的結(jié)構(gòu):(JFrame中橫縱和數(shù)組相反,所以我從定義就開始反過來了,放置標(biāo)簽位置的時(shí)候同樣也要注意)

? ? ?初始化完成后就是按鍵監(jiān)聽了,也可說是數(shù)據(jù)處理。原理反映到圖形上無非就是空白處可以走,墻體不能走,紅藍(lán)寶石可以拾起等。反應(yīng)到數(shù)據(jù)上則是代表人物數(shù)據(jù)的2可以賦值給移動(dòng)方向上非1的數(shù)賦值為2,將原來的元素賦值為0.遇到3(藍(lán)寶石),4(紅寶石),5(終點(diǎn))的話額外做點(diǎn)對(duì)應(yīng)的事情就好啦。具體實(shí)現(xiàn)在本文不展開。另外在迷霧模式中空格鍵可以放燈,就是按空格時(shí)人物所在位置的周圍一圈的墻體上隨機(jī)放置一盞燈(數(shù)據(jù)上6代表燈),燈周圍方圓2格的墻體可視化。
至于迷霧模式的留燈次數(shù)為3的限制和道具模式的步數(shù)100的限制這里不展開講。
具體實(shí)現(xiàn)放燈的函數(shù)如下(數(shù)據(jù)上):
Random random = new Random();
for(int i=0;i<47;i++) {
? ? ?for(int j=0;j<37;j++) {
if(labyrinthData[i][j]==2)//找到人物放燈坐標(biāo)
? { int x,y;
? do {
? ? ? ? ? ?x=random.nextInt(3)-1;//-1,0,1
? ? ? ? ? ?y=random.nextInt(3)-1;//-1,0,1
? ? ? ?}while(labyrinthData[i+x][j+y]!=1);//放燈處合理性
? ? ? ? ? labyrinthData[i+x][j+y]=6;//6為燈
? ? ? ? ? labyrinthLable[j+y][i+x].setIcon(light);
? ? ?}
? ? }//內(nèi)for
}//外for?
? ? ? ? 同理,在對(duì)迷霧模式圖形上初始化時(shí)在視野控制也可以用此方法,先將整個(gè)標(biāo)簽數(shù)組的每一個(gè)元素setVisible(false); 然后在人物,終點(diǎn),燈所在坐標(biāo)方圓2格范圍內(nèi)數(shù)據(jù)上為1的標(biāo)簽數(shù)組元素setVisible(true);。
接下來便是更新函數(shù):不具體寫了直接看圖:

最后一步,游戲狀態(tài)函數(shù):
模式公有:游戲勝利,有勝利標(biāo)志(數(shù)據(jù)上為7)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 模式私有:迷霧模式?jīng)]有游戲失敗,道具模式步數(shù)為0時(shí)游戲失敗。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?利用JOptionPane.showConfirmDialog(null, "對(duì)話框內(nèi)容", "對(duì)話框標(biāo)題",JOptionPane.YES_NO_OPTION);來實(shí)現(xiàn)重玩游戲。具體實(shí)現(xiàn)細(xì)節(jié)在源碼里。
文章末尾:由于該小游戲用到了多張圖片,包括多種類型的背景圖片,人物圖片,墻體圖片等等,圖片資源不好一一上傳,于是我把整個(gè)游戲項(xiàng)目文件放到了百度網(wǎng)盤上,有興趣的可以下載,這是免密下載鏈接:https://pan.baidu.com/s/1VJgkui6SwQWExE8pHGRsCQ