今天我們可以來思考一下遊戲的結束邏輯
而貪食蛇的遊戲結束邏輯很簡單,只有兩種:
當頭的位置超出邊界,或撞到自己身體時,就會進入結束階段
我們先來設計撞到身體時結束的判斷,我們不能用enhanced for loop,因為它會包含第0個位子,也就是頭所在,但頭不會撞到頭,這會導致我們遊戲開始時就會結束了,所以我們要用一般的for,從第一個index開始檢查
for(int i=1; i<snake.size(); ++i){
if(Objects.equals(snake.get(i), new Point(headX, headY))){
gameOver();
return;
}
}
再來是撞到牆壁的判斷,當我的蛇頭位址小於0或大於等於邊界,蛇的格子就會在邊界外,表示超出範圍
if(point.x < 0 || point.x >= PANEL_WIDTH || point.y < 0 || point.y >= PANEL_HEIGHT){
gameOver = true;
}
最後我們可以把這兩個判斷放在一起,包裝在一個名為checkGameOver()的method裡面
public boolean checkGameOver(Point point){
boolean gameOver = false;
for(int i=1; i<snake.size(); ++i){
if(Objects.equals(snake.get(i), point)){
gameOver = true;
break; // 已知撞到就可以直接跳出迴圈了
}
}
if(point.x < 0 || point.x >= PANEL_WIDTH || point.y < 0 || point.y >= PANEL_HEIGHT){
gameOver = true;
}
return gameOver;
}
當我們確定遊戲結束時,我們需要停止timer並停止接收使用者按鍵輸入
我們建立gameOver()的method後,先來處理停止timer
public void gameOver(){
timer.stop();
}
而對於停止接收使用者按鍵輸入,則會稍微複雜一點
我們可以先建立一個instance variable(global variable)叫做isRunning,用來判斷遊戲是否處於執行階段,如果處於執行階段就會接受按鍵輸入,否則不接收
boolean isRunning = false;
// ...
actionMap.put("upAction", new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e){
if(direction != 's' && isRunning) direction = 'w';
}
});
這樣就可以準備製作遊戲結束畫面了
我們可以透過設置label的setVisible來決定是否要顯示指定文字
所以我們新增一個label並設定他
JLabel gameOverLabel;
// constructor內
gameOverLabel = new JLabel();
gameOverLabel.setFont(new Font("MV Boli", Font.BOLD, 25));
gameOverLabel.setHorizontalAlignment(JLabel.CENTER);
gameOverLabel.setVerticalAlignment(JLabel.CENTER);
gameOverLabel.setText("GAME OVER!");
gameOverLabel.setForeground(Color.WHITE);
gameOverLabel.setVisible(false);
this.add(gameOverLabel);
// 當呼叫gameOver()
gameOverLabel.setVisible(true);
完成遊戲本體後,我們要做的就是想辦法將遊戲匯出
如果一款遊戲只能在我自己的IDE上運行,那還算遊戲嗎
因此我們需要在IntelliJ中,File->Project Structure
在Artifacts中,選擇左上角的+號
選擇JAR
選擇From modules with dependencies
在這個頁面,Main Class選擇程式的入口點(有public static void main(String[] args))的
點擊OK
回到主畫面,選擇上面的Build -> Build Artifacts
然後進行Build
然後就會出現在 SnakeGame\out\artifacts\SnakeGame_jar\SnakeGame.jar
接下來,我們要使用Launch4J將.jar轉換成.exe
打開Launch4J,選擇匯出路徑與要被轉換的jar檔
記得要在JRE選單中填入最小JRE版本
否則會跳出Error:
匯出後就可以獲得一個可直接執行的exe檔了
不過目前有一個小問題是我還沒排除的,就是我沒有在我的Launch4j中找到"Bundle JRE",這會導致下載的使用者的電腦上需要安裝Java才能執行!
製作貪食蛇遊戲的第三天,我們成功將整個遊戲完成並打包成jar與exe檔了,這對我來說是莫大的里程碑,象徵著我在遊戲開發上第一個完成的專案。
接下來幾天我會繼續完善這個貪食蛇遊戲,努力透過我所學到的知識將這個遊戲包裝的更好!
今天也是快樂開發的一天,明天繼續!