2023年10月5日 星期四

UU_week04

   

2023/10/05

UNO抽卡







1. 先畫好卡片格子

// UNO抽牌
void setup()
{
  size(400, 400);
}

int [][] card = new int[8][11];
void draw()
{
  background(255);
  for (int i=0; i<8; i++){
    for (int j=0; j<11; j++){
      rect(j*32, i*50, 32, 50); // 畫四邊形
    }
  }
}














2. 卡片上色

// UNO抽牌
void setup(){
  size(400, 400);
}

int [][] card = new int[8][11];
color [] C = {#FF5555, #FFAA00, #55AA55, #5555FF}; // red, yellow, green, blue
void draw(){
  background(255);
  for (int i=0; i<8; i++){
    for (int j=0; j<11; j++){
      fill(C[i%4]); // 取餘上色
      rect(j*32, i*50, 32, 50); // 畫四邊形
    }
  }
}















3. 新增一個 fuction 統整上色程式, 用 rect(a, b, c, d, r) 來畫圓弧形










void setup(){   size(400, 400); } int [][] card = new int[8][11]; color [] C = {#FF5555, #FFAA00, #55AA55, #5555FF}; void draw(){   background(255);   for (int i=0; i<8; i++){     for (int j=0; j<11; j++){       drawCard(j*32, i*50, C[i%4]);     }   } } void drawCard(int x, int y, color c){   stroke(128); // gray stroke   fill(255); // white   rect(x, y, 32, 50, 7);   noStroke();   fill(c);   rect(x+2, y+3, 32-5, 50-5, 4); }
4. 加上白色橢圓部分, 用陣列進行移動旋轉

void setup(){
  size(400, 400);
}

int [][] card = new int[8][11];
color [] C = {#FF5555, #FFAA00, #55AA55, #5555FF}; // red, yellow, green, blue
void draw(){
  background(255);
  for (int i=0; i<8; i++){
    for (int j=0; j<11; j++){
      drawCard(j*32, i*50, C[i%4]);
    }
  }
}
void drawCard(int x, int y, color c){
  stroke(128); // gray stroke
  fill(255); // white
  rect(x, y, 32, 50, 7);
  noStroke();
  fill(c);
  rect(x+2, y+3, 32-5, 50-5, 4);
  
  pushMatrix();
  fill(255); // white
  translate(x+16, y+25); // 移動, 加上卡片中心的一半
  rotate(radians(45)); // 轉動45度
  ellipse(0, 0, 20, 30);
  popMatrix();
}




















5. 填左上角的正位數字+正中心的大數字



















6. 加上變數 n , 使其在迴圈中 run 出 1-10的數字

// UNO抽牌
void setup(){
  size(400, 400);
}

int [][] card = new int[8][11];
color [] C = {#FF5555, #FFAA00, #55AA55, #5555FF}; // red, yellow, green, blue
void draw(){
  background(255);
  for (int i=0; i<8; i++){
    for (int j=0; j<11; j++){
      drawCard(j*32, i*50, C[i%4], j);
    }
  }
}
void drawCard(int x, int y, color c, int n){
  stroke(128); // gray stroke
  fill(255); // white
  rect(x, y, 32, 50, 7);
  noStroke();
  fill(c);
  rect(x+2, y+3, 32-5, 50-5, 4);
  
  pushMatrix();
  fill(255); // white
  translate(x+16, y+25); // 移動, 加上卡片中心的一半
  rotate(radians(45)); // 轉動45度
  ellipse(0, 0, 20, 30);
  popMatrix();
  
  
  textAlign(CENTER, CENTER); // 放中心才不會偏
  textSize(10);
  text(""+n, x+7, y+6);
  
  textSize(20);
  fill(c);
  text(""+n, x+16, y+22);
}
















7. 洗牌準備, 先全部歸零之後再上色






















8. 用tmp交換來洗牌(一張)















9. 加上for loop進行多次洗牌

// UNO抽牌
void setup(){
  size(400, 400);
  myShuffle();
}
void myShuffle(){
  for (int i=0; i<8; i++){
    for (int j=0; j<11; j++){
      cardN[i*11+j] = j;
      cardC[i*11+j] = C[i%4];
    }
  }
  // random()會取浮點數, 需要加上int
  for (int i=0; i<10000; i++){ // 洗牌 10000 次
    int r1 = int(random(88)), r2 = int(random(88)); 
    int tmp = cardN[r1];
    cardN[r1] = cardN[r2];
    cardN[r2] = tmp;
    tmp = cardC[r1];
    cardC[r1] = cardC[r2];
    cardC[r2] = tmp;
  }
}
// int [][] card = new int[8][11];
int [] cardN = new int[88]; // card number
int [] cardC = new int[88]; // card color
color [] C = {#FF5555, #FFAA00, #55AA55, #5555FF};
void draw(){
  background(255);
  for (int i=0; i<8; i++){
    for (int j=0; j<11; j++){
      // drawCard(j*32, i*50, C[i%4], j);
      drawCard(j*32, i*50, cardC[i*11+j], cardN[i*11+j]);  
    }
  }
}
void drawCard(int x, int y, color c, int n){
  stroke(128); // gray stroke
  fill(255); // white
  rect(x, y, 32, 50, 7);
  noStroke();
  fill(c);
  rect(x+2, y+3, 32-5, 50-5, 4);
  
  pushMatrix();
  fill(255); // white
  translate(x+16, y+25); // 移動, 加上卡片中心的一半
  rotate(radians(45)); // 轉動45度
  ellipse(0, 0, 20, 30);
  popMatrix();
  
  
  textAlign(CENTER, CENTER); // 放中心才不會偏
  textSize(10);
  text(""+n, x+7, y+6);
  
  textSize(20);
  fill(c);
  text(""+n, x+16, y+22);
}
























10. 挑出一張大牌放在右邊, 把所有數字*s

// UNO抽牌
void setup(){
  size(800, 400);
  myShuffle();
}
void myShuffle(){
  for (int i=0; i<8; i++){
    for (int j=0; j<11; j++){
      cardN[i*11+j] = j;
      cardC[i*11+j] = C[i%4];
    }
  }
  // random()會取浮點數, 需要加上int
  for (int i=0; i<10000; i++){ // 洗牌 10000 次
    int r1 = int(random(88)), r2 = int(random(88)); 
    int tmp = cardN[r1];
    cardN[r1] = cardN[r2];
    cardN[r2] = tmp;
    tmp = cardC[r1];
    cardC[r1] = cardC[r2];
    cardC[r2] = tmp;
  }
}
// int [][] card = new int[8][11];
int [] cardN = new int[88]; // card number
int [] cardC = new int[88]; // card color
color [] C = {#FF5555, #FFAA00, #55AA55, #5555FF};
void draw(){
  background(255);
  for (int i=0; i<8; i++){
    for (int j=0; j<11; j++){
      // drawCard(j*32, i*50, C[i%4], j);
      drawCard(j*32, i*50, cardC[i*11+j], cardN[i*11+j], 32); // 32小卡片  
    }
  }
  drawCard(450, 50 ,cardC[0], cardN[77], 128);
}
void drawCard(int x, int y, color c, int n, int w){ // w 寬度代表小卡片
  float s = w/32.0; // scale size
  stroke(128); // gray stroke
  fill(255); // white
  rect(x, y, 32*s, 50*s, 7*s);
  noStroke();
  fill(c);
  rect(x+2.5*s, y+2.5*s, 32*s-5*s, 50*s-5*s, 5*s);
  
  pushMatrix();
  fill(255); // white
  translate(x+16*s, y+25*s); // 移動, 加上卡片中心的一半
  rotate(radians(45)); // 轉動45度
  ellipse(0, 0, 20*s, 30*s);
  popMatrix();
  
  
  textAlign(CENTER, CENTER); // 放中心才不會偏
  textSize(10*s);
  text(""+n, x+7*s, y+6*s);
  textSize(20*s);
  fill(c);
  text(""+n, x+16*s, y+22*s);
}


















11. 牌庫抽牌









































12. 最後程式碼

// UNO抽牌
void setup(){
  size(800, 400);
  myShuffle();
}
void myShuffle(){
  for (int i=0; i<8; i++){
    for (int j=0; j<11; j++){
      cardN[i*11+j] = j;
      cardC[i*11+j] = C[i%4];
    }
  }
  // random()會取浮點數, 需要加上int
  for (int i=0; i<10000; i++){ // 洗牌 10000 次
    int r1 = int(random(88)), r2 = int(random(88)); 
    int tmp = cardN[r1];
    cardN[r1] = cardN[r2];
    cardN[r2] = tmp;
    tmp = cardC[r1];
    cardC[r1] = cardC[r2];
    cardC[r2] = tmp;
  }
}
// int [][] card = new int[8][11];
int [] cardN = new int[88]; // card number
int [] cardC = new int[88]; // card color
color [] C = {#FF5555, #FFAA00, #55AA55, #5555FF};
void draw(){
  background(255);
  if (mousePressed && mouseButton==RIGHT){ // 點右鍵才可以顯示出所有牌
    for (int i=0; i<8; i++){
      for (int j=0; j<11; j++){
        // drawCard(j*32, i*50, C[i%4], j);
        drawCard(j*32, i*50, cardC[i*11+j], cardN[i*11+j], 32); // 32小卡片  
      }
    }
  }else drawCard(50, 50, #000000, 99, 128); // deck
  
  for (int i=0; i<myCard; i++){
     drawCard(450+40*i, 50, cardC[i], cardN[i], 128);
  }
}
int  myCard = 0; // 一開始0張牌
void mousePressed(){
  if (mouseButton==LEFT) myCard++;
}
void drawCard(int x, int y, color c, int n, int w){ // w 寬度代表小卡片
  float s = w/32.0; // scale size
  stroke(128); // gray stroke
  fill(255); // white
  rect(x, y, 32*s, 50*s, 7*s);
  noStroke();
  fill(c);
  rect(x+2.5*s, y+2.5*s, 32*s-5*s, 50*s-5*s, 4*s);
  
  pushMatrix();
  fill(255); // white
  translate(x+16*s, y+25*s); // 移動, 加上卡片中心的一半
  rotate(radians(45)); // 轉動45度
  ellipse(0, 0, 20*s, 30*s);
  popMatrix();
  
  
  textAlign(CENTER, CENTER); // 放中心才不會偏
  textSize(10*s);
  text(""+n, x+7*s, y+6*s);
  textSize(20*s);
  fill(c);
  text(""+n, x+16*s, y+22*s);
}

A. 四人發牌




沒有留言:

張貼留言