2022年9月26日 星期一

ucc的week04互動技術上課筆記

# Week04 2022-09-26
```
=>这个iPhone 14 Pro系列灵动岛游戏有点意思!🤣🤣🤣
(https://www.facebook.com/watch/?v=2296475820490477)
1. 主題: 打磚塊
2. 主題: 圍棋
```
## 1-1做出類似動態島彈力球的遊戲
```C
1.一樣設定出畫面的大小
=>size(500,500);
2.  ellipse( x , y , 寬 , 長); 
=> ellipse(x,y,10,10);//橢圓
  --目前成果會做出一個往右上角前進的小球
```
## 1-2 加入反彈座標
```C
1.再多加入2個變數vx,vy
=> 讓速度變化
2.設定if判斷句
=> x超過畫面換方向,y進行反彈

```
## 1-3 加入反彈板(半完成)
```C
1.設定背景顏色
=> backgrounf(#6ED4F2);
2.透過rect做出反彈板板
=>  rect(boardx,470,100,15,5);
3.將boardx變數設定為mouseX ///使得反彈板板會跟著滑鼠一起移動
=> int boardx=mouseX;
4.設定白球碰到板子時會進行回彈(x~x+100)
=> if(y>470 && x>boardx && x<boardx+100) vy=-vy;
```
## 讓彈珠檯有加速度的感覺(快完成)
```C
1. 在板子中間控制
=> boardx改為 mouseX- boardW/2
2.算出滑鼠的移動量加進vx
=> vx+=(mouseX-pmouseX)/2;

```
## 讓反彈板可以縮放
```C
1.右鍵是縮小
=> if(mousePressed && mouseButton==RIGHT) boardw *= 0.99;

2.左鍵是放大
=> if(mousePressed && mouseButton==LEFT) boardw *= 1.01; 
```

## FINAL PROGRAM!!!
```C
void setup(){
  size(500,500);
}
float x=250,y=250;
float vx=1.0,vy=-2.5;
float boardx,boardy=470,boardw=100,boardh=20;
void draw(){
  background(#6ED4F2);
  boardx=mouseX-boardw/2;
  rect(boardx,boardy,boardw,boardh,20);
  ellipse(x,y,10,10);//橢圓
  x=x+vx;
  y=y+vy;
  if(x>500) vx=-vx;
  if(x<0) vx=-vx;
  if(y<0) vy=-vy;
  if((y>boardy && y<boardy+boardh) && (x>boardx && x<boardx+boardw))
  {
    vy=-vy;
    vx+=(mouseX-pmouseX)/2;
  }
  if(mousePressed && mouseButton==LEFT) boardw *= 1.01; 
  if(mousePressed && mouseButton==RIGHT) boardw *= 0.99;
}

```
## 2-1圍棋的雛型
```C
1.一樣先設定出視窗範圍
2.透過for畫出9*9顆白測棋子
=>  for(int x=50;x<=450;x+=50)
          {
            for(int y=50;y<=450;y+=50)
            {
                  ellipse(x,y,50,50);
            }
          }
    


```
## 2-2 判別為黑子還白子
```C
1.土法煉鋼
=> 如果數字是1為黑子否則為白子
  


```
## 設定1時下黑子2時下白子 0是都不下(半完成)
```
1.透過for畫出棋盤格線
=> for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
               line( 50 , i*50 , 450 , i*50);//橫線
               line(i*50,   50 , i*50, 450 );//直線
                 }
       }
2.讀到1時畫黑子
=> if(go[i][j]==1){
         fill(0);
         ellipse( 50+j*50 , 50+i*50 , 50, 50); 
       }
3.讀到2時畫白子
=>  else if(go[i][j]==2){
         fill(255);
         ellipse( 50+j*50 , 50+i*50 , 50, 50);
       }

```
## 真的可以玩的圍棋來啦!!(白子先攻)
```C
1.設定1變數為n
2.判斷下棋的位置             
=> int j = (mouseX-25)/50;
      int i = (mouseY-25)/50;
3.切換黑白子
=> go[i][j] = (N%2==0)?1:2;


```
## SECOND PROGRAM
```C
void setup(){
 size(500,500); 
}
int [][] go={
  {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}, 
};///建立9*9的陣列
int N=0;
void mousePressed()
{
    int j = (mouseX-25)/50;
    int i = (mouseY-25)/50;
    go[i][j] = (N%2==0)?1:2;
    N++;
}
void draw(){
   background(246,194,108);
   for(int i=1;i<=9;i++){
     for(int j=1;j<=9;j++){
       line( 50 , i*50 , 450 , i*50);//橫線
       line(i*50,   50 , i*50, 450 );//直線
     }
   }
   for(int i=0 ; i<9 ; i++){
     for( int j=0 ; j<9 ; j++){
       if(go[i][j]==1){
         fill(0);//當讀到1時畫黑棋
         ellipse( 50+j*50 , 50+i*50 , 50, 50); 
       }
       else if(go[i][j]==2){
         fill(255);
         ellipse( 50+j*50 , 50+i*50 , 50, 50);
       }
     }
   }
}

```

WPN

 week04

