2022年12月19日 星期一

Zi week16

 1.

程式碼:

color[]c={#FFFFF2,#E32936,#29BCE3,#29E330,#FAEF0D};

void setup() {

  size(600, 500);

  for (int k=0; k<15; k++) {

    hole[0][k]=int(random(1,5));

    hole[1][k]=int(random(1,5));

    hole[2][k]=int(random(1,5));

   /* hole[3][k]=1;

    hole[4][k]=1;

    hole[5][k]=1;

    hole[6][k]=1;

    hole[7][k]=1;

    hole[8][k]=1;

    hole[9][k]=1;

    hole[10][k]=1;

    hole[11][k]=1;*/

  }

}

//                      hole[i-1][j] hole[i-1][j+1]

//hole[i][j]鄰居有:hole[i][j-1]            hole[i][j+1]  i有奇數排

//                      hole[i+1][j] hole[i+1][j+1]

//                      hole[i-1][j-1] hole[i-1][j]

//hole[i][j]鄰居有:hole[i][j-1]            hole[i][j+1]  i有偶數排

//                      hole[i+1][j-1] hole[i+1][j]

void mousePressed() {

  for (int i=0; i<13; i++) {

    for (int j=0; j<15; j++) {

      float now = dist( r+j*r, r/2+i*sqrt(3)*r/2, mouseX, mouseY);

      if(i%2==0) now = dist( r/2+j*r, r/2+i*sqrt(3)*r/2,  mouseX, mouseY);

      if (now<r/2) {

        int num = findNow(i,j,hole[i][j]);

        if(num>=3)killNow(i,j,hole[i][j]);

      }

    }

  }

}

int findNow(int i,int j,int now){

 if(i<0 || j<0 || i>=13 || j>=15) return 0;

 int total=0;

 if(hole[i][j]==now){

   hole[i][j]=0;

   total=1;

   if(i%2==1){

     total += findNow(i-1,j,now); 

     total += findNow(i-1,j+1,now); 

     total += findNow(i,j-1,now); 

     total += findNow(i,j+1,now); 

     total += findNow(i+1,j,now); 

     total += findNow(i+1,j+1,now); 

   }else{

     total += findNow(i-1,j-1,now); 

     total += findNow(i-1,j,now); 

     total += findNow(i,j-1,now); 

     total += findNow(i,j+1,now); 

     total += findNow(i+1,j-1,now); 

     total += findNow(i+1,j,now); 

    }

    hole[i][j]=now;

  }

  return total;

}


void killNow(int i,int j,int now){

 if(i<0 || j<0 || i>=13 || j>=15) return ;

 if(hole[i][j]==now){

   hole[i][j]=0;

   if(i%2==1){

     killNow(i-1,j,now); 

     killNow(i-1,j+1,now); 

     killNow(i,j-1,now); 

     killNow(i,j+1,now); 

     killNow(i+1,j,now); 

     killNow(i+1,j+1,now); 

   }else{

     killNow(i-1,j-1,now); 

     killNow(i-1,j,now); 

     killNow(i,j-1,now); 

     killNow(i,j+1,now); 

     killNow(i+1,j-1,now); 

     killNow(i+1,j,now); 

    }

  }

}

int x=300, y=500;

float angle1=0, angle2=0;

boolean bulletFlying=false;

float bulletX, bulletY;//發射球的x,y座標

float bulletVX, bulletVY;//發射球的x,y方向座標

int [][] hole = new int[13][15];

int r=40;//球的直徑

int B=0;//上方球的總數


void draw() {

  background(#FFFFF2);

  fill(0, 0, 0);

  ellipse(x, y, 80, 80);

  strokeWeight(40);

  strokeCap(SQUARE);

  line(x, y, x+80*cos(angle1), y+80*sin(angle1));

  strokeWeight(1);

  for (int i=0; i<13; i++) {

    for (int j=0; j<15; j++) {

      if (hole[i][j]==0) continue;//noFill();

      else fill(c[hole[i][j]]);

      if (i%2==0) ellipse(r/2+j*r, r/2+i*sqrt(3)*r/2, r, r);

      else ellipse(r+j*r, r/2+i*sqrt(3)*r/2, r, r);

    }

  }

  if (bulletFlying) {

    bulletX+= bulletVX;

    bulletY+= bulletVY;

    fill(255, 255, 0);

    ellipse(bulletX, bulletY, r, r);

    if (bulletX > 585) bulletVX=-bulletVX;

    if (bulletX < 15) bulletVX=-bulletVX;

    if (bulletY < 15 || touch_yellow_ball() ) {

      //bulletVY=0;bulletVX=0;

      put_ball_in_hole();

      bulletFlying=false;

    }

  }

}


boolean touch_yellow_ball() {

  for (int i=0; i<13; i++) {

    for (int j=0; j<15; j++) {

      if ( hole[i][j]==1 && dist(bulletX, bulletY, r/2+j*r, r/2+i*sqrt(3)*r/2)<r/1.3) return true;

    }

  }

  return false;

}


void put_ball_in_hole() {

  float nearest = 99999;

  int nowI=0, nowJ=0;

  for (int i=0; i<13; i++) {

    for (int j=0; j<15; j++) {

      float now = dist( r+j*r, r/2+i*sqrt(3)*r/2, bulletX, bulletY);

      if(i%2==0) now = dist( r/2+j*r, r/2+i*sqrt(3)*r/2,  bulletX, bulletY);

      if (now<nearest && hole[i][j]==0) {

        nearest = now;

        nowI=i;

        nowJ=j;

      }

    }

  }

  hole[nowI][nowJ]=1;

}


void keyPressed() {

  if (keyCode==UP) angle1-=0.05;

  if (keyCode==DOWN) angle1+=0.05;

  if (key==' ') {

    bulletFlying=true;

    bulletX=x;

    bulletY=y;

    bulletVX=cos(angle1)*5;

    bulletVY=sin(angle1)*5;

  }

}

沒有留言:

張貼留言