2023年10月5日 星期四

遊玩吧紅姬

 STEP 01

1.開啟processing

2.開個視窗

3.用陣列和左手i右手j做牌


STEP 02

1.用小畫家的滴管效果配合維基百科上的UNO圖,取得色號

2.開陣列放上剛才取得的色號,並且利用fill填滿顏色

3.有4種花色,取4的餘數,%4


STEP 03

1.要做更好的牌,另外弄個函數來畫卡片

2.加上白邊,並且讓它有點圓弧的感覺,兩組fill跟rect分內外


STEP 04

1.要做牌裡面白色橢圓形的那個東西

2.利用之前電腦圖學課學到的pushMatrix(備份矩陣)和popMatrix(還原矩陣),做橢圓形


STEP 05

1.卡片上還缺少數字,需要補上

2.先以1,做測試


3.補上其他數字


STEP 06

1.現在只有展示牌,一個卡牌遊戲是要洗牌的

2.設一個函數myShuffle用來洗牌

3.用random和temp來配合

效率不好,只洗一張

STEP 07

1.上個程式碼一次洗一張,洗得不是很乾淨,決定使用迴圈讓它多洗幾次,這樣就會乾淨了

洗10000次

STEP8

1.牌太小了,要把牌放大

2.我們設一個s作為卡牌放大倍率,並宣告w配合使用

3.在畫圖的部分都承上s,得等比例放大的牌

STEP 09

1.規則上有抽牌的機制,玩家一開始也會有手牌,所以必須設計抽牌

2.用黑色寫99的牌作為牌組,從當中抽牌,並且設計了一個作弊按鈕,按著滑鼠右鍵會顯示洗牌後,牌組的結果和內容,目的是確認抽出的牌順序是否符合,程式碼為:



3.為了避免抽了複數的卡片重疊,平面無法得知張數,每抽一張要讓下一張稍微往旁邊一點,程式碼為:





4.左鍵抽牌:


STEP 10

1.要讓四個人都抽牌,用取餘數跟變換位置(Y軸),讓四位玩家以順時針方向抽牌



今日最終結果:

void setup(){
  size(1000,1000);
  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];
    }
  }
  for(int i=0; i<10000; i++){
    int a = int(random(88)), b = int(random(88));
    int temp = cardN[a];
    cardN[a] = cardN[b];
    cardN[b] = temp;
    temp = cardC[a];
    cardC[a] = cardC[b];
    cardC[b] = temp;
  }
}
//int [][] card = new int[8][11];
int [] cardN = new int[88];
int [] cardC = new int[88];
color [] C = {#FF5555, #FFAA00, #55AA55, #5555FF};
void draw(){
  background(255);
  if(mousePressed && mouseButton==RIGHT){//view deck偷看牌組
    for(int i=0;i<8;i++){
      for(int j=0;j<11;j++){
        drawCard(j*32, i*50, cardC[i*11+j], cardN[i*11+j], 32);
      }
    }
  }else drawCard(50, 50, #000000, 99,128);//deck牌組
  for(int i=0;i<myCard;i++){
    if(i%4==0) drawCard(430 +40*i/4,50, cardC[i], cardN[i], 128);//玩家1拿牌
    if(i%4==1) drawCard(630 +40*i/4,350, cardC[i], cardN[i], 128);//玩家2拿牌
    if(i%4==2) drawCard(430 +40*i/4,650, cardC[i], cardN[i], 128);//玩家3拿牌
    if(i%4==3) drawCard(230 +40*i/4,350, cardC[i], cardN[i], 128);//玩家4拿牌
  }
}
int myCard = 0;
void mousePressed(){
  if(mouseButton==LEFT) myCard++;
}
void drawCard(int x, int y, color C, int n, int w){
  float s = w/32.0;//放大倍率
  stroke(128);//灰色
  fill(255);//白
  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);//填白色
  translate(x+16*s, y+25*s);//移到中心點
  rotate(radians(45));//如無旋轉,橢圓會是直立的
  ellipse(0, 0, 20*s, 30*s);//橢圓形
  popMatrix();
  
  textAlign(CENTER,CENTER);
  textSize(10*s);//大小
  text(""+n, x+7*s, y+6*s);//左上的字
  
  textSize(18*s);//字大小
  fill(C);//上色
  text(""+n, x+16*s, y+22*s);//中間的字
}

沒有留言:

張貼留言