2022年9月19日 星期一

TC*(˙Ⱉ˙ฅ)​-week03

 

Poker洗牌

複習上週程式,將最後一個程式再更精簡(不過依然有可能遇見相同牌面的情況)

創造函式void myShuffle(); 和 void mousePressed(); 

並且把洗牌的程式碼放進myShuffle();

void setup 和 void mousePressed 裡要呼叫 myShuffle();

第一個程式:week03_1_review_shuffle_code

void setup()

{

  size(500,500);

  PFont font = createFont("標楷體",40);//調整字形與字體大小

  textFont(font);//宣告變數名稱

  myShuffle();

}//洗牌的英文:shuffle

void myShuffle()

{

  String [] flower = {"黑桃","紅心","方塊","梅花"};//陣列

  face1 = flower[int(random(4))]+int(random(13)+1);

  face2 = flower[int(random(4))]+int(random(13)+1);

  face3 = flower[int(random(4))]+int(random(13)+1);

  face4 = flower[int(random(4))]+int(random(13)+1);

  //取整數0...12所以再加1

}

void mousePressed()//點擊左鍵隨機抽

{

  myShuffle();

}

String face1,face2,face3,face4;

void draw()

{

  drawPokerCard(100,100,face1);//使用函式

  drawPokerCard(130,150,face2);//使用函式

  drawPokerCard(160,200,face3);//使用函式

  drawPokerCard(190,250,face4);//使用函式

}

//牌面:黑桃Spades 紅心Hearts 方塊Diamonds 梅花Clubs

void drawPokerCard(int x,int y,String face)//牌面

