2024年1月11日 星期四

week16 啟動

 week16


發前幾周做的小專案越到後面跟一開始想的相去甚遠

於是決定打掉重練,跟老師學如何寫出迷宮


code:
//產生地圖maze的方法
int [][] maze = new int[50][50];
boolean [][] visited = new boolean[50][50];
boolean testVisible(int i, int j){ //true: nothing
  if(i<0 || j<0 || i>=50 || j>=50) return true;
  return visited[i][j]; //false 要用它 doing something
}
int [][] wallH = new int[50][49];
int [][] wallW = new int[49][50];
void genMaze2(int i, int j, int ii, int jj){
  if(i==ii) wallH[i][min(j,jj)] = 1;
  if(j==jj) wallW[min(i,ii)][j] = 1;
  genMaze(ii,jj);
}
void genMaze(int i, int j){
  //if(i==9&&j==9) return;
  visited[i][j] = true;
  println(i,j);
  while(true){
    if(testVisible(i+1, j)==false && int(random(2))==0) {genMaze2(i,j,i+1,j);}
    if(testVisible(i-1, j)==false && int(random(2))==0) {genMaze2(i,j,i-1,j);}
    if(testVisible(i, j+1)==false && int(random(2))==0) {genMaze2(i,j,i,j+1);}
    if(testVisible(i, j-1)==false && int(random(2))==0) {genMaze2(i,j,i,j-1);}
    if(testVisible(i+1, j) && testVisible(i-1, j) && testVisible(i,j+1) && testVisible(i,j-1)) break;
  }
}
int userI=0,userJ=0;
void setup(){
  size(750,750);
  genMaze(0,0);
}
void draw(){
  background(128,128,0);
  for(int i=0; i<50; i++){
    for(int j=0; j<49; j++){
      if(wallH[i][j]==0) line(15+j*15, i*15, 15+j*15, 15+i*15);
    }
  }
  for(int i=0; i<49; i++){
    for(int j=0; j<50; j++){
      if(wallW[i][j]==0) line(j*15, 15+i*15, 15+j*15, 15+i*15);
    }
  }
  
 ellipse(userJ*15+8,userI*15+8,14,14);
}
boolean noCrossWallW(int dI){
  int nextI=userI+dI;
  if(nextI<0||nextI>=50) return false;
  if(dI==-1 && wallW[nextI][userJ]==1) return true;
  if(dI==+1 && wallW[userI][userJ]==1) return true;
  return false;
}
boolean noCrossWallH(int dJ){
  int nextJ=userJ+dJ;
  if(nextJ<0||nextJ>=50) return false;
  if(dJ==-1 && wallH[userI][nextJ]==1) return true;
  if(dJ==+1 && wallH[userI][userJ]==1) return true;
  return false;
}
void keyPressed() {
  // 方向鍵移動玩家
  if (keyCode == UP && noCrossWallW(-1)) userI--;
  if (keyCode == DOWN && noCrossWallW(+1)) userI++;
  if (keyCode == LEFT &&  noCrossWallH(-1)) userJ--;
  if (keyCode == RIGHT &&  noCrossWallH(+1)) userJ++;
  
}


根據維基百科所提出的演算法實際應用於processing,每次都可以生成新的迷宮

迷宮1

迷宮2

迷宮3


這週先學會如何將迷宮寫出來,之後再加入玩家與終點、開始和重來的功能

沒有留言:

張貼留言