更新時間:2020-08-28 15:35:34 來源:動力節(jié)點(diǎn) 瀏覽2596次
一、游戲功能
游戲由障礙、空地、箱子、終點(diǎn)與玩家組成。
通過上下左右控制玩家推動箱子。當(dāng)箱子的推動方向沒有障礙時,向前移動到新的位置,玩家也向前移動一步。
當(dāng)所有箱子都處于終點(diǎn)時,游戲勝利,按回車鍵進(jìn)入下一關(guān)。當(dāng)完成所有關(guān)卡時,按回車鍵結(jié)束游戲。
在游戲中按R建重新開始本關(guān)。
二、素材準(zhǔn)備
從網(wǎng)上下載推箱子游戲的地圖素材與背景音樂。
三、游戲的大致框架
首先最容易想到的是一個管理地圖信息的Map類,其中應(yīng)該包括一個關(guān)卡地圖中的所有信息。
其次應(yīng)該有一個DataManager類來從文件中讀取地圖、讀取圖片,并能根據(jù)讀入的地圖文件與關(guān)卡編號創(chuàng)造出所需的Map類的對象。
還需要有一個SoundManager類來播放音樂。
游戲中最不能缺少的是GameManager類,用于管理游戲的所有邏輯。
最后是一個窗口,用于綜合所有的管理類,將輸入傳入GameManager類以及顯示游戲畫面。
四、地圖類的設(shè)計
因此設(shè)計出Map類,其中有4個私有成員:二維數(shù)組byte map[][]儲存地圖上的元素,int level儲存當(dāng)前地圖的等級,manX、manY表示玩家當(dāng)前所在的位置。
private int manX,manY;//主角所在位置的坐標(biāo)
private byte map[][];//二維地圖元素數(shù)組
private int level;//當(dāng)前地圖的等級
對于每一種地圖元素,我們都需要用一個數(shù)字來表示。因此我們定義一些byte類型的常量。
/** 地圖元素含義表 */
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)入下一個關(guān)卡與重置本關(guān)都要新建一個Map對象,因此構(gòu)造方法有兩種,一種傳入level,一種則不需要。
/** 構(gòu)造一個地圖對象,不設(shè)定等級 */
public Map(byte map[][]){
this.init(map);
}
/** 構(gòu)造一個地圖對象并指定等級 */
public Map(byte map[][],int level) {
this.init(map);
this.level = level;
}
構(gòu)造Map時,我們只需要傳入表示地圖元素的二維數(shù)組與等級即可,玩家的位置可以由地圖計算得到。
這里沒有判斷地圖的合法性,即主角是否只有一個、箱子與終點(diǎn)是否對應(yīng)以及謎題是否有解。因為這里的地圖是事先寫入文件中的,在寫入時就應(yīng)該保證合法性。
/** 初始化一個地圖對象 */
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();
}
// 判斷類型k是否為主角
private boolean isMan(byte k){
boolean res = false;
if (k>=5&&k<=13&&k!=9) res = true;
return res;
}
/** 計算主角在地圖中的位置 */
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ù) */
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)的元素類型 */
public void setMap(int i,int j,byte t){
map[i][j]=t;
}
/** 獲取當(dāng)前等級 */
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;
}
此時,游戲基礎(chǔ)的地圖類就完成了。
以上就是動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“Java游戲項目的練習(xí)題有哪些”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743