更新時(shí)間:2020-08-28 15:35:34 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2924次
一、游戲功能
游戲由障礙、空地、箱子、終點(diǎn)與玩家組成。
通過(guò)上下左右控制玩家推動(dòng)箱子。當(dāng)箱子的推動(dòng)方向沒(méi)有障礙時(shí),向前移動(dòng)到新的位置,玩家也向前移動(dòng)一步。
當(dāng)所有箱子都處于終點(diǎn)時(shí),游戲勝利,按回車(chē)鍵進(jìn)入下一關(guān)。當(dāng)完成所有關(guān)卡時(shí),按回車(chē)鍵結(jié)束游戲。
在游戲中按R建重新開(kāi)始本關(guān)。
二、素材準(zhǔn)備
從網(wǎng)上下載推箱子游戲的地圖素材與背景音樂(lè)。
三、游戲的大致框架
首先最容易想到的是一個(gè)管理地圖信息的Map類(lèi),其中應(yīng)該包括一個(gè)關(guān)卡地圖中的所有信息。
其次應(yīng)該有一個(gè)DataManager類(lèi)來(lái)從文件中讀取地圖、讀取圖片,并能根據(jù)讀入的地圖文件與關(guān)卡編號(hào)創(chuàng)造出所需的Map類(lèi)的對(duì)象。
還需要有一個(gè)SoundManager類(lèi)來(lái)播放音樂(lè)。
游戲中最不能缺少的是GameManager類(lèi),用于管理游戲的所有邏輯。
最后是一個(gè)窗口,用于綜合所有的管理類(lèi),將輸入傳入GameManager類(lèi)以及顯示游戲畫(huà)面。
四、地圖類(lèi)的設(shè)計(jì)
因此設(shè)計(jì)出Map類(lèi),其中有4個(gè)私有成員:二維數(shù)組byte map[][]儲(chǔ)存地圖上的元素,int level儲(chǔ)存當(dāng)前地圖的等級(jí),manX、manY表示玩家當(dāng)前所在的位置。
private int manX,manY;//主角所在位置的坐標(biāo)
private byte map[][];//二維地圖元素?cái)?shù)組
private int level;//當(dāng)前地圖的等級(jí)
對(duì)于每一種地圖元素,我們都需要用一個(gè)數(shù)字來(lái)表示。因此我們定義一些byte類(lèi)型的常量。
/** 地圖元素含義表 */
public final static byte WALL = 1, BOX = 2, BOX_ON_END = 3, END = 4,?
MAN_DOWN = 5, MAN_LEFT = 6, MAN_RIGHT = 7, MAN_UP = 8, GRASS = 9,?
MAN_DOWN_ON_END = 10, MAN_LEFT_ON_END = 11,MAN_RIGHT_ON_END = 12, MAN_UP_ON_END = 13;
考慮到進(jìn)入下一個(gè)關(guān)卡與重置本關(guān)都要新建一個(gè)Map對(duì)象,因此構(gòu)造方法有兩種,一種傳入level,一種則不需要。
/** 構(gòu)造一個(gè)地圖對(duì)象,不設(shè)定等級(jí) */
public Map(byte map[][]){
this.init(map);
}
/** 構(gòu)造一個(gè)地圖對(duì)象并指定等級(jí) */
public Map(byte map[][],int level) {
this.init(map);
this.level = level;
}
構(gòu)造Map時(shí),我們只需要傳入表示地圖元素的二維數(shù)組與等級(jí)即可,玩家的位置可以由地圖計(jì)算得到。
這里沒(méi)有判斷地圖的合法性,即主角是否只有一個(gè)、箱子與終點(diǎn)是否對(duì)應(yīng)以及謎題是否有解。因?yàn)檫@里的地圖是事先寫(xiě)入文件中的,在寫(xiě)入時(shí)就應(yīng)該保證合法性。
/** 初始化一個(gè)地圖對(duì)象 */
public void init(byte map[][]){
this.map = new byte[map.length][map[0].length];
for (int i=0;i
for (int j=0;j
this.map[i][j] = map[i][j];
}
}
findMan();
}
// 判斷類(lèi)型k是否為主角
private boolean isMan(byte k){
boolean res = false;
if (k>=5&&k<=13&&k!=9) res = true;
return res;
}
/** 計(jì)算主角在地圖中的位置 */
public void findMan(){
bk:for (int i=0;i
for (int j=0;j
if (isMan(map[i][j])){
manX = i;
manY = j;
break bk;
}
}
}
}
在實(shí)際使用中,我們需要有公有方法來(lái)獲得地圖的一些信息。
/** 獲取地圖的行數(shù) */
public int getRow(){
return map.length;
}
/** 獲取地圖的列數(shù) */
public int getColumn(){
return map[0].length;
}
/** 設(shè)置主角的位置 */
public void setMan(int x, int y){
manX = x;
manY = y;
}
/** 獲取主角在地圖中的X坐標(biāo) */
public int getManX(){
return manX;
}
/** 獲取主角在地圖中的y坐標(biāo) */
public int getMaxY(){
return manY;
}
/** 獲取(i,j)在地圖中的元素 */
public byte getMap(int i,int j){
return map[i][j];
}
/** 設(shè)置(i,j)的元素類(lèi)型 */
public void setMap(int i,int j,byte t){
map[i][j]=t;
}
/** 獲取當(dāng)前等級(jí) */
public int getLevel(){
return level;
}
/** 判斷(i,j)是否為空地 */
public boolean isGrassOrEnd(int i,int j){
if (map[i][j]==4||map[i][j]==9) return true;
return false;
}
/** 判斷(i,j)為箱子 */
public boolean isBox(int x,int y){
if (map[x][y]==2||map[x][y]==3) return true;
return false;
}
/** 判斷(i,j)是否在地圖上 */
public boolean inMap(int x,int y){
if (x>=0&&x=0&&y0) return true;
return false;
}
此時(shí),游戲基礎(chǔ)的地圖類(lèi)就完成了。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java游戲項(xiàng)目的練習(xí)題有哪些”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)