{

  int W=25;

  fill(255);//白色

  rect(x-W/2,y-W/2,150+W,250+W,20);//弧度

  fill(#6AFFA4);//填滿顏色//綠色

  rect(x,y,150,250,20);//較小的

  //fill(0);//黑色的字(下面三行是修改)

  if(face.indexOf("黑桃") == -1 && face.indexOf("梅花") == -1)//如果不是黑桃或梅花

  fill(#FF0000);//字體顏色改成紅色

  else fill(0);

  textSize(40);//字體大小

  text(face,x,y+40);

}




為了更清楚Poker如何洗牌,我們來看一下


第二個程式:week03_2_52_cards

在draw的函式裡面創造52張牌的for迴圈

設定變數x,y取間隔,(i/10)除10是為了能夠一排可以放10張牌

i/10會有小數,因此要在前面加int強制轉成整數

void setup(){
  size(700,700);
}
void draw(){
  background(#FFFFF2);
  for(int i=0 ; i<52 ; i++)//迴圈
  {
    int x = (i%10)*60;//除法10餘數,個位數
    int y = int(i/10)*120;//十位數

    rect(x,y,60,120);
  }
}



第三個程式:week03_3_52_cards_faces

設定字體為中文標楷體(setup),格子放入我們想要填寫的數字

PFont font = createFont("標楷體",10 ); //字形與大小

textFont(font); //設定字形為font

建立花色的陣列(noteped++ 按搜尋,取代 ctrl + H 快速取代字)

在for迴圈使用text 指令印出花色

void setup(){

  size(700,700);

  PFont font = createFont("標楷體",10);

  textFont(font);

}

String [] faces = 

{

"黑桃A","黑桃2","黑桃3","黑桃4","黑桃5","黑桃6","黑桃7","黑桃8","黑桃9","黑桃10","黑桃J","黑桃Q","黑桃K",

"愛心A","愛心2","愛心3","愛心4","愛心5","愛心6","愛心7","愛心8","愛心9","愛心10","愛心J","愛心Q","愛心K",

"方塊A","方塊2","方塊3","方塊4","方塊5","方塊6","方塊7","方塊8","方塊9","方塊10","方塊J","方塊Q","方塊K",

"梅花A","梅花2","梅花3","梅花4","梅花5","梅花6","梅花7","梅花8","梅花9","梅花10","梅花J","梅花Q","梅花K",

};

void draw(){

  background(#FFFFF2);

  for(int i=0 ; i<52 ; i++)//迴圈

  {

    int x = (i%10)*60;//除法10餘數,個位數

    int y = int(i/10)*120;//十位數

    fill(255);

    rect(x,y,60,120);

    fill(0);

    text(faces[i],x+25,y+80);//text("ID:"+i,x+25,y+80);

  }

}



第四個程式:

調整一下排版跟字體大小,並把我們希望的撲克牌顏色做整理

畫面設大size(800,600),字體改為16,將i改為除13,一排放13張牌

用if -else 改變顏色, 使用indexOf( )找裡面的字,好讓紅心和方塊為紅色

void setup(){
  size(800,600);
  PFont font = createFont("標楷體",16);
  textFont(font);
}
String [] faces = 
{
"黑桃A","黑桃2","黑桃3","黑桃4","黑桃5","黑桃6","黑桃7","黑桃8","黑桃9","黑桃10","黑桃J","黑桃Q","黑桃K",
"紅心A","紅心2","紅心3","紅心4","紅心5","紅心6","紅心7","紅心8","紅心9","紅心10","紅心J","紅心Q","紅心K",
"方塊A","方塊2","方塊3","方塊4","方塊5","方塊6","方塊7","方塊8","方塊9","方塊10","方塊J","方塊Q","方塊K",
"梅花A","梅花2","梅花3","梅花4","梅花5","梅花6","梅花7","梅花8","梅花9","梅花10","梅花J","梅花Q","梅花K",

};
void draw(){
  background(#FFFFF2);
  for(int i=0 ; i<52 ; i++)//迴圈
  {
    int x = (i%13)*60;//除法10餘數,個位數
    int y = int(i/13)*120;//十位數
    fill(255);
    rect(x,y,60,120);
    if(faces[i].indexOf("紅心")==-1 && faces[i].indexOf("方塊")==-1)
    fill(0);//如果不是紅心或方塊就填黑色
    else fill(255,0,0);//如果是就填紅色

    text(faces[i],x+10,y+60);//text("ID:"+i,x+25,y+80);
  }
}



第五個程式:week03_5_shuffle_mousePressed

利用函式寫出當點擊滑鼠時,就會洗牌一次

首先新增mousePressed() 函式,並且設定變數 a,b 並取0~52亂數,如下

   int a = int(random(52)); 

   int b = int(random(52));

然後我們利用temp進行交換洗牌,小提醒!!temp是字串,要用String,因為我們要交換字~

   String temp = face[a];  

   face[a]=face[b];

   face[b]=temp;

下面就是我們的程式碼

void setup(){

  size(800,600);

  PFont font = createFont("標楷體",16);

  textFont(font);

}

String [] faces = 

{

"黑桃A","黑桃2","黑桃3","黑桃4","黑桃5","黑桃6","黑桃7","黑桃8","黑桃9","黑桃10","黑桃J","黑桃Q","黑桃K",

"紅心A","紅心2","紅心3","紅心4","紅心5","紅心6","紅心7","紅心8","紅心9","紅心10","紅心J","紅心Q","紅心K",

"方塊A","方塊2","方塊3","方塊4","方塊5","方塊6","方塊7","方塊8","方塊9","方塊10","方塊J","方塊Q","方塊K",

"梅花A","梅花2","梅花3","梅花4","梅花5","梅花6","梅花7","梅花8","梅花9","梅花10","梅花J","梅花Q","梅花K",

};

void draw(){

  background(#FFFFF2);

  for(int i=0 ; i<52 ; i++)//迴圈

  {

    int x = (i%13)*60;//除法10餘數,個位數

    int y = int(i/13)*120;//十位數

    fill(255);

    rect(x,y,60,120);

    if(faces[i].indexOf("紅心")==-1 && faces[i].indexOf("方塊")==-1)

    fill(0);

    else fill(255,0,0);

    text(faces[i],x+10,y+60);//text("ID:"+i,x+25,y+80);

  }

}

void mousePressed()//當點擊滑鼠時

{

  int a = int(random(52));

  int b = int(random(52));

  //目標:faces[a] vs. faces[b]交換

  String temp = faces[a];

  faces[a] = faces[b];

  faces[b] = temp;

}


第五個程式的小分支:week03_5_2_shuffle_mouseDragged

將mousePressed() 改成 mouseDragged() 意味著從滑鼠點擊變成使用滑鼠滾輪

void setup(){
  size(800,600);
  PFont font = createFont("標楷體",16);
  textFont(font);
}
String [] faces = 
{
"黑桃A","黑桃2","黑桃3","黑桃4","黑桃5","黑桃6","黑桃7","黑桃8","黑桃9","黑桃10","黑桃J","黑桃Q","黑桃K",
"紅心A","紅心2","紅心3","紅心4","紅心5","紅心6","紅心7","紅心8","紅心9","紅心10","紅心J","紅心Q","紅心K",
"方塊A","方塊2","方塊3","方塊4","方塊5","方塊6","方塊7","方塊8","方塊9","方塊10","方塊J","方塊Q","方塊K",
"梅花A","梅花2","梅花3","梅花4","梅花5","梅花6","梅花7","梅花8","梅花9","梅花10","梅花J","梅花Q","梅花K",
};
void draw(){
  background(#FFFFF2);
  for(int i=0 ; i<52 ; i++)//迴圈
  {
    int x = (i%13)*60;//除法10餘數,個位數
    int y = int(i/13)*120;//十位數
    fill(255);
    rect(x,y,60,120);
    if(faces[i].indexOf("紅心")==-1 && faces[i].indexOf("方塊")==-1)
    fill(0);
    else fill(255,0,0);
    text(faces[i],x+10,y+60);//text("ID:"+i,x+25,y+80);
  }
}
void mouseDragged()//當拖曳滑鼠時
{
  int a = int(random(52));
  int b = int(random(52));
  //目標:faces[a] vs. faces[b]交換
  String temp = faces[a];
  faces[a] = faces[b];
  faces[b] = temp;
}


最後我們和上禮拜的程式合併一下,就會有下面的成果囉

首先複製上周的花色陣列,並在myShuffle() 設定迴圈讓電腦自動多洗,然後將Poker洗牌的程式放入,洗好牌之後再設定好四張牌的face就可以了(這部分在下面有標顏色)

void setup()

{

  size(500,500);

  PFont font = createFont("標楷體",40);//調整字形與字體大小

  textFont(font);//宣告變數名稱

  myShuffle();

}//洗牌的英文:shuffle

String [] faces = 

{

"黑桃A","黑桃2","黑桃3","黑桃4","黑桃5","黑桃6","黑桃7","黑桃8","黑桃9","黑桃10","黑桃J","黑桃Q","黑桃K",

"紅心A","紅心2","紅心3","紅心4","紅心5","紅心6","紅心7","紅心8","紅心9","紅心10","紅心J","紅心Q","紅心K",

"方塊A","方塊2","方塊3","方塊4","方塊5","方塊6","方塊7","方塊8","方塊9","方塊10","方塊J","方塊Q","方塊K",

"梅花A","梅花2","梅花3","梅花4","梅花5","梅花6","梅花7","梅花8","梅花9","梅花10","梅花J","梅花Q","梅花K",

};

void myShuffle()

{

  for(int k=0;k<10000;k++)//讓他洗10000次

  {

    int a = int(random(52));

    int b = int(random(52));

    //目標:faces[a] vs. faces[b]交換

    String temp = faces[a];

    faces[a] = faces[b];

    faces[b] = temp;

  }

  face1 = faces[0];

  face2 = faces[1];

  face3 = faces[2];

  face4 = faces[3];

}

void mousePressed()//當拖曳滑鼠時

{

  myShuffle();

}

String face1,face2,face3,face4;

void draw()

{

  drawPokerCard(100,100,face1);//使用函式

  drawPokerCard(130,150,face2);//使用函式

  drawPokerCard(160,200,face3);//使用函式

  drawPokerCard(190,250,face4);//使用函式

}

//牌面:黑桃Spades 紅心Hearts 方塊Diamonds 梅花Clubs

void drawPokerCard(int x,int y,String face)//牌面

{

  int W=25;

  fill(255);//白色

  rect(x-W/2,y-W/2,150+W,250+W,20);//弧度

  fill(#6AFFA4);//填滿顏色//綠色

  rect(x,y,150,250,20);//較小的

  //fill(0);//黑色的字(下面三行是修改)

  if(face.indexOf("黑桃") == -1 && face.indexOf("梅花") == -1)//如果不是黑桃或梅花

  fill(#FF0000);//字體顏色改成紅色

  else fill(0);

  textSize(40);//字體大小

  text(face,x,y+40);

}



沒有留言:

張貼留言