2022年10月17日 星期一

Week5_栗子的程式日記_推甄好難,研究計畫好難QQ

 Week5

1.1畫出一個棋盤

程式碼:
 ///畫棋盤
 ///等差級數 : 50,100,150,200,250,300,350
 size(500,700);
 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); 
 }


1.2 把棋子放到指定的位址,有看到小小的白色數字嗎,那就是棋子喔:))

程式碼:
///畫棋子要下棋,要互動
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:包 7: 卒
void setup(){
 size(500,550); 
}
void draw(){
 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); 
 }
 for(int i=0;i<4;i++){
   for(int j=0;j<9;j++){
     text(board[i][j],50+j*50,50+i*50);
   }
  }
}

1.3 因為棋子不可能只代表數字,把相對應的文字放上去

程式碼:
///畫棋子要下棋,要互動
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);
    line(x,300,x,500);
 }
 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開始
     if(id==0) continue;//陣列請回去(繼續)
     text(name[id-1],50+j*50,50+i*50);
   }
 }
}

1.4 這個步驟做了比較多,有先具體化棋子,還多了紅方的棋子,跟加上背景顏色。

程式碼:
///畫棋子要下棋,要互動
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);
 }
 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);
     }
   }
 }
}

1.5 這一步是不完全的一步,看影片知道就多好笑了

程式碼:
///畫棋子要下棋,要互動
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);
 }
 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; 
    }
   }
  }
}
看到成果好笑吧,只有"將"可以一直移動,然後全部都會變成將,所以再修改!!

1.6 修改後,可以讓棋子隨者鼠標好好移動到指定位置

程式碼:
///畫棋子要下棋,要互動
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);
 }
 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]= 0;   //棋盤上的棋子不見了
    }   //把棋子拿在手上
   }
  }
}                            ///怎麼換算 j=>x,i=>y
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;  //手上的棋子 清空
}

1.7為了讓程式更加的好懂,運用到了函式,讓象棋更加的簡單,並且處理了剛才底部顏色的問題

程式碼:
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);
 }
 
 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;//陣列請回去(繼續)
     drawChess(50+j*50,50+i*50,id);
    }
 }
 if(handChess!=0)drawChess(mouseX,mouseY,handChess);
}
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);
  }
}
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]= 0;//棋盤上的棋子不見了
    }//把棋子拿在手上
   }
  }
}                            ///怎麼換算 j=>x,i=>y
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;//手上的棋子 清空
}


2.1 製作暗棋,很多都是從上方複製過來的,先是把象棋擺到他的位置上


程式碼:
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++){
     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);
  }
}

2.2但因為是暗棋,我們必須把牌都先翻過來,用滑鼠點擊的方式翻開。

程式碼:
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);
     }
    } 
 }     
}
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);
  }
}

程式還沒結束,下下禮拜繼續:))
下禮拜放假喔!!
開心心





沒有留言:

張貼留言