2023年12月14日 星期四

week12\4 Ray

 

WEEK 14


主題:打地鼠


今天加入難易度選擇介面,調整了上周的時間問題,簡單困難分別限時30秒和15秒,然後加上輸跟贏的畫面。困難關卡的倒數不會動,下周待調整!


// 引入Processing中所需的圖片庫
PImage img, imgb;
// 宣告遊戲狀態、黑洞數量、黑洞及地鼠位置、點擊狀態、分數和計時器變量
int state = 0;
int holeCount = 6; // 黑洞數量
float[] holeX = new float[holeCount]; // 黑洞的X位置
float[] holeY = new float[holeCount]; // 黑洞的Y位置
float moleX, moleY; // 地鼠圖片位置
boolean moleClicked = false; // 判斷地鼠是否被點擊
int score = 0; // 分數
int timeLeft = 30; // 初始時間為30秒
int lastTime = 0;

void setup() {
  size(1200, 800); // 設置畫布大小

  // 黑洞位置的設置
  holeX[0] = width / 5;
  holeY[0] = height / 2.5;
  holeX[1] = width / 2;
  holeY[1] = height / 2.5;
  holeX[2] = width / 1.25;
  holeY[2] = height / 2.5;
  holeX[3] = width / 5;
  holeY[3] = height / 1.25;
  holeX[4] = width / 2;
  holeY[4] = height / 1.25;
  holeX[5] = width / 1.25;
  holeY[5] = height / 1.25;

  resetMolePosition(); // 初始化地鼠位置
}

void draw() {
  if (state == 0) {
    drawStartScreen(); // 繪製遊戲初始畫面
    
  }
   if (state == 1) {
    drawChooseScreen(); // 繪製遊戲初始畫面
   }
   if (state == 2) {
    frameRate(5);
    drawCircles(); // 繪製黑洞圖案
    if (!moleClicked) {
      img = loadImage("gopher.png");
      image(img, moleX - 75, moleY - 120, 150, 150); // 繪製地鼠圖片
    }
    displayScore(); // 顯示分數
    displayTimer(); // 顯示計時器
    if (millis() - lastTime > 1000) { // 計時器每秒減少一次
      lastTime = millis();
      timeLeft--;
    }
  }
     if (state == 3) {
      timeLeft = 15;
      frameRate(5);
      drawCircles(); // 繪製黑洞圖案
      if (!moleClicked) {
      img = loadImage("gopher.png");
      image(img, moleX - 75, moleY - 120, 150, 150); // 繪製地鼠圖片
    }
    displayScore(); // 顯示分數
    displayTimer(); // 顯示計時器
    if (millis() - lastTime > 1000) { // 計時器每秒減少一次
      lastTime = millis();
      timeLeft--;
      if (timeLeft <= 0 && score >= 30) {
         state = 4;
      }
      if (timeLeft <= 0 && score <= 29){
        state = 5;
      }
    }
     }
   else if (state == 4){
   drawWinScreen();
   }
   else if (state == 5){
   drawLooseScreen();
     }
}

void drawStartScreen() {
  background(255); // 背景設置為白色
  fill(0); // 文字填充為黑色
  textSize(50); // 設置文字大小
  textAlign(CENTER, CENTER); // 文字居中對齊
  text("START GAME", width / 2, height / 2); // 顯示開始遊戲文字
}

void drawChooseScreen() {
  background(255); // 背景設置為白色
  fill(0); // 文字填充為黑色
  textSize(50); // 設置文字大小
  textAlign(CENTER, CENTER); // 文字居中對齊
  text("EASY", width/3.5 , height / 2); // 顯示開始遊戲文字
  text("HARD", width/1.5 , height / 2); // 顯示開始遊戲文字
}

void drawWinScreen() {
  background(255); // 背景設置為白色
  fill(0); // 文字填充為黑色
  textSize(50); // 設置文字大小
  textAlign(CENTER, CENTER); // 文字居中對齊
  text("YOU WIN", width / 2, height / 2); // 顯示開始遊戲文字
}

void drawLooseScreen() {
  background(255, 0, 0); 
  fill(0); // 文字填充為黑色
  textSize(50); // 設置文字大小
  textAlign(CENTER, CENTER); // 文字居中對齊
  text("YOU LOOSE", width / 2, height / 2); // 顯示開始遊戲文字
}

void drawCircles() {
  imgb = loadImage("grass.png");
  image(imgb, 0, 0, width, height); // 顯示草地背景圖片
  // 繪製所有黑洞
  for (int i = 0; i < holeCount; i++) {
    ellipse(holeX[i], holeY[i], 150, 50); // 繪製黑洞
  }
}

void displayScore() {
  fill(0); // 文字填充為黑色
  textSize(50); // 設置文字大小
  textAlign(LEFT); // 文字左對齊
  text("Score: " + score, 20, 40); // 顯示分數
}

void displayTimer() {
  fill(0); // 文字填充為黑色
  textSize(50); // 設置文字大小
  textAlign(RIGHT); // 文字右對齊
  text("Time: " + timeLeft, width - 20, 40); // 顯示剩餘時間
}

void resetMolePosition() {
  int randomIndex = int(random(holeCount)); // 隨機選擇一個黑洞位置
  moleX = holeX[randomIndex];
  moleY = holeY[randomIndex];
  moleClicked = false;
}

void mousePressed() {
  if (state == 0 && mouseX > width / 2 - 100 && mouseX < width / 2 + 100 && mouseY > height / 2 - 25 && mouseY < height / 2 + 25) {
    state = 1; // 遊戲開始狀態
  } else if (state == 1) {
    if (mouseX > width / 3.5 - 50 && mouseX < width / 3.5 + 50 && mouseY > height / 2 - 25 && mouseY < height / 2 + 25) {
      state = 2; // EASY 選擇
    } else if (mouseX > width / 1.5 - 50 && mouseX < width / 1.5 + 50 && mouseY > height / 2 - 25 && mouseY < height / 2 + 25) {
      state = 3; // HARD 選擇
    }
  } else if (state == 2 && !moleClicked) {
    for (int i = 0; i < holeCount; i++) {
      if (dist(mouseX, mouseY, holeX[i], holeY[i]) < 75 && dist(mouseX, mouseY, moleX, moleY) < 75) {
        // 判斷是否點擊到地鼠且地鼠未被點擊
        moleClicked = true;
        score++;
        resetMolePosition(); // 重新設置地鼠位置
        break; // 跳出for循環,確保只計分一次
      }
    }
  } else if (state == 3 && !moleClicked) {
    for (int i = 0; i < holeCount; i++) {
      if (dist(mouseX, mouseY, holeX[i], holeY[i]) < 75 && dist(mouseX, mouseY, moleX, moleY) < 75) {
        // 判斷是否點擊到地鼠且地鼠未被點擊
        moleClicked = true;
        score++;
        resetMolePosition(); // 重新設置地鼠位置
        break; // 跳出for循環,確保只計分一次
      }
    }
  }
}

難易選擇畫面



贏的畫面


輸的畫面








沒有留言:

張貼留言