2022年10月3日 星期一

TC*(˙Ⱉ˙ฅ)​-week05

 

延續上周學習製作象棋,首先利用迴圈畫出棋盤的格子

第一個程式:week05_1_chess_board__for_line

//畫棋盤

//等差級數:500,100,150,200,250,300,350,400,450

//  for(int x=50;x<=450;x+=50)\

size(500,700);

for(int x=50;x<=450;x+=50)

{

  line(x,50,x,500);

}

//10條

for(int y=50;y<=500;y+=50)

{

  line(50,y,450,y);

}



象棋有一個楚河漢界,總不能像第一個程式一樣全都是格子沒有分界
所以我們要將橫線分成一半

第二個程式:week05_2_chess_by_arrat_number

將象棋建立成一個陣列,並且把棋子做編號放入globe區域(1.將2.士3:象 4:車 5:馬 6:卒...)

使用text(左邊是y-直的,右邊是x-橫的)雙迴圈印出陣列象棋位置

//畫棋子(要下棋,要互動)

int [][]board={//象棋陣列

  {4,5,3,2,1,2,3,5,4},

  {0,0,0,0,0,0,0,0,0},

  {0,6,0,0,0,0,0,0,0},

  {1,0,1,0,1,0,1,0,1},

};//1:將 2:士 3:象 4:車 5:馬 6:卒

void setup(){

  size(500,550);

}

void draw(){

  for(int x=50;x<=450;x+=50){

    line(x,50,x,250);//上排50~250(楚河漢界)

    line(x,300,x,500);//下排300~500(楚河漢界)

  }

  //10條

  for(int y=50;y<=500;y+=50){

  line(50,y,450,y);

  }

  for(int i=0;i<4;i++){

    for(int j=0;j<9;j++){

      text(board[i][j],50+j*50,50+i*50);

    }

  }

}


第三個程式:week05_3_chess_name__chinese_font
設定陣列String []name={"將","士","象","馬","車","包","卒"};就能印出中文來
設定id 為board陣列,當id為0時不印東西就跳過它
將text那部分改成name[id-1](-1是要確保兩個陣列數一樣,不然會出錯)
set設定字型(像是用PFont、createFont、textFont、textAlign等等)
原本的字型是設定在左下角,而使用textAlign(centet,center);就可以改為中間

//畫棋子(要下棋,要互動)
int [][]board={
  {4,5,3,2,1,2,3,5,4},
  {0,0,0,0,0,0,0,0,0},
  {0,6,0,0,0,0,0,0,0},
  {7,0,7,0,7,0,7,0,7},
};//1:將 2:士 3:象 4:車 5:馬 6:包 7:卒
String [] name ={"將","士","象","車","馬","包","卒"};
void setup(){
  size(500,550);
  PFont font = createFont("標楷體",30);
  textFont(font);
  textAlign(CENTER,CENTER);//將字體改在中間
}
void draw(){
  for(int x=50;x<=450;x+=50){
    line(x,50,x,250);//上排50~250(楚河漢界)
    line(x,300,x,500);//下排300~500(楚河漢界)
  }
  //10條
  for(int y=50;y<=500;y+=50){
  line(50,y,450,y);
  }
  for(int i=0;i<4;i++){//印象棋
    for(int j=0;j<9;j++){
      int id = board[i][j];//1開始,id對照數字,中文name陣列就能讀取
      if(id==0)continue;//陣列請回去(繼續),陣列數不相同要扣掉0(就是我們不印的地方)
      text(name[id-1],50+j*50,50+i*50);//右邊x,左邊y
    }
  }
}



