2022年10月3日 星期一

RH week5

 week05 

(一)象棋

1.先創建個棋盤吧,按照等差級數:50,100,150,200,250,300,350,400,450

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

```c
size(500,700);
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);
}
```


2.完善象棋棋盤,將中間分開且加條直線,並寫出棋子涵式board

```c
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,200);
    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);
    }
  }
}
```


3.將board陣列裡的數字替換成中文標楷體,接著在setup裡新增設定,最後再到draw最後一個迴圈裡進行轉換

```c
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,200);
    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);
    }
  }
}
```


4.完善棋子改變棋盤顏色,在陣列新增負號的0~7作為紅色方的象棋;新增String[]name2:帥,仕,相,俥,傌,炮,兵

```c
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,200);
    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);
      }
      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);
      }
    }
  }
}
```


5.新增mousePressed函式,使在棋盤上點擊滑鼠就能新增「將」(當前設定1)和取代原本設定好位置的棋子

```c
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,200);
    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);
      }
      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);
      }
    }
  }
}
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;
    }
}
```


6.修改程式讓棋子能隨意移動,新增mouseReleased函式使棋子移動後原本位置上的棋子消失,但此移動不府和象棋規則,所以不完美

```c
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,200);
    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);
      }
      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);
      }
    }
  }
  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;
      }
    }
  }
}  
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.因時間緊迫,所以只把棋子印出來而已

```c
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<=500;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);
  }
}
```






沒有留言:

張貼留言