2023年11月23日 星期四

XX - Week11

 



=========================================================================

ELEVENTH

今天要來做隨機排座位跟畫面轉場,還有一些同學的問題



1.先做出座位的格子,並能夠安排號碼上去(這裡先全用Hello代替)
void setup(){
  size(600,500);
}
void draw(){
  background(255);
  for(int i=0; i<4; i++){
    for(int j=0; j<6; j++){
      fill(#F5B4B4); rect(j*100, i*100, 100, 100);
      fill(0); text("Hello", j*100+25, i*100+50);
    }
  }
}


2.接著利用value陣列將亂數印出來
void setup(){
  size(600,500);
  for(int i=0; i<4; i++){
    for(int j=0; j<6; j++){
      value[i][j] = int(random(40));
    }
  }
}
int [][] value = new int[4][6];
void draw(){
  background(255);
  for(int i=0; i<4; i++){
    for(int j=0; j<6; j++){
      fill(#F5B4B4); rect(j*100, i*100, 100, 100);
      fill(0); text(value[i][j], j*100+25, i*100+50);
    }
  }
}
註:value陣列的數字會有重複,數字之後要做調整




3.這裡先做2次的數字交換(這邊是13和27交換、26和33交換)
void setup(){
  size(600,500);
  for(int i=0; i<4; i++){
    for(int j=0; j<6; j++){
      value[i][j] = i*6+j+10;//從10開始數字不重複
    }
  }
  for(int k=0; k<2; k++){
    int i=int(random(4)), j=int(random(6));
    int i2=int(random(4)), j2=int(random(6));
    int temp = value[i][j];
    value[i][j] = value[i2][j2];
    value[i2][j2] = temp;
  }
}
int [][] value = new int[4][6];
void draw(){
  background(255);
  for(int i=0; i<4; i++){
    for(int j=0; j<6; j++){
      fill(#F5B4B4); rect(j*100, i*100, 100, 100);
      fill(0); text(value[i][j], j*100+25, i*100+50);
    }
  }
}
註:先按照順序印出來再做亂數排列,這裡的k迴圈是先做2次而已,temp則是利用2個不同的數字做交換


4.想做轉場換關卡,這邊是按下滑鼠就會變成紅色
int state=0; //0:white, 1:red, 2:blue
void setup(){
  size(400,400);
  textSize(50);
}
void draw(){
  if(state==0){//第0關 white
    background(255);
    fill(0); text("Click to Start",80,200);  
  }
  else if(state==1){//第1關 red
    background(255,0,0);
  }
  else if(state==2){//第2關 blue
    background(0,0,255);
  }
}
void mousePressed(){
  if(state==0) state=1;
}
註:利用state來實施改變顏色


5.從紅色的關卡換到藍色的關卡
int state=0; //0:white, 1:red, 2:blue
void setup(){
  size(400,400);
  textSize(50);
}
int x=50, y=50;
void draw(){
  if(state==0){//第0關 white
    background(255);
    fill(0); text("Click to Start",80,200);  
  }
  else if(state==1){//第1關 red
    background(255,0,0);
    fill(255); rect(300, 50, 50, 50);
    fill(128); rect(x, y, 50, 50);
  }
  else if(state==2){//第2關 blue
    background(0,0,255);
  }
}
void mousePressed(){
  if(state==0) state=1;
}
void keyPressed(){
  if(state==1 && keyCode==RIGHT){
    x += 10;
    if(x==300) state=2;
  }
}
註:利用方塊到達指定位子來判斷並state的值


6.用倒數計時來讓我們能回到前面的關卡
int state=0; //0:white, 1:red, 2:blue
void setup(){
  size(400,400);
  textSize(50);
}
int x=50, y=50, t=100;
void draw(){
  if(state==0){//第0關 white
    background(255);
    fill(0); text("Click to Start",80,200);  
    x=50;
  }
  else if(state==1){//第1關 red
    background(255,0,0);
    fill(255); rect(300, 50, 50, 50);
    fill(128); rect(x, y, 50, 50);
    t=100;
  }
  else if(state==2){//第2關 blue(倒數10秒)
    background(0,0,255);
    fill(255, 255, 0); text("Wait "+ t, 80, 200);
    t--;
    if(t==0) state=0;
  }
}
void mousePressed(){
  if(state==0) state=1;
}
void keyPressed(){
  if(state==1 && keyCode==RIGHT){
    x += 10;
    if(x==300) state=2;
  }
}
註:用t--來讓100倒數,最後改變到state=0的白色關卡


以下是同學提問的部分

1.想要做籃球機(先做出拋物線跟球)
PImage imgRack;
void setup(){
  size(400, 600);
  imgRack = loadImage("rack.jpg");
}
void draw(){
  background(255);
  image(imgRack, 0, 0);
  if(mousePressed){
    fill(255); ellipse(posX, posY, 20, 20);
    line(posX, posY, mouseX, mouseY);
  }
  fill(#FFA652); ellipse(mouseX, mouseY, 20, 20);
}
float posX=-100, posY=-100;
void mousePressed(){
  posX = mouseX;
  posY = mouseY;
}


2.做出將球丟出去(記得要加上重力加速度)
PImage imgRack;
void setup(){
  size(400, 600);
  imgRack = loadImage("rack.jpg");
}
void draw(){
  background(255);
  image(imgRack, 0, 0);
  if(flying){
    x += vx;
    y += vy;
    vy += 0.98;
  }
  else{
    x = mouseX;
    y = mouseY;
    if(mousePressed){
      fill(255); ellipse(posX, posY, 20, 20);
      line(posX, posY, x, y);
    }
  }
  fill(#FFA652); ellipse(x, y, 20, 20);
}
boolean flying = false;
float x, y, vx, vy;
float posX=-100, posY=-100;
void mousePressed(){
  posX = mouseX;
  posY = mouseY;
  flying = false;
}
void mouseReleased(){
  vx = posX-mouseX;
  vy = posY-mouseY;
  flying = true;
}
註:利用mouseReleased判斷是否要將球丟出去


踩地雷
int [][] mine = new int[9][9];
void setup(){
  size(450,450);
  for(int i=0; i<9; i++) mine[i][0]=9;
  for(int k=0; k<1000; k++){
    int i = int(random(9)), j = int(random(9));
    int i2 = int(random(9)), j2 = int(random(9));
    int temp = mine[i][j];
    mine[i][j] = mine[i2][j2];
    mine[i2][j2] = temp;
  }
  for(int i=0; i<9; i++){
    for(int j=0; j<9; j++){
      if(mine[i][j]==9){//遇到紅色地雷,附近要+1
        addNumber(i-1, j-1);
        addNumber(i-1, j);
        addNumber(i-1, j+1);
        addNumber(i, j-1);
        //addNumber(i, j);//自己本身
        addNumber(i, j+1);
        addNumber(i+1, j-1);
        addNumber(i+1, j);
        addNumber(i+1, j+1);
      }
    }
  }
}
void addNumber(int i, int j){
  if(i<0 || j<0 || i>=9 || j>=9) return;
  if(mine[i][j]!=9) mine[i][j]++;
}
void draw(){
  for(int i=0;i<9;i++){
    for(int j=0; j<9; j++){
      if(mine[i][j]==9) fill(255, 128, 128);
      else fill(255);
      rect(j*50, i*50, 45, 45);
      if(mine[i][j]!=0){
        fill(0); text(""+mine[i][j], j*50+23, i*50+23, 45, 45);  
      }
    }
  }
}
貪吃蛇(360版本)
void setup(){
  size(600,400);
}
float x=300, y=200, dir=0;
void draw(){
  //background(0);
  joker(x,y,dir);
  x += cos(dir);
  y += sin(dir);
}
void joker(float x, float y, float dir){
  ellipse(x, y, 50, 50);
  line(x, y, x+25*cos(dir),y+25*sin(dir) );
}
void keyPressed(){
  if(keyCode==RIGHT) dir += 0.1;
  if(keyCode==LEFT) dir -= 0.1;
}

沒有留言:

張貼留言