2022年10月30日 星期日

大拇指的啦

象棋棋盤

用兩個迴圈來畫棋盤 一個負責x 一個負責y

void setup(){

   size(500,700); 

}

void draw(){

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

    line(x,50,x,500);

  }

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

      line(50,y,450,y);

  }

}

劃分楚河漢界

void draw(){

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

      line(x,50,x,250);///x的g;上半段

      line(x,300,x,500);///x的下半段

   }

   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);   

      }

   }

}

上半段放棋子

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},

};


設定陣列
name[] = {"將","士","象","馬","車","包","卒"};


設定字型

   size(500,700); 
   PFont font = createFont("標楷體",30);
   textFont(font);
   textAlign(CENTER,CENTER);


設定id為board陣列,當id=0時需跳過他

text內的name[ id-1 ],確保兩個不一樣才不會出錯

for (int i=0;i<4;i++){
      for (int j=0;j<9;j++){
        int id=board[i][j];
        if (id==0) continue;
        text(name[id-1],50+j*50,50+i*50);   
      }
   }

象棋棋子
用ellipse畫圓形 但因為字體不會在格子正中間 所以要偏移(-3)

設陣列[]name2={"帥", "仕", "相","俥" ,"傌", "炮", "兵"};

因為有上下兩層 所以下層編號為負

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},

};

if else 來判斷id>0 黑字、id <0 紅字

for (int i=0; i<10; i++){
    for (int j=0; j<9; j++){
      int id=board[i][j];
      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 mousePresssed()

用雙迴圈+dist來判定滑鼠位置
void mousePressed(){
   for (int i=0;i<10;i++){
      for (int j=0;j<0;j++){
         if ( dist(mouseX,mouseY,50+j*50,50+i*50)<20){
            board[i][j]=1; 
         }
      }
   }
}
設定滑鼠放開void mouseReleased()
void mouseReleased(){
   int i=(mouseY+25-50)/50;
   int j=(mouseX+25-50)/50;
   board[i][j]=handchess;
   handchess=0;
}

修改mousePressed() 
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]=0; ///清空棋子
         }
      }
   }
}

完整的棋盤
void setup() {
  size(500, 700);
  PFont font = createFont("標楷體", 30);
  textFont(font);
  textAlign(CENTER, 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, 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},
};
String []name={"將", "士", "象", "車", "馬", "包", "卒"};
String []name2={"帥", "仕", "相","俥" ,"傌", "炮", "兵"};
void draw() {
  background(#FFDAA2);
  for (int x=50; x<=450; x+=50) {
    line( x, 50, x, 250);
    line( x, 300, x, 500);
  }
  for (int y=50; y<=500; y+=50) {
    line( 50, y, 450, y); //line(x1,y1,x2,y2);
  }
  for (int i=0; i<10; i++) {
    for (int j=0; j<9; j++) {
      int id= board[i][j];。
      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);
      }
      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(hand!=0) ellipse(mouseX,mouseY,40,40);
    }
  }
  
}
int hand=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){
           hand=board[i][j];
           board[i][j]=0; 
       }
    }
  }
}
void mouseReleased(){
   int i= (mouseY+25-50)/50;
   int j= (mouseX+25-50)/50;
   board[i][j]=hand;
   hand=0;
}


暗棋 ( 修改自原棋盤 )
修改成4*8大小 並修改值
相同void setup() 
因為要將棋子放入格子中間 所以要在void mousePressed()內將值增加25
設定初始全為0
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}
};
設定if else 點即時如果是0就蓋牌 如果不是舊印象棋
f (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);
      }
完整暗棋
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}
};
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);
      }
    }
  }
}
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( name[id-1], x, y-3);
    }else{//紅
      fill(255,0,0);
      text( name2[-id-1], x, y-3);
    }
}
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){
           show[i][j]=1;
         }
      }
   }
}



沒有留言:

張貼留言