2024年12月30日 星期一

week17 fin.

 int[][][] maze = {

  {

    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 牆壁區域

    {1, 0, 0, 1, 1, 0, 0, 0, 1, 1}, // 可通行區域

    {1, 1, 0, 1, 1, 1, 1, 0, 1, 1}, // 可通行區域

    {1, 1, 0, 0, 0, 0, 1, 0, 1, 1}, // 可通行區域

    {1, 0, 1, 1, 0, 1, 1, 0, 1, 1}, // 可通行區域

    {1, 0, 1, 1, 0, 0, 0, 0, 1, 1}, // 可通行區域

    {1, 0, 0, 0, 0, 1, 1, 0, 1, 1}, // 可通行區域

    {1, 0, 1, 1, 1, 1, 1, 0, 1, 1}, // 可通行區域

    {1, 0, 0, 0, 0, 0, 1, 0, 0, 1}, // 可通行區域

    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 牆壁區域

  },

  {

    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 牆壁區域

    {1, 0, 1, 1, 0, 0, 1, 0, 0, 1}, // 可通行區域

    {1, 0, 0, 0, 0, 1, 1, 0, 1, 1}, // 可通行區域

    {1, 0, 1, 1, 0, 0, 0, 0, 0, 1}, // 可通行區域

    {1, 0, 1, 1, 0, 1, 1, 0, 1, 1}, // 可通行區域

    {1, 0, 1, 1, 0, 1, 0, 0, 1, 1}, // 可通行區域

    {1, 0, 1, 1, 0, 0, 1, 0, 0, 1}, // 可通行區域

    {1, 0, 1, 1, 0, 1, 1, 1, 0, 1}, // 可通行區域

    {1, 0, 1, 0, 0, 0, 0, 1, 0, 1}, // 可通行區域

    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 牆壁區域

  },

  {

    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 牆壁區域

    {1, 0, 0, 0, 0, 1, 0, 0, 0, 1}, // 可通行區域

    {1, 1, 1, 1, 0, 1, 0, 1, 0, 1}, // 可通行區域

    {1, 0, 0, 0, 0, 1, 0, 1, 0, 1}, // 可通行區域

    {1, 0, 1, 1, 1, 1, 0, 1, 0, 1}, // 可通行區域

    {1, 0, 0, 0, 0, 1, 0, 1, 0, 1}, // 可通行區域

    {1, 1, 1, 1, 0, 1, 0, 1, 0, 1}, // 可通行區域

    {1, 0, 0, 0, 0, 1, 0, 1, 0, 1}, // 可通行區域

    {1, 1, 1, 1, 0, 0, 0, 1, 0, 1}, // 可通行區域

    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 牆壁區域

  },

  {

    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 牆壁區域

    {1, 0, 1, 0, 0, 0, 0, 0, 0, 1}, // 可通行區域

    {1, 0, 1, 0, 1, 1, 1, 1, 0, 1}, // 可通行區域

    {1, 0, 1, 0, 1, 0, 0, 0, 0, 1}, // 可通行區域

    {1, 0, 1, 0, 1, 0, 1, 1, 1, 1}, // 可通行區域

    {1, 0, 1, 0, 1, 0, 0, 0, 0, 1}, // 可通行區域

    {1, 0, 1, 0, 1, 1, 0, 1, 0, 1}, // 可通行區域

    {1, 0, 1, 0, 1, 0, 0, 0, 0, 1}, // 可通行區域

    {1, 0, 0, 0, 1, 1, 0, 1, 0, 1}, // 可通行區域

    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 牆壁區域

  }

};


int startI = 1, startJ = 1, playerI = 1, playerJ = 1, goalI = 8, goalJ = 8;  // 起點、終點及玩家初始位置

boolean gameOver = false;  // 遊戲是否結束

int next=0;


void setup() {

  size(400, 400);  // 設定畫面大小

  noStroke();  // 不使用邊框

  frameRate(15);  // 設定更新幀數

}


