源代碼壹***兩個文件:Mine.java,MGame.java,另外還有壹些圖片。
在JBuilder下建立壹個新的工程,將兩個源文件復制到工程目錄下的src\mine目錄中,將所有圖片復制到src\images目錄中就可以了。
要點分析
數據結構
首先要說明壹下用來存放地雷信息的數組grid。
grid是壹個二維數組,第壹位對應表格的行,第二位對應表格的列,比如grid[y][x]表示第y行第x列。每個字節的含義分三段:0-9表示已經挖開;10-19表示仍然埋藏;20-29表示做了標記。每段中:0-8表示周圍的地雷數量;9表示是地雷。
newGame()函數
這是用於開始壹個新遊戲的。
由於每次地雷的埋放地是隨機的,應次開始新遊戲之前先要生成新的地雷信息。
第壹步是初始化grid,將所有內容都置成10,因為壹開始所有格子都是埋藏的。
for(i=0;i<Height; i++)
{
for(j=0; j<Width; j++)
grid[j] = 10;
}
第二步是隨機產生地雷。當然了,已經產生過地雷的地方要避開。
for(i=0; i<MINECOUNT; i++)
{
while(true)
{
x = Math.abs(rand.nextInt()) % Width;
y = Math.abs(rand.nextInt()) % Height;
if (grid[y][x] != 19)
{
grid[y][x] = 19;
break;
}
}
}
最後就是無雷處計算周圍的雷數了。怎麽計算?壹個壹個加就是了。
挖雷與做標記
在看壹下按鍵響應函數keyPressed(int kcode),按1鍵是挖開動作。
前半部分表示如果當前焦點在壹個埋藏格(值介於10到19之間),那麽將其值減10,表示現在挖開。當然如果地下不是雷而且周圍沒有雷(值等於0)那麽需要自動展開,這裏調用了Expand(),(selx,sely)是當前焦點的表格坐標。
後半部分表示如果當前焦點在壹個已經挖開的格子上(值小於10),那麽就調用SafeExp()來自動挖開周圍未挖的格子。
按3鍵是做標記動作。如果當前格是埋藏格,就做上標記(值加10);如果當前格已經做了標記,那麽就去掉標記(值減10)。
自動展開
Expand()是壹個嵌套函數,他的作用是將周圍不含地雷的格子周圍全部挖開,如果挖開的部分中也有周圍不含地雷的格子,那麽對那些格子也重復前面的操作,直到把相關的格子都挖開。挖的順序是左上、上、右上、左、右、左下、下、右下,如果遇到壹個周圍不含地雷的格子(值為0)那麽馬上嵌套調用Expand()對那個格子進行處理。
SafeExp()是壹個自動挖開周圍未挖格子的函數。當然要實現這個功能是有條件的,就是周圍做了標記的格子數量必須等於當前格所標的數字,也就是說玩家把周圍所有的地雷都標記了(不管是否標錯)。函數中第壹個部分就是做以上條件的判斷。
第二部分是把周圍埋藏的格子挖開。但是由於玩家的錯誤可能標記了沒有地雷的格子,而把有地雷的格子漏標了,所以先要檢查壹下沒做標而有地雷的格子和做錯標記的格子。如果沒有這些錯誤,那麽可以安全的翻開了,同時也要檢查是否挖到周圍不含雷的格子,有的話就要調用Expand()了。
SafeExp()的返回值表示是否引爆了地雷,就是標記錯誤,true表示是,false表示否。這主要用於判斷這次遊戲是否要結束。
類介紹
圖像緩存 ExtendedImage
ExtendedImage是Siemens自己擴展的壹個專用類,只在Siemens的Java中存在。
這個類主要是用做圖像的緩存。大家不知道還有沒有印象,以前在PC上編程的時候由於顯示的速度比較慢,往往會開壹片顯示緩存,先把要現實的內容畫到這片緩存中,全部畫好後再壹次性顯示出來,ExtendedImage類就起到了這個作用。其實Java本身的Image類也可以實現類似的功能,但是顯示速度好象不如人意,而且ExtendedImage更好用,所以我基本上都采用這個類。當然這對通用性是不利的。
ExtendImage的主要函數有:
void clear(byte color);
用給定的顏色填充整個圖形區域。
void blitToScreen(int x, int y);
將緩存內容貼到顯示屏上,(x,y)是屏幕左上角坐標。
Image getImage();
返回壹個標準的Image類。可以通過ExtendImage.getImage().getGraphics()得到與其相關的Graphics對象,用來往ExtendImage上面畫圖。