2022年9月26日 星期一

RH week4

 week4

(一)

1.為了要畫出橢圓,我們先寫一個能往右上方畫出直線的程式

```c
void setup(){
  size(500,500);
}
int x=250,y=250;  ///變數
void draw(){
  ellipse(x,y,10,10);  ///橢圓
  x=x+1;
  y=y-1;
}
```

2.修改程式碼,把位置的部分改成float,並使直線畫到一半碰到牆時會轉彎

```c
void setup(){
  size(500,500);
}
float x=250,y=250;  ///變數(位置)精準
float vx=1.0 , vy=-0.5;
void draw(){
  ellipse(x,y,10,10);  ///橢圓
  x=x+vx;
  y=y+vy;
  if(x>500) vx = -vx;
  if(y<0) vy= -vy;
}
```

3.把背景化為白色,把殘影去除使球體顯現出來。接著修正參數創建一個板子,使球碰到時能反彈

```c
void setup(){
  size(500,500);
}
float x=250,y=250;  ///變數(位置)
float vx=2.0 , vy=-1.5;    ///球的移動速度
void draw(){
  background(#FFFFF2);  ///背景,去除殘影
  int boardX = mouseX;
  rect(boardX,470,200,20);  ///控制的板子
  ellipse(x,y,10,10);  ///球體大小
  x=x+vx;
  y=y+vy;
  if(x>500) vx = -vx;
  if(y<0) vy = -vy;
  if(x<0) vx = -vx;
  if(y>470 && x>boardX && x<boardX+200) vy=-vy;
}
```

4.精進球體的移動程式,新增boardX、Y、W、H
最下方兩個程式碼意思是,按住左鍵,板子持續變大;按住右鍵,板子持續變小

```c
void setup(){
  size(500,500);
}
float x=250,y=250;  ///變數(位置)
float vx=3.0 , vy=-3.5;
float boardX,boardY=470,boardW=100,boardH=20;
void draw(){
  boardX=mouseX-boardW/2;
  background(#000000);  ///背景,去除殘影
  rect(boardX,boardY,boardW,boardH,20);  ///控制的板子
  ellipse(x,y,15,15);  ///橢圓
  x=x+vx;
  y=y+vy;
  if(x>500) vx = -vx;
  if(y<0) vy = -vy;
  if(x<0) vx = -vx;
  if( (y>boardY && y<boardY+boardH) &&
    (x>boardX && x<boardX+boardW) ){
    vy=-vy;
    vx += (mouseX-pmouseX)/2;  ///mouse的移動速度
   }
   if(mousePressed && mouseButton==LEFT)boardW *= 1.01;    ///按左鍵板子變大
   if(mousePressed && mouseButton==RIGHT)boardW *= 0.99;    ///按右鍵板子變小
}
```

(二)圍棋

1.首先,先印出一堆棋子出來吧

```c
void setup(){ 
  size(500,500);
}
void draw(){    ///用迴圈話很多棋子出來
  for(int x=50;x<=450;x+=50){
    for(int y=50;y<=450;y+=50){
       ellipse(x,y,50,50);
    }
  }
}
```

2.設計一個陣列go,透過0和1決定哪個位置的棋子是黑色,再利用迴圈把棋子印出來

```c
void setup(){ 
  size(500,500);
}
int [][]go={
  {0,0,0,0,0,0,0,0,1},
  {0,0,0,0,0,0,0,0,1},
  {0,1,0,0,0,0,0,0,1},
  {0,0,0,0,0,0,1,0,1},
  {0,0,0,0,0,0,0,0,1},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
};  ///陣列 array 9x9
void draw(){
  for(int i=0;i<9;i++){  ///左手i 對應y座標
    for(int j=0;j<9;j++){  ///右手j 對應x座標
      if(go[i][j]==1)fill(0);
      else fill(255);
      ellipse(50+j*50,50+i*50,50,50);
    }
  }
}
```

3.先寫一個木頭色的棋盤,接著再畫出線條;設定在陣列寫出0是空格、1是黑棋、2是白棋

```c
void setup(){ 
  size(500,500);
}
int [][]go={
  {0,0,0,0,0,0,0,0,1},
  {0,0,0,0,0,0,0,0,1},
  {0,1,0,0,2,0,0,0,1},
  {0,0,0,0,0,0,1,0,1},
  {0,0,2,0,0,0,0,0,1},
  {0,0,0,0,0,2,0,0,0},
  {0,0,0,2,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
};  ///陣列 array 9x9
void draw(){
  background(246,194,108);  ///木頭色的棋盤
  for(int i=1;i<=9;i++){  ///畫線條
    line(50,50*i,450,50*i);
    line(50*i,50,50*i,450);
  }
  for(int i=0;i<9;i++){  ///左手i 對應y座標
    for(int j=0;j<9;j++){  ///右手j 對應x座標
      if(go[i][j]==1){  ///1:黑棋
        fill(0);
        ellipse(50+j*50,50+i*50,40,40);
      }
      else if(go[i][j]==2){  ///2:白棋
        fill(255);
        ellipse(50+j*50,50+i*50,40,40);
      }
    }
  }
}
```

4.使其不用事先設定哪個位置要放黑棋、白棋,通過mousePressed使我們可以任意決定黑白棋的位置
```c
void setup(){ 
  size(500,500);
}
int [][]go={  //0:沒有旗子、1:黑棋、2:白棋
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0},
};  ///陣列 array 9x9
int N=0;  //目前有幾個旗子
void mousePressed(){
  int j=(mouseX-25)/50;
  int i=(mouseY-25)/50;
  go[i][j]=(N%2==0) ? 1:2;  ///if(N%2==0)用1,否則2
  N++;
}
void draw(){
  background(246,194,108);  ///木頭色的棋盤
  for(int i=1;i<=9;i++){  ///畫線條
    line(50,50*i,450,50*i);
    line(50*i,50,50*i,450);
  }
  for(int i=0;i<9;i++){  ///左手i 對應y座標
    for(int j=0;j<9;j++){  ///右手j 對應x座標
      if(go[i][j]==1){  ///1:黑棋
        fill(0);
        ellipse(50+j*50,50+i*50,40,40);
      }
      else if(go[i][j]==2){  ///2:白棋
        fill(255);
        ellipse(50+j*50,50+i*50,40,40);
      }
    }
  }
}
```










沒有留言:

張貼留言