<因為動態島的發想 做一個互動小遊戲>

畫出一個持續向右上方移動的球(還不會反彈,會消失在邊邊)


<反彈>修改成碰到邊框會反彈(利用座標)


<加入移動方塊>畫出一個會跟隨鼠標移動的方塊,也將方塊表面設定為會反彈的面,不重複畫圓(去除殘影,不要有經過的路線)


<增加變化>當滑鼠按右鍵時,方塊會縮小,反彈面積減少,反之,按左鍵時會放大,反彈面積會增加


<圍棋>先用兩層迴圈畫出很多圓形


宣告陣列,利用0、1的判斷,來表示黑棋與白棋


<畫棋盤>利用迴圈畫棋盤   //Line(點1x座標 , 點1y座標,點2x座標,點2y座標),
0:代表沒有棋子, 1:黑棋 2:白棋


<滑鼠點擊放棋子>格子的長寬為50*50,所以當滑鼠點在格線交界處的長寬25內,棋子就會放在那個交界處,判斷要放黑棋還是白棋的方法為,棋子的總數為偶數的話,下一個就是黑棋,若不是就是白棋



week04_新手上碌

 1.接球遊戲


1-1.球移動

橢圓形 ellipse(x , y , 長, 寬 );

設加速度vx、vy控制移動方向與快慢:

float vx=1.0,vy=-0.5;

  x=x+vx;

  y=y+vy;

  if(x>500)vx=-vx;

  if(y<0)vy*=-1;

  if(x<0)vx*=-1;

1-2.板子移動

用背景色清除之前球的殘影 backgroung( color );

用滑鼠控制板子左右移動  int boardX=mouseX;



1-3.差邊球加速度

把板子長寬高換成變數 boardY、boardW、boardH

前一滑鼠的X位置  pmouseX
vx+=(mouseX-pmouseX)/2;  ///除以2>>不要變太快


 2.下棋

2-1.迴圈畫棋子

雙層迴圈 畫9*9的棋子

for(int i=0; i<??? ;  ???)        ///  i控制直向>>Y座標

    for(int j=0; j<??? ; ???) {     ///  j控制橫向>>X座標

}


2-2.迴圈+陣列 放棋子

宣告陣列 int [] [] name={   {1,2,3,4} , {5,6,7,8},     };



2-3.畫棋盤
for(int i=1;i<=9;i++){
    line( 50,50*1,450,50*i); //line(點1x座標 , 點1y座標,點2x座標,點2y座標);

}
0:空棋、1:黑棋、2:白棋



2-3.畫棋盤
以滑鼠控制放棋
>>>>棋格長寬50*50、左邊邊界長25 

減掉邊界再對50取餘數
int j=(mouseX-25)/50:   ///j控制x座標

判斷式決定顏色>>>若旗子總數為偶數 設為黑棋 否為白棋




Ru的互動技術筆記💨

Step01 

    1.模擬 I14 動態島小遊戲,做一顆會動的球,打彈珠的遊戲

        -先做出一顆往右上方移動的球


        -再設定球反彈的座標
    2.將三個邊的反彈界線都設定好,在最下面加上一個方塊,讓球碰到方塊的時候向上反彈

        -設定背景 background();

        -加入一個變數,因為滑鼠移動方塊,方塊的位置會一直改變 int boardX = mouseX;

Step02

    1.調整方塊大小

        -宣告四個變數 float boardX, boardY=470, boardW=100, boardH=20;

        -方塊的起始值 Y=470, W=100, H=20

        -調整成:按滑鼠右鍵縮小,按左鍵放大

    2.製作棋盤

        -用迴圈畫出很多圍棋


    3.用陣列改變棋子的顏色

        -1是黑色,0是白色


Step03

    1.做出更好的棋盤!

        -把背景改成木頭色

        -用迴圈畫棋盤的格線(9*9)

        -寫好迴圈的程式碼後,手動更改上面列的數字,1是黑色,2是白色



    2.做出完整的棋盤!

        -



互動week04

1. 製作一顆球且恆動

void setup(){

  size(500,500);

}

int x=250, y=250;//變數(位置)

void draw(){

  ellipse( x, y, 10, 10);//橢圓

  x = x + 1;

  y = y + -1;

}


2. 球碰到邊框會反彈

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;
  if( x < 0) vx = -vx;
}

3. 去掉球殘影且碰到底部長條會反彈

void setup(){
  size(500,500);
}
float x=250, y=250;//變數(位置)精細
float vx = 1.0 , vy = -0.5;
void draw(){
  background(#FFFFF2);//背景,去除殘影
  int boardX = mouseX;
  rect(boardX, 470, 100, 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+100 ) vy = -vy;
}

4.改變球碰板子後移速且控子板子長度

void setup(){
  size(500,500);
}
float x=250, y=250;//變數(位置)精細
float vx = 2.0 , vy = -1.5;
float boardX, boardY=470, boardW=100, boardH=20;
void draw(){
  boardX = mouseX-boardW/2;
  background(#FFFFF2);//背景,去除殘影
  rect(boardX, boardY, boardW, boardH);//控制的板子
  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>boardY && y<boardY+boardH) &&
      (x>boardX && x<boardX+boardW) ){
    vy = -vy;
    vx += (mouseX-pmouseX)/2;//mouse的移動速度
  }
  if(mousePressed && mouseButton==LEFT) boardW *= 1.01;//左鍵板子變長1%
  if(mousePressed && mouseButton==RIGHT) boardW *= 0.99;//右鍵板子縮短1%
}