void draw() {

  background(255);  // 背景顏色為白色


  // 繪製迷宮

  for (int i = 0; i < maze[next].length; i++) {

    for (int j = 0; j < maze[next][0].length; j++) {

      if (maze[next][i][j] == 1) fill(0); // 牆壁使用黑色

      else fill(255); // 通道使用白色

      rect(j * 40, i * 40, 40, 40);  // 每個格子的大小為40x40

    }

  }

  // 繪製起點 (紅色方塊)

  fill(255, 0, 0);

  rect(startJ * 40, startI * 40, 40, 40);


  // 繪製終點 (綠色方塊)

  fill(0, 255, 0);

  rect(goalJ * 40, goalI * 40, 40, 40);


  // 繪製玩家位置 (藍色方塊)

  if (!gameOver) {

    fill(0, 0, 255);

    rect(playerJ * 40, playerI * 40, 40, 40);

  }


  // 檢查玩家是否到達終點

  if (playerI == goalI && playerJ == goalJ && !gameOver) {

    gameOver = true;  // 設定遊戲結束

  }


  // 如果遊戲結束,顯示通關畫面

  if (gameOver==true) {

    displayWinMessage();  // 顯示通關訊息

  }

}


// 使用鍵盤按鍵來移動玩家

void keyPressed() {

  if (gameOver==true) return;  // 如果遊戲結束,不允許移動


  if (key == 'w' || key == 'W') movePlayer(-1, 0); // 上移

  if (key == 's' || key == 'S') movePlayer(1, 0);  // 下移

  if (key == 'a' || key == 'A') movePlayer(0, -1); // 左移

  if (key == 'd' || key == 'D') movePlayer(0, 1);  // 右移

}


// 移動玩家

void movePlayer(int di, int dj) {

  int newI = playerI + di;

  int newJ = playerJ + dj;


  // 檢查新位置是否在迷宮範圍內,並且是通道

  if (newI >= 0 && newI < maze[next].length && newJ >= 0 && newJ < maze[next][0].length && maze[next][newI][newJ] == 0) {

    playerI = newI;  // 更新玩家的垂直位置

    playerJ = newJ;  // 更新玩家的水平位置

  }

}


// 顯示通關訊息

void displayWinMessage() {

  fill(255, 0, 0);  // 設定文字顏色為黑色

  textSize(32);  // 設定文字大小d

  text("You Win!", 180, 180);  // 顯示通關字樣


  // 繪製重製按鈕

  fill(0, 255, 0);  // 設定按鈕顏色為綠色

  rect(150, 220, 100, 50);  // 按鈕的區域

  fill(255);  // 設定文字顏色為白色

  textSize(16);  // 設定文字大小

  textAlign(CENTER, CENTER);  // 設定文字對齊方式

  text("Restart", 200, 245);  // 顯示重製文字


  fill(255, 0, 0);

  rect(150, 270, 100, 50);  // 按鈕的區域

  fill(255);  // 設定文字顏色為白色

  textSize(16);  // 設定文字大小

  textAlign(CENTER, CENTER);  // 設定文字對齊方式

  text("Next", 200, 295);

}


// 當玩家點擊滑鼠時,檢查是否點擊到重製按鈕

void mousePressed() {

  if (gameOver==true && mouseX > 150 && mouseX < 250 && mouseY > 270 && mouseY < 320) {

    nextGame();  // 如果點擊到重製按鈕,則重設遊戲

  }

  if (gameOver==true && mouseX > 150 && mouseX < 250 && mouseY > 220 && mouseY < 270) {

    resetGame();  // 如果點擊到重製按鈕,則重設遊戲

  }

}


// 重設遊戲

void resetGame() {

  playerI = startI;  // 重設玩家位置為起點

  playerJ = startJ;  // 重設玩家位置為起點

  gameOver = false;  // 設定遊戲狀態為未結束

}

void nextGame() {

  next++;

  playerI = startI;  // 重設玩家位置為起點

  playerJ = startJ;  // 重設玩家位置為起點

  gameOver = false;  // 設定遊戲狀態為未結束

  if (next>3) {

    next = 0;

  }

}


沒有留言:

張貼留言