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}; 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); }
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. 洗牌準備, 先全部歸零之後再上色
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); }
沒有留言:
張貼留言