B

1.多個棋子

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.陣列9X9個黑白棋

void setup(){
  size(500,500);
}
int [][] go ={
  {0,0,0,1,0,0,0,0,1},
  {0,0,0,0,0,1,0,0,0},
  {0,1,0,0,0,0,0,0,1},
  {0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,0,0,1},
  {0,0,0,1,0,0,0,0,1},
  {0,1,0,0,0,0,1,0,0},
  {0,0,0,1,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.畫出棋盤並減少棋子數量

void setup(){
  size(500,500);
}
int [][] go ={
  {0,0,0,1,0,0,0,0,1},
  {0,0,0,0,0,1,0,0,0},
  {0,1,0,0,0,0,0,2,1},
  {0,0,2,0,0,0,0,0,0},
  {0,0,0,2,0,1,0,0,1},
  {0,0,0,1,0,0,0,0,1},
  {0,1,0,0,0,0,1,0,0},
  {0,0,0,1,2,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){
        fill(0);//1:黑棋
        ellipse(50+j*50, 50, 40, 40);
      }else if(go[i][j]==2){
        fill(255);//2:白棋
        ellipse(50+j*50, 50+i*50, 40, 40);
      }
    }
  }
}


4.下棋

void setup(){
  size(500,500);
}
int [][] go ={
  {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; //右手j, 對應x座標
  int i = (mouseY-25)/50; //左手i, 對應y座標
  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){
        fill(0);//1:黑棋
        ellipse(50+j*50, 50+i*50, 40, 40);
      }else if(go[i][j]==2){
        fill(255);//2:白棋
        ellipse(50+j*50, 50+i*50, 40, 40);
      }
    }
  }
}

互動程式week04

移動的球

void setup()
{
  size(500,500);
}
int x = 250,y=250;
void draw()
{
  ellipse(x,y,10,10);
  x = x+1;
  y = y-1;
}

會反彈的球

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 > 500) vy = -vy;
  if(x < 0) vx = -vx;
  if(y < 0) vy = -vy;
}

乒乓球

void setup()
{
  size(500,500);
}
float x = 250,y=250;
float vx = 2.0,vy = -1.5;
void draw()
{
  background(#FFFFFF);
  float boardX = mouseX;
  rect(boardX,470,100,20,20);
  ellipse(x,y,10,10);
  x = x + vx;
  y = y + vy;
  if( x > 500) vx = -vx;
  if(x < 0) vx = -vx;
  if(y < 0) vy = -vy;
  if(y>470 && x>boardX && x<boardX+100) vy = -vy;
}

乒乓球有加速度

void setup()
{
  size(500,500);
}
float x = 250,y=250;
float vx = 2.0,vy = -1.5;
float boardX,boardY = 470,boardW = 100,boardH = 20;
void draw()
{
  background(#FFFFFF);
  boardX = mouseX-boardW/2;
  rect(boardX,boardY,boardW,boardH,20);
  ellipse(x,y,10,10);
  x = x + vx;
  y = y + vy;
  if( x > 500) vx = -vx;
  if(x < 0) vx = -vx;
  if(y < 0) vy = -vy;
  if((y>boardY && y<boardY+boardH) && (x>boardX && x<boardX+boardW))
  {
    vy = -vy;
    vx += (mouseX-pmouseX)/2;
  }
}

圍棋
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);
    }
  }
}

圍棋(更新)

void setup()
{
  size(500,500);
}
int [][]  go = {
  {0,0,0,0,0,0,0,0,0},
  {0,1,1,1,0,1,1,1,0},
  {0,1,1,1,0,1,1,1,0},
  {0,1,1,1,0,1,1,1,0},
  {0,0,0,1,1,1,0,0,0},
  {0,1,1,1,1,1,1,1,0},
  {0,1,1,0,0,0,1,1,0},
  {0,1,1,0,0,0,1,1,0},
  {0,0,0,0,0,0,0,0,0} 
};
void draw()
{
  for(int i=0;i<9;i++)
  {
    for(int j=0;j<9;j++)
    {
      if(go[i][j]==1) fill(0);
      else fill(255);
      ellipse(50+j*50,50+i*50,50,50);
    }
  }
}


圍棋(可以玩)

void setup()
{
  size(500,500);
}
int [][]  go = {
 {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}
};
int N=0;
void mousePressed()
{
    int j = (mouseX-25)/50;
    int i = (mouseY-25)/50;
    go[i][j] = (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++)
  {
    for(int j=0;j<9;j++)
    {
      if(go[i][j]==1)
      {
        fill(0);
        ellipse(50+j*50,50+i*50,40,40);
      }
      else if(go[i][j]==2)
      {
        fill(255);
        ellipse(50+j*50,50+i*50,40,40);
      }
    }
  }
}