第四個程式:week05_4_chess_red_black_ok
畫出木頭紋象棋板子,因此要更改背景顏色background(#F0B82C);
ellipse() 畫出圓形,由於字體會不在圓圈中間,所以text的y要修正減3
陣列加入剩下的棋,並且另外一半棋子的編號為負
String []name2={"帥", "仕", "相","俥" ,"傌", "炮", "兵"};放入紅棋
設定if-else,當id大於0時白底黑字,當id小於0時白底紅字

//畫棋子(要下棋,要互動)
int [][]board={
  {4,5,3,2,1,2,3,5,4},
  {0,0,0,0,0,0,0,0,0},
  {0,6,0,0,0,0,0,6,0},
  {7,0,7,0,7,0,7,0,7},
  {0,0,0,0,0,0,0,0,0},//上面是黑色
  {0,0,0,0,0,0,0,0,0},//下面是紅色
  {-7,0,-7,0,-7,0,-7,0,-7},
  {-0,-6,0,0,0,0,0,-6,0},
  {0,0,0,0,0,0,0,0,0},
  {-4,-5,-3,-2,-1,-2,-3,-5,-4},
};//1:將 2:士 3:象 4:車 5:馬 6:包 7:卒
String [] name ={"將","士","象","車","馬","包","卒"};
String [] name2 ={"帥","仕","相","俥","傌","炮","兵"};
void setup(){
  size(500,550);
  PFont font = createFont("標楷體",30);
  textFont(font);
  textAlign(CENTER,CENTER);
}
void draw(){
  background(#F0B82C);
  for(int x=50;x<=450;x+=50){
    line(x,50,x,250);
    line(x,300,x,500);
  }
  //10條
  for(int y=50;y<=500;y+=50){
  line(50,y,450,y);
  }
  for(int i=0;i<10;i++){
    for(int j=0;j<9;j++){
      int id = board[i][j];//1開始
      if(id==0)continue;//陣列請回去(繼續)
      if(id>0){
        fill(255);
        ellipse(50+j*50,50+i*50,40,40);
        fill(0);
        text(name[id-1],50+j*50,50+i*50-3);
      }else if(id<0){
        fill(255);
        ellipse(50+j*50,50+i*50,40,40);
        fill(255,0,0);
        text(name2[-id-1],50+j*50,50+i*50-3);
      }
    }
  }
}


第五個程式:week05_5_chess_mousePressed_move
設定void mousePressed();
找棋盤對應格子--->用雙迴圈
dist測量位置--->if ( dist(mouseX,mouseY,50+j*50, 50+i*50)<20 ) //當滑鼠到相應下棋的位置時 

//畫棋子(要下棋,要互動)
int [][]board={
  {4,5,3,2,1,2,3,5,4},
  {0,0,0,0,0,0,0,0,0},
  {0,6,0,0,0,0,0,6,0},
  {7,0,7,0,7,0,7,0,7},
  {0,0,0,0,0,0,0,0,0},//上面是黑色
  {0,0,0,0,0,0,0,0,0},//下面是紅色
  {-7,0,-7,0,-7,0,-7,0,-7},
  {-0,-6,0,0,0,0,0,-6,0},
  {0,0,0,0,0,0,0,0,0},
  {-4,-5,-3,-2,-1,-2,-3,-5,-4},
};//1:將 2:士 3:象 4:車 5:馬 6:包 7:卒
String [] name ={"將","士","象","車","馬","包","卒"};
String [] name2 ={"帥","仕","相","俥","傌","炮","兵"};
void setup(){
  size(500,550);
  PFont font = createFont("標楷體",30);
  textFont(font);
  textAlign(CENTER,CENTER);
}
void draw(){
  background(#F0B82C);
  for(int x=50;x<=450;x+=50){
    line(x,50,x,250);
    line(x,300,x,500);
  }
  //10條
  for(int y=50;y<=500;y+=50){
  line(50,y,450,y);
  }
  for(int i=0;i<10;i++){
    for(int j=0;j<9;j++){
      int id = board[i][j];//1開始
      if(id==0)continue;//陣列請回去(繼續)
      if(id>0){
        fill(255);
        ellipse(50+j*50,50+i*50,40,40);
        fill(0);
        text(name[id-1],50+j*50,50+i*50-3);
      }else if(id<0){
        fill(255);
        ellipse(50+j*50,50+i*50,40,40);
        fill(255,0,0);
        text(name2[-id-1],50+j*50,50+i*50-3);
      }
    }
  }
}
void mousePressed(){
  for(int  i=0;i<10;i++){
    for(int j=0;j<9;j++)
    if(dist(mouseX,mouseY,50+j*50,50+i*50)<20){
      board[i][j]=1;
    }
  }
}


第六個程式:week05_6_chess_mousePressed_get_mouseReleased_put
void mouseReleased() : 放開的指令,設定一個int hand=0(清零)
設定位置int i= (mouseY+25-50)/50;//Y是50+j*50
換算一下int j= (mouseX+25-50)/50;//X是50+j*50
接下來設定放棋子board[i][j]=hand;//放棋,放完後hand=0; ///清空手
修改mousePressed()程式,變更為hand=board[i][j];///拿棋,board[i][j]=0; ///清空那格棋
最後顯示手上的棋子,if(hand!=0) ellipse(mouseX,mouseY,40,40); 
//畫棋子(要下棋,要互動)
int [][]board={
  {4,5,3,2,1,2,3,5,4},
  {0,0,0,0,0,0,0,0,0},
  {0,6,0,0,0,0,0,6,0},
  {7,0,7,0,7,0,7,0,7},
  {0,0,0,0,0,0,0,0,0},//上面是黑色
  {0,0,0,0,0,0,0,0,0},//下面是紅色
  {-7,0,-7,0,-7,0,-7,0,-7},
  {-0,-6,0,0,0,0,0,-6,0},
  {0,0,0,0,0,0,0,0,0},
  {-4,-5,-3,-2,-1,-2,-3,-5,-4},
};//1:將 2:士 3:象 4:車 5:馬 6:包 7:卒
String [] name ={"將","士","象","車","馬","包","卒"};
String [] name2 ={"帥","仕","相","俥","傌","炮","兵"};
void setup(){
  size(500,550);
  PFont font = createFont("標楷體",30);
  textFont(font);
  textAlign(CENTER,CENTER);
}
void draw(){
  background(#F0B82C);
  for(int x=50;x<=450;x+=50){
    line(x,50,x,250);
    line(x,300,x,500);
  }
  //10條
  for(int y=50;y<=500;y+=50){
  line(50,y,450,y);
  }
  for(int i=0;i<10;i++){
    for(int j=0;j<9;j++){
      int id = board[i][j];//1開始
      if(id==0)continue;//陣列請回去(繼續)
      if(id>0){
        fill(255);
        ellipse(50+j*50,50+i*50,40,40);
        fill(0);
        text(name[id-1],50+j*50,50+i*50-3);
      }else if(id<0){
        fill(255);
        ellipse(50+j*50,50+i*50,40,40);
        fill(255,0,0);
        text(name2[-id-1],50+j*50,50+i*50-3);
      }
    }
  }
  if(handChess!=0)ellipse(mouseX,mouseY,40,40);
}
int handChess=0;
void mousePressed(){
  for(int  i=0;i<10;i++){
    for(int j=0;j<9;j++)
      if(dist(mouseX,mouseY,50+j*50,50+i*50)<20){
      handChess = board[i][j];
      board[i][j]=1;//棋盤上的棋子不見了
    }//把那個棋子拿在手上
  }
}
void mouseReleased(){//另一種四捨五入
  int i = (mouseY+25-50)/50;//y是50+i*50
  int j = (mouseX+25-50)/50;//X是50+j*50
  board[i][j] = handChess;//手上的棋子放到棋盤
  handChess=0;//手上的棋子清空
}



設定暗棋,我們修改上面的程式,先將棋盤改成4*8
第七個程式:week05_7
int [][]board={
  { 1, 2, 2, 3, 3, 4, 4, 5},
  { 5, 6, 6, 7, 7, 7, 7, 7},
  {-1,-2,-2,-3,-3,-4,-4,-5},
  {-5,-6,-6,-7,-7,-7,-7,-7}
}; //暗棋的格子,比較少 4x8=32個棋子
void setup(){
  size(500,400);
  PFont font = createFont("標楷體", 30);
  textFont(font);
  textAlign(CENTER, CENTER);
}
void draw(){
  background(#F0B82C);
  for (int x=50; x<=450; x+=50) {
    line( x, 50, x, 250);
  }
  for (int y=50; y<=250; y+=50) {
    line( 50, y, 450, y);
  }  
  for(int i=0; i<4; i++){
    for(int j=0; j<8; j++){
      int id = board[i][j];
      drawChess(50+25+j*50, 50+25+i*50, id);
    }
  }
}
String [] name = {"將", "士", "象", "車", "馬", "包", "卒"};
String [] name2 = {"帥", "仕", "相", "俥", "傌", "炮", "兵"};
void drawChess(int x, int y, int id){
    fill(255);
    ellipse( x, y, 40, 40);
    if(id>0){//黑
      fill(0);
      text( name2[id-1], x, y-3);
    }else{//紅
      fill(255,0,0);
      text( name2[-id-1], x, y-3);
    }
}


創建一個陣列,先讓它設定為0意思是一開始就是蓋牌的情況
設定if - else(印象棋那邊),當我們點它並陣列的值為0時蓋牌,如果不是就印象棋。
最後創建void mousePressed() ,並創建雙迴圈去做改變(位置都要+25才會正確)
int [][]show={
  { 0, 0, 0, 0, 0, 0, 0, 0},
  { 0, 0, 0, 0, 0, 0, 0, 0},
  { 0, 0, 0, 0, 0, 0, 0, 0},
  { 0, 0, 0, 0, 0, 0, 0, 0}
}; //翻牌前,0 都不會秀唷!
int [][]board={
  { 1, 2, 2, 3, 3, 4, 4, 5},
  { 5, 6, 6, 7, 7, 7, 7, 7},
  {-1,-2,-2,-3,-3,-4,-4,-5},
  {-5,-6,-6,-7,-7,-7,-7,-7}
}; //暗棋的格子,比較少 4x8=32個棋子
void setup(){
  size(500,300);
  PFont font = createFont("標楷體", 30);
  textFont(font);
  textAlign(CENTER, CENTER);
}
void draw(){
  background(#F0B82C);
  for (int x=50; x<=450; x+=50) {
    line( x, 50, x, 250);
  }
  for (int y=50; y<=250; y+=50) {
    line( 50, y, 450, y);
  }  
  for(int i=0; i<4; i++){
    for(int j=0; j<8; j++){
      if(show[i][j]==0){
        fill(255);
        ellipse(50+25+j*50, 50+25+i*50,40,40);
      }else{
        int id = board[i][j];
        drawChess(50+25+j*50, 50+25+i*50, id);
      }
    }
  }
}
void mousePressed(){
  for(int  i=0;i<10;i++){
    for(int j=0;j<9;j++)
      if(dist(mouseX,mouseY,50+25+j*50,50+25+i*50)<20){
       if(show[i][j]==0)show[i][j]=1;//沒秀?秀它
       //之後再加棋子的移動
    }
  }
}
String [] name = {"將", "士", "象", "車", "馬", "包", "卒"};
String [] name2 = {"帥", "仕", "相", "俥", "傌", "炮", "兵"};
void drawChess(int x, int y, int id){
    fill(255);
    ellipse( x, y, 40, 40);
    if(id>0){//黑
      fill(0);
      text( name2[id-1], x, y-3);
    }else{//紅
      fill(255,0,0);
      text( name2[-id-1], x, y-3);
    }
}






沒有留言:

張貼留言