2025年1月6日 星期一

酥皮 Week07

week07-1

//week07_1_arras01_background_fill_stroke_ellipse_rect_line

void setup(){
  size(500,700);
}
float x = 250, y=200;
void draw(){
  background(215,184,200);
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(240,160,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(x,y,55,55);//圓形的身體
  
  line(x,y,mouseX,mouseY);
}
week07-2
//week07_2_arras02_atan_cos_sin
void setup(){
  size(500,700);
}
float x = 250, y=200;
void draw(){
  background(215,184,200);
  float dx = mouseX-x, dy = mouseY-y;
  float a = atan2(dy,dx); //atan2() 算出角度
  strokeWeight(20); //很粗的一條線,長度是40
  line(x, y, x+cos(a)*40, y+sin(a)*40); //cos()算出x方向,sin()算出y方向
  
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(240,160,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(x,y,55,55);//圓形的身體
  //line(x,y,mouseX,mouseY);
}
week07-3
//week07_3_arras03_atan_angle_rotate_translate_myTank
void setup(){
  size(500,700);
}
float x = 250, y=200;
void draw(){
  background(215,184,200);
  float dx = mouseX-x, dy = mouseY-y;
  float a = atan2(dy,dx); //atan2() 算出角度
  line(x, y, mouseX, mouseY);
  myTank(x, y, a);
}
void myTank(float x, float y, float a){
  translate(x, y); //大二下圖學課教的:移動
  rotate(a); //大二下圖學課教的:旋轉
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(20,-10,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形的身體
}
week07-4
//week07_4_arras04_background_for_line_line_void_keyPressed_keyCode
void setup(){
  size(500,700);
}
void keyPressed(){
  if(keyCode==RIGHT) x+=1;
  if(keyCode==LEFT) x-=1;
  if(keyCode==UP) y-=1;
  if(keyCode==DOWN) y+=1;
}
float x = 250, y=200;
void draw(){
  //background(215,184,200); //紅底
  //stroke(211,180,196); //紅底的線
  background(219); //灰底
  stroke(210); //灰底的線
  strokeWeight(1);
  for(int i=0; i<30; i++){
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }
  float dx = mouseX-x, dy = mouseY-y;
  float a = atan2(dy,dx); //atan2() 算出角度
  line(x, y, mouseX, mouseY);
  myTank(x, y, a);
}
void myTank(float x, float y, float a){
  translate(x, y); //大二下圖學課教的:移動
  rotate(a); //大二下圖學課教的:旋轉
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(20,-10,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形的身體
}
week07-5
//week07_5_arras05_correct_move_translate_translate_mx_my
//會移動的背景,但是其他要正確運作
void setup(){
  size(500,700);
}
void keyPressed(){
  if(keyCode==RIGHT) x+=1;
  if(keyCode==LEFT) x-=1;
  if(keyCode==UP) y-=1;
  if(keyCode==DOWN) y+=1;
}
float x = 250, y=200;
void draw(){
  //background(215,184,200); //紅底
  //stroke(211,180,196); //紅底的線
  background(219); //灰底
  translate(-x, -y); //讓全世界,都向反方向移動
  translate(width/2, height/2); //把 0,0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標 
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  strokeWeight(1);
  for(int i=0; i<30; i++){
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }
  float dx = mx-x, dy = my-y; //改用 mx, my
  float a = atan2(dy,dx); //atan2() 算出角度
  line(x, y, mx, my); //改用 mx, my
  myTank(x, y, a);
}
void myTank(float x, float y, float a){
  translate(x, y); //大二下圖學課教的:移動
  rotate(a); //大二下圖學課教的:旋轉
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(20,-10,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形的身體
}
week07-6
//week07_6_arras06_vx_vy_void_keyPressed_void_keyReleased_void_draw
//希望移動很順,因為 keyPressed 每秒次數不夠快,要在 void draw() 裡,移動它
//會移動的背景,但是其他要正確運作
void setup(){
  size(500,700);
}
void keyPressed(){ //按下去會有速度,放開後速度要變成0
  if(keyCode==RIGHT) vx=1; //x+=1;
  if(keyCode==LEFT) vx=-1; //x-=1;
  if(keyCode==UP) vy=-1; //y-=1;
  if(keyCode==DOWN) vy=1; //y+=1;
}
void keyReleased(){
  if(keyCode==LEFT || keyCode==RIGHT) vx=0;
  if(keyCode==UP || keyCode==DOWN) vy=0;
}
float x = 250, y=200, vx=0, vy=0; //代表移動的速度
void draw(){
  //background(215,184,200); //紅底
  //stroke(211,180,196); //紅底的線
  x+=vx;
  y+=vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界,都向反方向移動
  translate(width/2, height/2); //把 0,0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標 
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  strokeWeight(1);
  for(int i=0; i<30; i++){
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }
  float dx = mx-x, dy = my-y; //改用 mx, my
  float a = atan2(dy,dx); //atan2() 算出角度
  line(x, y, mx, my); //改用 mx, my
  myTank(x, y, a);
}
void myTank(float x, float y, float a){
  translate(x, y); //大二下圖學課教的:移動
  rotate(a); //大二下圖學課教的:旋轉
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(20,-10,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形的身體
}
week07-7
//week07_7_arras07_angle_bulletX_bulletY_bulletVX_bulletVY
//希望移動很順,因為 keyPressed 每秒次數不夠快,要在 void draw() 裡,移動它
//會移動的背景,但是其他要正確運作
void setup(){
  size(500,700);
}
void keyPressed(){ //按下去會有速度,放開後速度要變成0
  if(keyCode==RIGHT) vx=1; //x+=1;
  if(keyCode==LEFT) vx=-1; //x-=1;
  if(keyCode==UP) vy=-1; //y-=1;
  if(keyCode==DOWN) vy=1; //y+=1;
}
void keyReleased(){
  if(keyCode==LEFT || keyCode==RIGHT) vx=0;
  if(keyCode==UP || keyCode==DOWN) vy=0;
}
float x = 250, y=200, vx=0, vy=0; //代表移動的速度
void draw(){
  //background(215,184,200); //紅底
  //stroke(211,180,196); //紅底的線
  x+=vx;
  y+=vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界,都向反方向移動
  translate(width/2, height/2); //把 0,0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標 
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  strokeWeight(1);
  for(int i=0; i<30; i++){
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }
  float dx = mx-x, dy = my-y; //改用 mx, my
  float a = atan2(dy,dx); //atan2() 算出角度
  angle = a;
  line(x, y, mx, my); //改用 mx, my
  pushMatrix();
  myTank(x, y, a);
  popMatrix();
  if(bulletVX!=0 && bulletVY!=0){
    bulletX += bulletVX;
    bulletY += bulletVY;
    ellipse(bulletX, bulletY, 20, 20);
  }
}
float angle, bulletX=0, bulletY=0, bulletVX=0, bulletVY=0; //子彈的 x,y 位置和速度
void mousePressed(){
  bulletX=x;
  bulletY=y;
  bulletVX=cos(angle);
  bulletVY=sin(angle);
}
void myTank(float x, float y, float a){
  translate(x, y); //大二下圖學課教的:移動
  rotate(a); //大二下圖學課教的:旋轉
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(20,-10,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形的身體
}
week07-8
//week07_8_arras08_array_many_bullets
//希望移動很順,因為 keyPressed 每秒次數不夠快,要在 void draw() 裡,移動它
//會移動的背景,但是其他要正確運作
void setup(){
  size(500,700);
}
void keyPressed(){ //按下去會有速度,放開後速度要變成0
  if(keyCode==RIGHT) vx=1; //x+=1;
  if(keyCode==LEFT) vx=-1; //x-=1;
  if(keyCode==UP) vy=-1; //y-=1;
  if(keyCode==DOWN) vy=1; //y+=1;
}
void keyReleased(){
  if(keyCode==LEFT || keyCode==RIGHT) vx=0;
  if(keyCode==UP || keyCode==DOWN) vy=0;
}
float x = 250, y=200, vx=0, vy=0; //代表移動的速度
void draw(){
  //background(215,184,200); //紅底
  //stroke(211,180,196); //紅底的線
  x+=vx;
  y+=vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界,都向反方向移動
  translate(width/2, height/2); //把 0,0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標 
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  strokeWeight(1);
  for(int i=0; i<30; i++){
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }
  float dx = mx-x, dy = my-y; //改用 mx, my
  float a = atan2(dy,dx); //atan2() 算出角度
  angle = a;
  line(x, y, mx, my); //改用 mx, my
  pushMatrix();
  myTank(x, y, a);
  popMatrix();
  for(int i=0; i<bulletN; i++){
    bulletX[i] += bulletVX[i];
    bulletY[i] += bulletVY[i];
    ellipse(bulletX[i], bulletY[i], 20, 20);
  }
}
float angle;
int bulletN = 0; //一開始有0個子彈,之後慢慢增加
float [] bulletX = new float[100]; //致命問題:只有100發子彈,超過會當機
float [] bulletY = new float[100];
float [] bulletVX = new float[100];
float [] bulletVY = new float[100];//子彈的 x,y 位置和速度
void mousePressed(){
  int i = bulletN;
  bulletX[i]=x;
  bulletY[i]=y;
  bulletVX[i]=cos(angle);
  bulletVY[i]=sin(angle);
  bulletN++;
}
void myTank(float x, float y, float a){
  translate(x, y); //大二下圖學課教的:移動
  rotate(a); //大二下圖學課教的:旋轉
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(20,-10,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形的身體
}
week07-9
//week07_9_arras09_recycle_bullet_move_right_to_left
//要有武器射出來
void setup(){
  size(500,700);
}
void keyPressed(){ //按下去會有速度,放開後速度要變成0
  if(keyCode==RIGHT) vx=1; //x+=1;
  if(keyCode==LEFT) vx=-1; //x-=1;
  if(keyCode==UP) vy=-1; //y-=1;
  if(keyCode==DOWN) vy=1; //y+=1;
}
void keyReleased(){
  if(keyCode==LEFT || keyCode==RIGHT) vx=0;
  if(keyCode==UP || keyCode==DOWN) vy=0;
}
float x = 250, y=200, vx=0, vy=0; //代表移動的速度
void draw(){
  //background(215,184,200); //紅底
  //stroke(211,180,196); //紅底的線
  x+=vx;
  y+=vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界,都向反方向移動
  translate(width/2, height/2); //把 0,0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標 
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  strokeWeight(1);
  for(int i=0; i<30; i++){
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }
  float dx = mx-x, dy = my-y; //改用 mx, my
  float a = atan2(dy,dx); //atan2() 算出角度
  angle = a;
  line(x, y, mx, my); //改用 mx, my
  pushMatrix();
  myTank(x, y, a);
  popMatrix();
  for(int i=0; i<bulletN; i++){
    bulletX[i] += bulletVX[i];
    bulletY[i] += bulletVY[i];
    ellipse(bulletX[i], bulletY[i], 20, 20);
  }
}
float angle;
int bulletN = 0; //一開始有0個子彈,之後慢慢增加
float [] bulletX = new float[100]; //致命問題:只有100發子彈,超過會當機
float [] bulletY = new float[100];
float [] bulletVX = new float[100];
float [] bulletVY = new float[100];//子彈的 x,y 位置和速度
void mousePressed(){
  int i = bulletN;
  bulletX[i]=x;
  bulletY[i]=y;
  bulletVX[i]=cos(angle);
  bulletVY[i]=sin(angle);
  bulletN++;
  if(bulletN==100){
    for(int k=0; k<50; k++){
      bulletX[k] += bulletX[k+50];
      bulletY[k] += bulletY[k+50];
      bulletVX[k] += bulletVX[k+50];
      bulletVY[k] += bulletVY[k+50];
    }
    bulletN=50;
  }
  println(bulletN); //印印看現在有幾個子彈
}
void myTank(float x, float y, float a){
  translate(x, y); //大二下圖學課教的:移動
  rotate(a); //大二下圖學課教的:旋轉
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(20,-10,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形的身體
}
week07-10
//week07_10_arras10_bulletT_for_timeout
//要有武器射出來
void setup(){
  size(500,700);
}
void keyPressed(){ //按下去會有速度,放開後速度要變成0
  if(keyCode==RIGHT) vx=1; //x+=1;
  if(keyCode==LEFT) vx=-1; //x-=1;
  if(keyCode==UP) vy=-1; //y-=1;
  if(keyCode==DOWN) vy=1; //y+=1;
}
void keyReleased(){
  if(keyCode==LEFT || keyCode==RIGHT) vx=0;
  if(keyCode==UP || keyCode==DOWN) vy=0;
}
float x = 250, y=200, vx=0, vy=0; //代表移動的速度
void draw(){
  //background(215,184,200); //紅底
  //stroke(211,180,196); //紅底的線
  x+=vx;
  y+=vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界,都向反方向移動
  translate(width/2, height/2); //把 0,0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標 
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  strokeWeight(1);
  for(int i=0; i<30; i++){
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }
  float dx = mx-x, dy = my-y; //改用 mx, my
  float a = atan2(dy,dx); //atan2() 算出角度
  angle = a;
  line(x, y, mx, my); //改用 mx, my
  pushMatrix();
  myTank(x, y, a);
  popMatrix();
  //if(bulletVX!=0 && bulletVY!=0){
  for(int i=0; i<bulletN; i++){
    bulletX[i] += bulletVX[i];
    bulletY[i] += bulletVY[i];
    ellipse(bulletX[i], bulletY[i], 20, 20);
    bulletT[i]--;
    if(bulletT[i]==0){ //要把i消滅掉,就拿右邊的來補
      for(int k=i+1; k<bulletN; k++){
        bulletX[k-1] = bulletVX[k]; //把右邊移到左邊
        bulletY[k-1] = bulletVY[k];
        bulletVX[k-1] = bulletVX[k];
        bulletVY[k-1] = bulletVY[k];
        bulletT[k-1] = bulletT[k];
      }
      bulletN--; //少了一顆子彈
    }
  }
  println(bulletN); //印印看現在有幾個子彈
}
float angle;
int bulletN = 0; //一開始有0個子彈,之後慢慢增加
float [] bulletX = new float[100]; //致命問題:只有100發子彈,超過會當機
float [] bulletY = new float[100];
float [] bulletVX = new float[100];
float [] bulletVY = new float[100];//子彈的 x,y 位置和速度
int [] bulletT = new int[100]; //每個子彈的壽命
void mousePressed(){
  int i = bulletN;
  bulletX[i]=x;
  bulletY[i]=y;
  bulletVX[i]=cos(angle);
  bulletVY[i]=sin(angle);
  bulletT[i] = 600; //每個子彈只有10秒的壽命
  bulletN++;
  if(bulletN==100){
    for(int k=0; k<50; k++){
      bulletX[k] += bulletX[k+50];
      bulletY[k] += bulletY[k+50];
      bulletVX[k] += bulletVX[k+50];
      bulletVY[k] += bulletVY[k+50];
    }
    bulletN=50;
  }
  println(bulletN); //印印看現在有幾個子彈
}
void myTank(float x, float y, float a){
  translate(x, y); //大二下圖學課教的:移動
  rotate(a); //大二下圖學課教的:旋轉
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(20,-10,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形的身體
}
//week07_10_arras10_bulletT_for_timeout
//要有武器射出來
void setup(){
  size(500,700);
}
void keyPressed(){ //按下去會有速度,放開後速度要變成0
  if(keyCode==RIGHT) vx=1; //x+=1;
  if(keyCode==LEFT) vx=-1; //x-=1;
  if(keyCode==UP) vy=-1; //y-=1;
  if(keyCode==DOWN) vy=1; //y+=1;
}
void keyReleased(){
  if(keyCode==LEFT || keyCode==RIGHT) vx=0;
  if(keyCode==UP || keyCode==DOWN) vy=0;
}
float x = 250, y=200, vx=0, vy=0; //代表移動的速度
void draw(){
  //background(215,184,200); //紅底
  //stroke(211,180,196); //紅底的線
  x+=vx;
  y+=vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界,都向反方向移動
  translate(width/2, height/2); //把 0,0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標 
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  strokeWeight(1);
  for(int i=0; i<30; i++){
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }
  float dx = mx-x, dy = my-y; //改用 mx, my
  float a = atan2(dy,dx); //atan2() 算出角度
  angle = a;
  line(x, y, mx, my); //改用 mx, my
  pushMatrix();
  myTank(x, y, a);
  popMatrix();
  //if(bulletVX!=0 && bulletVY!=0){
  for(int i=0; i<bulletN; i++){
    bulletX[i] += bulletVX[i];
    bulletY[i] += bulletVY[i];
    ellipse(bulletX[i], bulletY[i], 20, 20);
    bulletT[i]--;
    if(bulletT[i]==0){ //要把i消滅掉,就拿右邊的來補
      for(int k=i+1; k<bulletN; k++){
        bulletX[k-1] = bulletVX[k]; //把右邊移到左邊
        bulletY[k-1] = bulletVY[k];
        bulletVX[k-1] = bulletVX[k];
        bulletVY[k-1] = bulletVY[k];
        bulletT[k-1] = bulletT[k];
      }
      bulletN--; //少了一顆子彈
    }
  }
  println(bulletN); //印印看現在有幾個子彈
}
float angle;
int bulletN = 0; //一開始有0個子彈,之後慢慢增加
float [] bulletX = new float[100]; //致命問題:只有100發子彈,超過會當機
float [] bulletY = new float[100];
float [] bulletVX = new float[100];
float [] bulletVY = new float[100];//子彈的 x,y 位置和速度
int [] bulletT = new int[100]; //每個子彈的壽命
void mousePressed(){
  int i = bulletN;
  bulletX[i]=x;
  bulletY[i]=y;
  bulletVX[i]=cos(angle);
  bulletVY[i]=sin(angle);
  bulletT[i] = 600; //每個子彈只有10秒的壽命
  bulletN++;
  if(bulletN==100){
    for(int k=0; k<50; k++){
      bulletX[k] += bulletX[k+50];
      bulletY[k] += bulletY[k+50];
      bulletVX[k] += bulletVX[k+50];
      bulletVY[k] += bulletVY[k+50];
    }
    bulletN=50;
  }
  println(bulletN); //印印看現在有幾個子彈
}
void myTank(float x, float y, float a){
  translate(x, y); //大二下圖學課教的:移動
  rotate(a); //大二下圖學課教的:旋轉
  fill(167,167,175);
  stroke(110,110,113);
  strokeWeight(3);
  rect(20,-10,20,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形的身體
}

酥皮 Week02

week02-1
//week02_1_pacman_radians_mouseX
void setup(){
  size(400,400);
}
void draw(){
  background(255);
  fill(#F0B8E8); 
  float a = radians(mouseX); //radians 角度單位
  for(int x=0; x<400; x+=100){
    for(int y=0; y<400; y+=100){
      arc(x+50, y+50, 100, 100, 0+a, PI*2-a, PIE); //改畫弧度
      //X座標,Y,寬,高,開始,結束,蘋果派的畫法
    }
  }
}
week02-2
//week02_2_pacman_radians_frameCount
void setup(){
  size(400,400);
}
void draw(){
  background(255);
  fill(#F0B8E8); 
  float a = radians(frameCount);
  if(a>PI/4) a = a-PI/4;
  arc(200, 200, 300, 300, 0+a, PI*2-a, PIE);
}
week02-3
//week02_3_pacman_open_close_open_close
void setup(){
  size(400,400);
}
void draw(){
  background(255);
  fill(#F0B8E8);
  float a = frameCount % 180;
  if(a<45) a = radians(a);
  else if(a<90) a = radians(90-a);
  else if(a<135) a = radians(a-90);
  else if(a<180) a = radians(180-a);
  arc(200, 200, 300, 300, 0+a, PI*2-a, PIE);
}
week02-4
//week02_4_pacman_for_for_open_close_open_close 
void setup(){
  size(400,400);
}
void draw(){
  background(255);
  fill(#F0B8E8);
  for(int x=0; x<400; x+=100){
    for(int y=0; y<400; y+=100){
      float a = frameCount % 180;
      if(a<45) a = radians(a);
      else if(a<90) a = radians(90-a);
      else if(a<135) a = radians(a-90);
      else if(a<180) a = radians(180-a);
      arc(x+50, y+50, 100, 100, 0+a, PI*2-a, PIE); //改畫弧度
      //X座標,Y,寬,高,開始,結束,蘋果派的畫法
    }
  }
}
week02-5
//week02_5_pacman_if_keyPressed_keyCode
void setup(){
  size(400,400);
  frameRate(200); //加快速度
}
int x=200, y=200; //pacman座標
void draw(){
  background(255);
  fill(#F0B8E8);
  if(keyPressed && keyCode==RIGHT) x++;
  if(keyPressed && keyCode==LEFT) x--;
  if(keyPressed && keyCode==UP) y--;
  if(keyPressed && keyCode==DOWN) y++;
  ellipse(x,y,100,100);
}
week02-6
//week02_6_pacman_b_direction_from_week02_3
void setup(){
  size(400,400);
}
void draw(){
  background(255);
  fill(#F0B8E8);
  float a = frameCount % 180;
  float b = radians(mouseX);
  if(a<45) a = radians(a);
  else if(a<90) a = radians(90-a);
  else if(a<135) a = radians(a-90);
  else if(a<180) a = radians(180-a);
  arc(200, 200, 300, 300, b+0+a, b+PI*2-a, PIE);
}
week02-7
//week02_7_pacman_d_direction_void_keyPressed_keyCode
void setup(){
  size(400,400);
}
float x=200, y=200, d=PI/2*0;
void draw(){
  background(255);
  fill(#F0B8E8);
  float a = frameCount % 180;
  if(a<45) a = radians(a);
  else if(a<90) a = radians(90-a);
  else if(a<135) a = radians(a-90);
  else if(a<180) a = radians(180-a);
  arc(x, y, 100, 100, d+0+a, d+PI*2-a, PIE);
}
void keyPressed(){
  if(keyCode==RIGHT){
    x++;
    d=PI/2*0;
  }
  else if(keyCode==DOWN){
    y++;
    d=PI/2*1;
  }
  else if(keyCode==LEFT){
    x--;
    d=PI/2*2;
  }
  else if(keyCode==UP){
    y--;
    d=PI/2*3;
  }
}
week02-8
//week02_8_pacman_dx_dy_d_void_keyPressed
void setup(){
  size(400,400);
}
int x=200, y=200, d=0;
void draw(){
  background(255);
  fill(#F0B8E8);
  float a=0.5;
  int []dx = {1, 0, -1, 0}; //x++, x, x--, x
  int []dy = {0, 1, 0, -1}; //y++, y, y--, y
  x += dx[d];
  y += dy[d];
  arc(x, y, 100, 100, PI/2*d+a, PI/2*d + PI*2-a, PIE);
}
void keyPressed(){
  if(keyCode==RIGHT) d=0;
  if(keyCode==DOWN) d=1;
  if(keyCode==LEFT) d=2;
  if(keyCode==UP) d=3;
}
week02-9
//week02_9_pacman_radians_abs_frameCount_if_keyPressed
void setup(){
  size(400,400);
}
int x=200, y=200, d=0;
void draw(){
  background(255);
  fill(#F0B8E8);
  float a=radians(abs(frameCount%90-45));
  int []dx = {1, 0, -1, 0}; //x++, x, x--, x
  int []dy = {0, 1, 0, -1}; //y++, y, y--, y
  if(keyPressed) x += dx[d];
  if(keyPressed) y += dy[d];
  arc(x, y, 100, 100, PI/2*d+a, PI/2*d + PI*2-a, PIE);
}
void keyPressed(){
  if(keyCode==RIGHT) d=0;
  if(keyCode==DOWN) d=1;
  if(keyCode==LEFT) d=2;
  if(keyCode==UP) d=3;
}

week15

  //week15_01_circle_collision_class_Ball_new_ball_display

void setup(){
  size(640,360);
}

Ball ball = new Ball(100,200,20);
void draw(){
  ball.display();
}
class Ball{
  float x,y,r;
  Ball(int x0,int y0,int r0){
    x = x0;
    y = y0;
    r = r0;
  }
  void display(){
    ellipse(x,y,r+r,r+r);
  }
}


//week15_02_circle_collision_class_Ball_update
void setup(){
  size(640,360);
}

Ball ball = new Ball(100,200,20);
void draw(){
  ball.update();//加這行
  ball.display();
}
//把class ball移到右邊的新分頁

class Ball{
  float x,y,r;
  float vx,vy;
  Ball(int x0,int y0,int r0){
    x = x0;
    y = y0;
    r = r0;
    vx = random(-10,+10);
    vy = random(-10,+10);
  }
  void update(){
    if(x+vx <0 || x+vx >640) vx = -vx;
    if(y+vy <0 || y+vy >360) vy = -vy;
    x += vx;
    y += vy;
  }
  void display(){
    ellipse(x,y,r+r,r+r);
  }
}



//week15_03_circle_collision_detection_two_ball
//我們要在這裡,先測試最後的結果
void setup(){
  size(640,360);
}

Ball ball = new Ball(100,200,60);
Ball ball2 = new Ball(300,200,60);
void draw(){
  background(51);
  if(ball.checkCollision(ball2))fill(#FFAAAA);
  else fill(255);
  ball.update();//加這行
  ball.display();
  ball2.update();//加這行
  ball2.display();
  
}
//把class ball移到右邊的新分頁


class Ball{
  float x,y,r;
  float vx,vy;
  Ball(int x0,int y0,int r0){
    x = x0;
    y = y0;
    r = r0;
    vx = random(-10,+10);
    vy = random(-10,+10);
  }
  boolean checkCollision(Ball other){
    if(dist(x,y,other.x,other.y)<r+other.r)return true;
    else return false;
  }
  void update(){
    if(x+vx <0 || x+vx >640) vx = -vx;
    if(y+vy <0 || y+vy >360) vy = -vy;
    x += vx;
    y += vy;
  }
  void display(){
    ellipse(x,y,r+r,r+r);
  }
}



//week15_04_circle_collision_cos_sin_vector_N_N2_M_M2_swap
//我們要在這裡,先測試最後的結果
void setup(){
  size(640,360);
}

Ball ball = new Ball(100,200,60);
Ball ball2 = new Ball(300,200,60);
void draw(){
  background(51);
  if(ball.checkCollision(ball2))fill(#FFAAAA);
  else fill(255);
  ball.update();//加這行
  ball.display();
  ball2.update();//加這行
  ball2.display();
  
}
//把class ball移到右邊的新分頁


class Ball{
  float x,y,r;
  float vx,vy;
  Ball(int x0,int y0,int r0){
    x = x0;
    y = y0;
    r = r0;
    vx = random(-10,+10);
    vy = random(-10,+10);
  }
  boolean checkCollision(Ball other){
    if(dist(x,y,other.x,other.y)< r + other.r){
      PVector diff = new PVector(other.x-x,other.y-y);
      float len = diff.mag();//maganitude的意思
      float a = diff.heading();//向量的方向
      //大家熟的cos(a), sin(a)
      PVector N = diff.copy().normalize();
      N.mult(N.dot(new PVector(vx,vy)));
      PVector N2 = new PVector(-N.y,N.x).normalize();
      N2.mult(N2.dot(new PVector(vx,vy)));
      
      PVector M = diff.copy().normalize();
      M.mult(M.dot(new PVector(other.vx,other.vy)));
      PVector M2 = new PVector(-M.y,M.x).normalize();
      M2.mult(M2.dot(new PVector(other.vx,other.vy)));
      
      PVector newV1 = PVector.add(M,N2);
      PVector newV2 = PVector.add(N,M2);
      vx = newV1.x;
      vy = newV1.y;
      other.vx = newV2.x;
      other.vy = newV2.y;
      return true;
      }else return false;
  }
  void update(){
    if(x+vx <0 || x+vx >640) vx = -vx;
    if(y+vy <0 || y+vy >360) vy = -vy;
    x += vx;
    y += vy;
  }
  void display(){
    ellipse(x,y,r+r,r+r);
  }
}



//week15_05_maze_2D_array_draw
int [][]maze ={
  {1,1,1,1,1,1,1,1,1,1},
  {1,0,1,0,1,1,1,0,0,1},
  {1,0,1,0,0,0,0,0,1,1},
  {1,0,1,1,0,1,1,1,1,1},
  {1,0,0,0,0,0,0,0,1,1},
  {1,1,1,1,1,0,1,0,0,1},
  {1,1,0,0,0,0,0,1,0,1},
  {1,1,0,1,1,1,0,1,0,1},
  {1,0,0,0,0,1,0,1,0,1},
  {1,1,1,1,1,1,1,1,1,1},
};
void setup(){
  size(400,400);
}

void draw(){
  for(int i=0;i<maze.length;i++){
    for(int j=0;j<maze[0].length;j++){
      if(maze[i][j]==1)fill(0);
      else fill(255);
      rect(j*40,i*40,40,40);
    }
  }
}




//week15_06_maze_DFS_record
int [][]maze ={
  {1,1,1,1,1,1,1,1,1,1},
  {1,0,1,0,1,1,1,0,0,1},
  {1,0,1,0,0,0,0,0,1,1},
  {1,0,1,1,0,1,1,1,1,1},
  {1,0,0,0,0,0,0,0,1,1},
  {1,1,1,1,1,0,1,0,0,1},
  {1,1,0,0,0,0,0,1,0,1},
  {1,1,0,1,1,1,0,1,0,1},
  {1,0,0,0,0,1,0,1,0,1},
  {1,1,1,1,1,1,1,1,1,1},
};
int [][]visited= new int[10][10];
int startI=1,startJ=1,I=1,J=1,step=1;
void setup(){
  size(400,400);
  visited[I][J] = step;
}

void draw(){
  for(int i=0;i<maze.length;i++){
    for(int j=0;j<maze[0].length;j++){
      if(maze[i][j]==1)fill(0);
      else fill(255);
      rect(j*40,i*40,40,40);
    }
  }
  fill(255,0,0);
  rect(startJ*40,startI*40,40,40);
}



//week15_07_maze_DFS_visited_step_mousePressed_move
int [][]maze ={
  {1,1,1,1,1,1,1,1,1,1},
  {1,0,1,0,1,1,1,0,0,1},
  {1,0,1,0,0,0,0,0,1,1},
  {1,0,1,1,0,1,1,1,1,1},
  {1,0,0,0,0,0,0,0,1,1},
  {1,1,1,1,1,0,1,0,0,1},
  {1,1,0,0,0,0,0,1,0,1},
  {1,1,0,1,1,1,0,1,0,1},
  {1,0,0,0,0,1,0,1,0,1},
  {1,1,1,1,1,1,1,1,1,1},
};
int [][]visited= new int[10][10];
int startI=1,startJ=1,I=1,J=1,step=1;
void setup(){
  size(400,400);
  visited[I][J] = step;
}

void draw(){
  for(int i=0;i<maze.length;i++){
    for(int j=0;j<maze[0].length;j++){
      if(maze[i][j]==1)fill(0);
      else fill(255);
      rect(j*40,i*40,40,40);
    }
  }
  fill(255,0,0);
  rect(startJ*40,startI*40,40,40);
  for(int i=0;i<maze.length;i++){
    for(int j=0;j<maze[0].length;j++){
      if(visited[i][j]>0){
        fill(0,0,255);
        text(""+visited[i][j],j*40+20,i*40+20);
      }
    }
  }
}
void mousePressed(){
  if(maze[I+1][J]==0){//下面是空格可以走
  I = I+1;
  visited[I][J] = ++step;
  }
  else if(maze[I][J+1]==0){//下面是空格可以走
  J = J+1;
  visited[I][J] = ++step;
  }
}



//week15_08_maze_DFS_boolean_true_false
int [][]maze ={
  {1,1,1,1,1,1,1,1,1,1},
  {1,0,1,0,1,1,1,0,0,1},
  {1,0,1,0,0,0,0,0,1,1},
  {1,0,1,1,0,1,1,0,1,1},
  {1,0,0,0,0,1,1,0,1,1},
  {1,1,1,1,1,1,0,0,0,1},
  {1,1,0,0,0,0,0,1,0,1},
  {1,1,0,1,1,1,0,1,0,1},
  {1,0,0,0,0,1,0,1,0,1},
  {1,1,1,1,1,1,1,1,1,1},
};
int [][]visited= new int[10][10];
int startI=1,startJ=1,I=1,J=1,step=1;
void setup(){
  size(400,400);
}

void draw(){
  for(int i=0;i<maze.length;i++){
    for(int j=0;j<maze[0].length;j++){
      if(maze[i][j]==1)fill(0);
      else fill(255);
      rect(j*40,i*40,40,40);
    }
  }
  fill(255,0,0);
  rect(startJ*40,startI*40,40,40);
  for(int i=0;i<maze.length;i++){
    for(int j=0;j<maze[0].length;j++){
      if(visited[i][j]>0){
        fill(0,0,255);
        text(""+visited[i][j],j*40+20,i*40+20);
      }
    }
  }
}
boolean DFS(int i,int j,int s){
  if(i==8 && j==8)return true;//走到目的地
  if(maze[i][j]==1)return false;//擋住,不能走
  if(visited[i][j]>0)return false;//走過,不要再走
  visited[i][j] = s;
  if(DFS(i+1,j,s+1))return true;
  if(DFS(i-1,j,s+1))return true;
  if(DFS(i,j+1,s+1))return true;
  if(DFS(i,j-1,s+1))return true;
  visited[i][j]=0;
  return false;
}
void mousePressed(){
  visited[1][1]=0;
  DFS(1,1,1);
}