2022年9月26日 星期一

TC*(˙Ⱉ˙ฅ)​-week04

 

彈力球&圍棋

先來學習彈力球如何製作吧

第一個程式:week04_1_moving_ball_x_y

用xy控制座標,圓球就會一直跑

ellipse( x , y , 寬 , 長);    //畫出橢圓,讓x,y慢慢增加

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


第二個程式:week04_2_moving_ball_x_y_by_vx_vy
用float新設兩個變數 vx ,vy ,並且 x,y也要改用float,因為使用float可以更精細
設定if-else ,當x超過畫面就換方向且y超過上面就會反彈(圓球碰到邊邊會進行反彈)

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;

}

第三個程式:week04_3_board_if_collision
背景上色去除殘影後,製作出一個板子,讓球碰到板子可以進行反彈
void draw 設定 background 使每次執行都會蓋過上一個球
rect 設定板子,設定int boardx= mouseX; 
rect( mouseX , 470 , 寬 , 長 , 弧度); 使方塊能跟滑鼠一起動
設定球碰到板子反彈,到板子的y位置和 x~x+100的位置就會反彈

void setup()
{
  size(500,500);
}
float x=250,y=250;//變數(位置)
float vx=1.0,vy=-1.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;//x>500時回彈
  if( y < 0 )  vy=-vy;
  if( x < 0 )  vx=-vx;
  if(y>470 && x>boardX && x<boardX+100) vy=-vy;//470是板子的高度,這樣碰到板子就會回彈
}





第四個程式:week04_4_boardX_boardY_boardW_boardH
使用board設定變數,當長壓滑鼠左鍵時,底下的白色板子就會向左右兩邊拉長
boardx改為 mouseX- boardW/2 板子會在中間控制
(mouseX - pmouseX)/2 算出滑鼠的移動量加到vx
運用mousePressed  和 mouseButton,設定按下左鍵或右鍵板子會放大縮小

void setup()

{

 size(500,500);

}

float x=250,y=250; //變數(位置)精細

float vx=2.0,vy=-2.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 || x<0 ) vx=-vx;//x>500時回彈

 if(y < 0 ) vy=-vy;

 if( ( y>boardy && y<boardy+30 ) && ( x>boardx && x<boardx+boardW))

 {

   ///470是板子的高度(要在邊框內),這樣球碰到板子才會回彈

   vy=-vy;

   vx += (mouseX- pmouseX)/2; //mouse滑鼠地移動速度

 }

 if(mousePressed && mouseButton==LEFT) boardW *= 1.01; ///按並是左鍵

 if(mousePressed && mouseButton==RIGHT) boardW *= 0.99;///按並是右鍵

}



接下來我們來學習如何製作圍棋
第五個程式:week04_5_simple_go
畫出所有圍棋,建立9*9陣列 (裡面暫時都放0,表示為白色)
在draw函式裡頭進行雙迴圈,偵測陣列裡面的值

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


第六個程式:week04_6_simple_go_array
將圍棋上色,並使用if -else判斷,如果值為1就填充黑色,如果值為0就是填充白色
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);
    }
  }
}


第七個程式:week04_7_background_line_white_black_go
使用雙層迴圈畫線條, line( x1 , y1, x2, y2); 若x 或 y 分別乘 i ,會有好幾條線
偵測棋子的if-else指令修改,當為1時就下黑棋,為2時就下白旗,兩個都不是就不下棋

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,2,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(){//用迴圈畫出很多棋
  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_8_mousePRESSED_PUT_GO_BY_25_50
切換黑白棋,一個下完換另一個顏色下棋
我們先將陣列清零,再來設定int N=0 
使用go[i][j]=(N%2==0) ? 1: 2; 
意思是如果(N%2==0) 用1,否則就用2,並放進陣列相應位置
再去判別現在要下的是黑棋還是白棋,最後N++

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,對應y座標
  int i= (mouseY-25)/50;//左手i,對應y座標
  go[i][j] = (N%2==0) ? 1 : 2 ;//if(N%2==)用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);
      }
    }
  }
}





沒有留言:

張貼留言