iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
Software Development

30天從基礎學起Java,直到做出我的第一個遊戲系列 第 21

Day 21:Java Snake Game 結束邏輯與打包

  • 分享至 

  • xImage
  •  

結束邏輯

今天我們可以來思考一下遊戲的結束邏輯
而貪食蛇的遊戲結束邏輯很簡單,只有兩種:
當頭的位置超出邊界,或撞到自己身體時,就會進入結束階段

我們先來設計撞到身體時結束的判斷,我們不能用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);

image


匯出遊戲(jar與exe)

完成遊戲本體後,我們要做的就是想辦法將遊戲匯出
如果一款遊戲只能在我自己的IDE上運行,那還算遊戲嗎

因此我們需要在IntelliJ中,File->Project Structure
在Artifacts中,選擇左上角的+號

image

選擇JAR

image

選擇From modules with dependencies

image

在這個頁面,Main Class選擇程式的入口點(有public static void main(String[] args))的

image

點擊OK

image

回到主畫面,選擇上面的Build -> Build Artifacts

image

然後進行Build

image

然後就會出現在 SnakeGame\out\artifacts\SnakeGame_jar\SnakeGame.jar

接下來,我們要使用Launch4J將.jar轉換成.exe
打開Launch4J,選擇匯出路徑與要被轉換的jar檔

image

記得要在JRE選單中填入最小JRE版本

image

否則會跳出Error:

image

匯出後就可以獲得一個可直接執行的exe檔了
不過目前有一個小問題是我還沒排除的,就是我沒有在我的Launch4j中找到"Bundle JRE",這會導致下載的使用者的電腦上需要安裝Java才能執行!


結語

製作貪食蛇遊戲的第三天,我們成功將整個遊戲完成並打包成jar與exe檔了,這對我來說是莫大的里程碑,象徵著我在遊戲開發上第一個完成的專案。
接下來幾天我會繼續完善這個貪食蛇遊戲,努力透過我所學到的知識將這個遊戲包裝的更好!
今天也是快樂開發的一天,明天繼續!/images/emoticon/emoticon07.gif


上一篇
Day 20:Java Snake Game 動態邏輯(計時、移動、食物位置判斷)
下一篇
Day 22:Java Snake Game 增加遊戲功能(一)
系列文
30天從基礎學起Java,直到做出我的第一個遊戲22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言