2021年12月27日 星期一

期末作品

 現在遊戲已能達成基本移動 吃比自己小的目標

但為了在吃比自己大的目標時呈現死亡 並重新開始

另寫了

void gameOver()
{
 gameOverMsg();
 setup();
}
void gameOverMsg()
{
  size(500,500);
  background(255,0,0);
  stroke(153);
  textSize(44);
  textAlign(CENTER, CENTER);
  line(0, 200, width, 200);
  text("Game Over", 200, 200);
}

在主程式if(fishAlive[i]==true){....}後加上

else  {
     gameOver();
  }

無法達成如預期的在畫面正中心顯示Game Over,

且在不清楚如何達成延後執行setup() 

目前程式在死掉後立即重置 gameOverMsg()看不到


天文社社員招募中week14

       

期末作品進度4!


1.旋轉









程式如下:

int[][]grid={
  {1,0,0,0,0,0,0,0,0,0,0,1},//  {1,1,1,1,1,1,1,1,1,1,1,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,1,1,1,1,1,1,1,1,1,1,1}
};
int [][]L0={
  {1,0,0,0},
  {1,0,0,0},
  {1,1,0,0},
  {0,0,0,0}};
int [][]L1={
  {0,0,1,0},
  {1,1,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]L2={
  {1,1,0,0},
  {0,1,0,0},
  {0,1,0,0},
  {0,0,0,0}};
int [][]L3={
  {1,1,1,0},
  {1,0,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]O0={
  {1,1,0,0},
  {1,1,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]I0={
  {1,0,0,0},
  {1,0,0,0},
  {1,0,0,0},
  {1,0,0,0}};
int [][]I1={
  {1,1,1,1},
  {0,0,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]J0={
  {0,1,0,0},
  {0,1,0,0},
  {1,1,0,0},
  {0,0,0,0}};
int [][]J1={
  {1,0,0,0},
  {1,1,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]J2={
  {1,1,0,0},
  {1,0,0,0},
  {1,0,0,0},
  {0,0,0,0}};
int [][]J3={
  {1,1,1,0},
  {0,0,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]T0={
  {1,1,1,0},
  {0,1,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]T1={
  {0,1,0,0},
  {1,1,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]T2={
  {0,1,0,0},
  {1,1,0,0},
  {0,1,0,0},
  {0,0,0,0}};
int [][]T3={
  {1,0,0,0},
  {1,1,0,0},
  {1,0,0,0},
  {0,0,0,0}};
int [][]S0={
  {1,0,0,0},
  {1,1,0,0},
  {0,1,0,0},
  {0,0,0,0}};
int [][]S1={
  {0,1,1,0},
  {1,1,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]Z0={
  {1,1,0,0},
  {0,1,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]Z1={
  {0,1,0,0},
  {1,1,0,0},
  {1,0,0,0},
  {0,0,0,0}};
void testDeleteAndNext(){
  testDelete();
  nextShape=int(random(19));
  //if( random(2)<1 ) nextShape=1;
  //else if(random(2)<2) nextShape=6;
  //else nextShape=11;
  //nextShape=1;
  println(nextShape);
}
void testDelete(){
  for(int i=18;i>0;i--){//modified
    int bad=0;
    for(int j=1;j<11;j++){//modified
      if(grid[i][j]!=0)bad++;
    }
    if(bad==10){//這裡的 i,j有弄反了!!!
      for(int ii=i;ii>1;ii--){//有錯
        for(int j=1;j<11;j++)grid[ii][j]=grid[ii-1][j];
      }//這裡的 j<12才對,或是改用i,總之要想想!!!!
      i++;
    }
  }
}
int nextShape=0;

boolean L0safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+2][x]==0 && grid[y+2][x+1]==0)return true;
  return false;
}
void L0(int x,int y){
  fill(255,165,79);
  if(L0safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*(x+1),25*(y+2),25,25);
  }
}

//int nextShape=7;
boolean L1safe(int x,int y){
  if(grid[y+1][x]==0 && grid[y+1][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x+2]==0)return true;
  return false;
}
void L1(int x,int y){
  fill(255,165,79);
  if(L1safe(x,y) ){
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+2),25*y    ,25,25);
    rect(25*(x+2),25*(y+1),25,25);
  }
}

//int nextShape=13;
boolean L2safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x+1]==0 && grid[y][x+1]==0 && grid[y+2][x+1]==0)return true;
  return false;
}
void L2(int x,int y){
  fill(255,165,79);
  if(L2safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+1),25*(y+2),25,25);
  }
}

//int nextShape=16;
boolean L3safe(int x,int y){
  if(grid[y][x]==0 && grid[y][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x]==0)return true;
  return false;
}
void L3(int x,int y){
  fill(255,165,79);
  if(L3safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+2),25*y    ,25,25);
    rect(25*x    ,25*(y+1),25,25);
  }
}

//int nextShape=1;
boolean Osafe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x+1]==0 && grid[y+1][x]==0 && grid[y][x+1]==0)return true;
  return false;
}
void O0(int x,int y){
  fill(238,230,133);
  if(Osafe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=2;
boolean I0safe(int x,int y){
  if(grid[y][x]==0 && grid[y][x+1]==0 && grid[y][x+2]==0 && grid[y][x+3]==0)return true;
  return false;
}
void I0(int x,int y){
  fill(176,226,255);
  if(I0safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*y,25,25);
    rect(25*(x+3),25*y,25,25);
  }
}

//int nextShape=8;
boolean I1safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+2][x]==0 && grid[y+3][x]==0)return true;
  return false;
}
void I1(int x,int y){
  fill(176,226,255);
  if(I1safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*x    ,25*(y+3),25,25);
  }
}

//int nextShape=3;
boolean J0safe(int x,int y){
  if(grid[y][x+1]==0 && grid[y+1][x+1]==0 && grid[y+2][x+1]==0 && grid[y+2][x]==0)return true;
  return false;
}
void J0(int x,int y){
  fill(106,90,205);
  if(J0safe(x,y) ){
    rect(25*x    ,25*(y+2),25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+1),25*(y+2),25,25);
    rect(25*(x+1),25*y,25,25);
  }
}

//int nextShape=9;
boolean J1safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+1][x+1]==0 && grid[y+1][x+2]==0)return true;
  return false;
}
void J1(int x,int y){
  fill(106,90,205);
  if(J1safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+2),25*(y+1),25,25);
  }
}

//int nextShape=14;
boolean J2safe(int x,int y){
  if(grid[y][x]==0 && grid[y+2][x]==0 && grid[y+1][x]==0 && grid[y][x+1]==0)return true;
  return false;
}
void J2(int x,int y){
  fill(106,90,205);
  if(J2safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*y,25,25);
  }
}

//int nextShape=17;
boolean J3safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x+2]==0 && grid[y][x+1]==0 && grid[y][x+2]==0)return true;
  return false;
}
void J3(int x,int y){
  fill(106,90,205);
  if(J3safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*(x+2),25*(y+1),25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*y,25,25);
  }
}

//int nextShape=17;
boolean T0safe(int x,int y){
  if(grid[y][x]==0 && grid[y][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void T0(int x,int y){
  fill(205,181,205);
  if(T0safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*y,25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=10;
boolean T1safe(int x,int y){
  if(grid[y+1][x]==0 && grid[y+1][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x+2]==0)return true;
  return false;
}
void T1(int x,int y){
  fill(205,181,205);
  if(T1safe(x,y) ){
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*(y+1),25,25);
  }
}
//int nextShape=15;
boolean T2safe(int x,int y){
  if(grid[y+1][x]==0 && grid[y][x+1]==0 && grid[y+1][x+1]==0 && grid[y+2][x+1]==0)return true;
  return false;
}
void T2(int x,int y){
  fill(205,181,205);
  if(T2safe(x,y) ){
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+1),25*(y+2),25,25);
  }
}

//int nextShape=18;
boolean T3safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+2][x]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void T3(int x,int y){
  fill(205,181,205);
  if(T3safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=5;
boolean S0safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+1][x+1]==0 && grid[y+2][x+1]==0)return true;
  return false;
}
void S0(int x,int y){
  fill(193,255,193);
  if(S0safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+1),25*(y+2),25,25);
  }
}

//int nextShape=11;
boolean S1safe(int x,int y){
  if(grid[y][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void S1(int x,int y){
  fill(193,255,193);
  if(S1safe(x,y) ){
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*y,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=6;
boolean Z0safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x+2]==0 && grid[y][x+1]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void Z0(int x,int y){
  fill(250,128,124);
  if(Z0safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*(x+2),25*(y+1),25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=12;
boolean Z1safe(int x,int y){
  if(grid[y+1][x]==0 && grid[y+2][x]==0 && grid[y][x+1]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void Z1(int x,int y){
  fill(250,128,124);
  if(Z1safe(x,y) ){
    rect(25*x    ,25*(y+1),25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

void setup(){
  size(300,500);
  nextShape=int(random(19));
 // println(nextShape);
}
int b=0;
float []vx={0,0,300,500};
int rot=0;
void draw(){
  background(0);
  if(nextShape==0)L0(nowX,nowY);
  else if(nextShape==1)O0(nowX,nowY);
  else if(nextShape==2)I0(nowX,nowY);
  else if(nextShape==3)J0(nowX,nowY);
  else if(nextShape==4)T0(nowX,nowY);
  else if(nextShape==5)S0(nowX,nowY);
  else if(nextShape==6)Z0(nowX,nowY);
  
  else if(nextShape==7)L1(nowX,nowY);
  else if(nextShape==8)I1(nowX,nowY);
  else if(nextShape==9)J1(nowX,nowY);
  else if(nextShape==10)T1(nowX,nowY);
  else if(nextShape==11)S1(nowX,nowY);
  else if(nextShape==12)Z1(nowX,nowY);
  
  else if(nextShape==13)L2(nowX,nowY);  
  else if(nextShape==14)J2(nowX,nowY);
  else if(nextShape==15)T2(nowX,nowY);
  
  else if(nextShape==16)L3(nowX,nowY);
  else if(nextShape==17)J3(nowX,nowY);
  else if(nextShape==18)T3(nowX,nowY);
  else if(nextShape==19)L1(nowX,nowY);
  
  for(int x=0;x<12;x++){
    for(int y=0;y<20;y++){
      if(grid[y][x]==1)fill(70,130,180);//wall
      else if(grid[y][x]==2)fill(250,128,124);
      else if(grid[y][x]==3 || grid[y][x]==10 || grid[y][x]==16 || grid[y][x]==19)fill(255,165,79); //orangeL
      else if(grid[y][x]==4)fill(238,230,133);//yellowO
      else if(grid[y][x]==5 || grid[y][x]==11)fill(176,226,255);//blueI
      else if(grid[y][x]==6 || grid[y][x]==12 || grid[y][x]==17 || grid[y][x]==20)fill(106,90,205);//deepblueJ
      else if(grid[y][x]==7 || grid[y][x]==13 || grid[y][x]==18 || grid[y][x]==21)fill(205,181,205);//purpleT
      else if(grid[y][x]==8 || grid[y][x]==14)fill(193,255,193);//greenS
      else if(grid[y][x]==9 || grid[y][x]==15)fill(250,128,124);//pinkZ
      else fill(0);
      rect(x*25,y*25,25,25);
      if(x>300)x=-x;
      if(x<0)x=-x; 
    }
  }
  if(rot==0||nextShape==0){
    L0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==0 && L0safe(nowX,nowY+1))nowY++;
      else{        
        grid[nowY][nowX]=3;
        grid[nowY+1][nowX]=3;
        grid[nowY+2][nowX]=3;
        grid[nowY+2][nowX+1]=3;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0||rot==1||rot==2||rot==3||nextShape==1){
    O0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==1 && Osafe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY][nowX]=4;
        grid[nowY+1][nowX]=4;
        grid[nowY][nowX+1]=4;
        grid[nowY+1][nowX+1]=4;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0||rot==2||nextShape==2){
    I0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==2 && I0safe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY][nowX]=5;
        grid[nowY][nowX+1]=5;
        grid[nowY][nowX+2]=5;
        grid[nowY][nowX+3]=5;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0||nextShape==3){
    J0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==3 && J0safe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY+2][nowX]=6;
        grid[nowY+1][nowX+1]=6;
        grid[nowY+2][nowX+1]=6;
        grid[nowY][nowX+1]=6;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0||nextShape==4){
    T0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==4 && T0safe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY][nowX]=7;
        grid[nowY][nowX+1]=7;
        grid[nowY][nowX+2]=7;
        grid[nowY+1][nowX+1]=7;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0||rot==2||nextShape==5){
    S0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==5 && S0safe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY][nowX]=8;
        grid[nowY+1][nowX]=8;
        grid[nowY+1][nowX+1]=8;
        grid[nowY+2][nowX+1]=8;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0||rot==2||nextShape==6){
    Z0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==6 && Z0safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=9;
        grid[nowY+1][nowX+2]=9;
        grid[nowY][nowX+1]=9;
        grid[nowY+1][nowX+1]=9;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==1||nextShape==7){
    L1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==7 && L1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+1][nowX]=10;
        grid[nowY+1][nowX+1]=10;
        grid[nowY][nowX+2]=10;
        grid[nowY+1][nowX+2]=10;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==1||rot==3||nextShape==8){
    I1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==8 && I1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+3][nowX]=11;
        grid[nowY+2][nowX]=11;
        grid[nowY+1][nowX]=11;
        grid[nowY][nowX]=11;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==1||nextShape==9){
    J1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==9 && J1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=12;
        grid[nowY+1][nowX]=12;
        grid[nowY+1][nowX+1]=12;
        grid[nowY+1][nowX+2]=12;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  if(rot==1||nextShape==10){
    T1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==10 && T1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+1][nowX+1]=13;
        grid[nowY+1][nowX]=13;
        grid[nowY][nowX+1]=13;
        grid[nowY+1][nowX+2]=13;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==1||rot==3||nextShape==11){
    S1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==11 && S1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX+1]=14;
        grid[nowY][nowX+2]=14;
        grid[nowY+1][nowX]=14;
        grid[nowY+1][nowX+1]=14;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  if(rot==1||rot==3||nextShape==12){
    Z1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==12 && Z1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+1][nowX]=15;
        grid[nowY+2][nowX]=15;
        grid[nowY][nowX+1]=15;
        grid[nowY+1][nowX+1]=15;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==2||nextShape==13){
    L2(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==13 && L2safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=16;
        grid[nowY+1][nowX+1]=16;
        grid[nowY][nowX+1]=16;
        grid[nowY+2][nowX+1]=16;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==2||nextShape==14){
    J2(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==14 && J2safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=17;
        grid[nowY+2][nowX]=17;
        grid[nowY+1][nowX]=17;
        grid[nowY][nowX+1]=17;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==2||nextShape==15){
    T2(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==15 && T2safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+1][nowX]=18;
        grid[nowY][nowX+1]=18;
        grid[nowY+1][nowX+1]=18;
        grid[nowY+2][nowX+1]=18;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==3||nextShape==16){
    L3(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==16 && L3safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=19;
        grid[nowY][nowX+1]=19;
        grid[nowY][nowX+2]=19;
        grid[nowY+1][nowX]=19;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==3||nextShape==17){
    J3(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==17 && J3safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=20;
        grid[nowY+1][nowX+2]=20;
        grid[nowY][nowX+1]=20;
        grid[nowY][nowX+2]=20;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==3||nextShape==18){
    T3(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==18 && T3safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=21;
        grid[nowY+1][nowX]=21;
        grid[nowY+2][nowX]=21;
        grid[nowY+1][nowX+1]=21;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
}
int nowX=6,nowY=1;
void keyPressed(){
  // if(keyCode==RIGHT && testSafe( nowShape, nowX+1, nowY, nowAngle)==true ){ b=3; nowX++; } 
  if(keyCode==RIGHT && grid[nowY][nowX+1]==0 ){ b=3; nowX++; }
  if(keyCode==LEFT && grid[nowY][nowX-1]==0 ) { b=2; nowX--; }
  if(keyCode==UP)rot=(rot+1)%4;
  if(keyCode==DOWN){ b=0; nowY++; }
}


2.剩下game over




程式如下:

int[][]grid={
  {1,0,0,0,0,0,0,0,0,0,0,1},//  {1,1,1,1,1,1,1,1,1,1,1,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,1},
  {1,1,1,1,1,1,1,1,1,1,1,1}
};
int [][]L0={
  {1,0,0,0},
  {1,0,0,0},
  {1,1,0,0},
  {0,0,0,0}};
int [][]L1={
  {0,0,1,0},
  {1,1,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]L2={
  {1,1,0,0},
  {0,1,0,0},
  {0,1,0,0},
  {0,0,0,0}};
int [][]L3={
  {1,1,1,0},
  {1,0,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]O0={
  {1,1,0,0},
  {1,1,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]I0={
  {1,0,0,0},
  {1,0,0,0},
  {1,0,0,0},
  {1,0,0,0}};
int [][]I1={
  {1,1,1,1},
  {0,0,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]J0={
  {0,1,0,0},
  {0,1,0,0},
  {1,1,0,0},
  {0,0,0,0}};
int [][]J1={
  {1,0,0,0},
  {1,1,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]J2={
  {1,1,0,0},
  {1,0,0,0},
  {1,0,0,0},
  {0,0,0,0}};
int [][]J3={
  {1,1,1,0},
  {0,0,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]T0={
  {1,1,1,0},
  {0,1,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]T1={
  {0,1,0,0},
  {1,1,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]T2={
  {0,1,0,0},
  {1,1,0,0},
  {0,1,0,0},
  {0,0,0,0}};
int [][]T3={
  {1,0,0,0},
  {1,1,0,0},
  {1,0,0,0},
  {0,0,0,0}};
int [][]S0={
  {1,0,0,0},
  {1,1,0,0},
  {0,1,0,0},
  {0,0,0,0}};
int [][]S1={
  {0,1,1,0},
  {1,1,0,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]Z0={
  {1,1,0,0},
  {0,1,1,0},
  {0,0,0,0},
  {0,0,0,0}};
int [][]Z1={
  {0,1,0,0},
  {1,1,0,0},
  {1,0,0,0},
  {0,0,0,0}};
  
void testDeleteAndNext(){
  testDelete();
  nextShape=int(random(6));
  //if( random(2)<1 ) nextShape=1;
  //else if(random(2)<2) nextShape=6;
  //else nextShape=11;
  //nextShape=1;
  println(nextShape);
}
void testDelete(){
  for(int i=18;i>0;i--){//modified
    int bad=0;
    for(int j=1;j<11;j++){//modified
      if(grid[i][j]!=0)bad++;
    }
    if(bad==10){//這裡的 i,j有弄反了!!!
      for(int ii=i;ii>1;ii--){//有錯
        for(int j=1;j<11;j++)grid[ii][j]=grid[ii-1][j];
      }//這裡的 j<12才對,或是改用i,總之要想想!!!!
      i++;
    }
  }
}
int nextShape=0;

boolean L0safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+2][x]==0 && grid[y+2][x+1]==0)return true;
  return false;
}
void L0(int x,int y){
  fill(255,165,79);
  if(L0safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*(x+1),25*(y+2),25,25);
  }
}

//int nextShape=7;
boolean L1safe(int x,int y){
  if(grid[y+1][x]==0 && grid[y+1][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x+2]==0)return true;
  return false;
}
void L1(int x,int y){
  fill(255,165,79);
  if(L1safe(x,y) ){
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+2),25*y    ,25,25);
    rect(25*(x+2),25*(y+1),25,25);
  }
}

//int nextShape=13;
boolean L2safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x+1]==0 && grid[y][x+1]==0 && grid[y+2][x+1]==0)return true;
  return false;
}
void L2(int x,int y){
  fill(255,165,79);
  if(L2safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+1),25*(y+2),25,25);
  }
}

//int nextShape=16;
boolean L3safe(int x,int y){
  if(grid[y][x]==0 && grid[y][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x]==0)return true;
  return false;
}
void L3(int x,int y){
  fill(255,165,79);
  if(L3safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+2),25*y    ,25,25);
    rect(25*x    ,25*(y+1),25,25);
  }
}

//int nextShape=1;
boolean Osafe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x+1]==0 && grid[y+1][x]==0 && grid[y][x+1]==0)return true;
  return false;
}
void O0(int x,int y){
  fill(238,230,133);
  if(Osafe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=2;
boolean I0safe(int x,int y){
  if(grid[y][x]==0 && grid[y][x+1]==0 && grid[y][x+2]==0 && grid[y][x+3]==0)return true;
  return false;
}
void I0(int x,int y){
  fill(176,226,255);
  if(I0safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*y,25,25);
    rect(25*(x+3),25*y,25,25);
  }
}

//int nextShape=8;
boolean I1safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+2][x]==0 && grid[y+3][x]==0)return true;
  return false;
}
void I1(int x,int y){
  fill(176,226,255);
  if(I1safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*x    ,25*(y+3),25,25);
  }
}

//int nextShape=3;
boolean J0safe(int x,int y){
  if(grid[y][x+1]==0 && grid[y+1][x+1]==0 && grid[y+2][x+1]==0 && grid[y+2][x]==0)return true;
  return false;
}
void J0(int x,int y){
  fill(106,90,205);
  if(J0safe(x,y) ){
    rect(25*x    ,25*(y+2),25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+1),25*(y+2),25,25);
    rect(25*(x+1),25*y,25,25);
  }
}

//int nextShape=9;
boolean J1safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+1][x+1]==0 && grid[y+1][x+2]==0)return true;
  return false;
}
void J1(int x,int y){
  fill(106,90,205);
  if(J1safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+2),25*(y+1),25,25);
  }
}

//int nextShape=14;
boolean J2safe(int x,int y){
  if(grid[y][x]==0 && grid[y+2][x]==0 && grid[y+1][x]==0 && grid[y][x+1]==0)return true;
  return false;
}
void J2(int x,int y){
  fill(106,90,205);
  if(J2safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*y,25,25);
  }
}

//int nextShape=17;
boolean J3safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x+2]==0 && grid[y][x+1]==0 && grid[y][x+2]==0)return true;
  return false;
}
void J3(int x,int y){
  fill(106,90,205);
  if(J3safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*(x+2),25*(y+1),25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*y,25,25);
  }
}

//int nextShape=17;
boolean T0safe(int x,int y){
  if(grid[y][x]==0 && grid[y][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void T0(int x,int y){
  fill(205,181,205);
  if(T0safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*y,25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=10;
boolean T1safe(int x,int y){
  if(grid[y+1][x]==0 && grid[y+1][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x+2]==0)return true;
  return false;
}
void T1(int x,int y){
  fill(205,181,205);
  if(T1safe(x,y) ){
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*(y+1),25,25);
  }
}
//int nextShape=15;
boolean T2safe(int x,int y){
  if(grid[y+1][x]==0 && grid[y][x+1]==0 && grid[y+1][x+1]==0 && grid[y+2][x+1]==0)return true;
  return false;
}
void T2(int x,int y){
  fill(205,181,205);
  if(T2safe(x,y) ){
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+1),25*(y+2),25,25);
  }
}

//int nextShape=18;
boolean T3safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+2][x]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void T3(int x,int y){
  fill(205,181,205);
  if(T3safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=5;
boolean S0safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x]==0 && grid[y+1][x+1]==0 && grid[y+2][x+1]==0)return true;
  return false;
}
void S0(int x,int y){
  fill(193,255,193);
  if(S0safe(x,y) ){
    rect(25*x    ,25*y,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*(y+1),25,25);
    rect(25*(x+1),25*(y+2),25,25);
  }
}

//int nextShape=11;
boolean S1safe(int x,int y){
  if(grid[y][x+1]==0 && grid[y][x+2]==0 && grid[y+1][x]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void S1(int x,int y){
  fill(193,255,193);
  if(S1safe(x,y) ){
    rect(25*(x+1),25*y,25,25);
    rect(25*(x+2),25*y,25,25);
    rect(25*x    ,25*(y+1),25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=6;
boolean Z0safe(int x,int y){
  if(grid[y][x]==0 && grid[y+1][x+2]==0 && grid[y][x+1]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void Z0(int x,int y){
  fill(250,128,124);
  if(Z0safe(x,y) ){
    rect(25*x    ,25*y    ,25,25);
    rect(25*(x+2),25*(y+1),25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

//int nextShape=12;
boolean Z1safe(int x,int y){
  if(grid[y+1][x]==0 && grid[y+2][x]==0 && grid[y][x+1]==0 && grid[y+1][x+1]==0)return true;
  return false;
}
void Z1(int x,int y){
  fill(250,128,124);
  if(Z1safe(x,y) ){
    rect(25*x    ,25*(y+1),25,25);
    rect(25*x    ,25*(y+2),25,25);
    rect(25*(x+1),25*y    ,25,25);
    rect(25*(x+1),25*(y+1),25,25);
  }
}

void setup(){
  size(300,500);
  nextShape=int(random(6));
 // println(nextShape);
}
int b=0;
float []vx={0,0,300,500};
int rot=0;
void draw(){
  background(0);
  if(nextShape==0)L0(nowX,nowY);
  else if(nextShape==1)O0(nowX,nowY);
  else if(nextShape==2)I0(nowX,nowY);
  else if(nextShape==3)J0(nowX,nowY);
  else if(nextShape==4)T0(nowX,nowY);
  else if(nextShape==5)S0(nowX,nowY);
  else if(nextShape==6)Z0(nowX,nowY);
  
  //else if(nextShape==7)L1(nowX,nowY);
  //else if(nextShape==8)I1(nowX,nowY);
  //else if(nextShape==9)J1(nowX,nowY);
  //else if(nextShape==10)T1(nowX,nowY);
  //else if(nextShape==11)S1(nowX,nowY);
  //else if(nextShape==12)Z1(nowX,nowY);
  
  //else if(nextShape==13)L2(nowX,nowY);  
  //else if(nextShape==14)J2(nowX,nowY);
  //else if(nextShape==15)T2(nowX,nowY);
  
  //else if(nextShape==16)L3(nowX,nowY);
  //else if(nextShape==17)J3(nowX,nowY);
  //else if(nextShape==18)T3(nowX,nowY);
  //else if(nextShape==19)L1(nowX,nowY);
  
  for(int x=0;x<12;x++){
    for(int y=0;y<20;y++){
      if(grid[y][x]==1)fill(70,130,180);//wall
      else if(grid[y][x]==2)fill(250,128,124);
      else if(grid[y][x]==3 || grid[y][x]==10 || grid[y][x]==16 || grid[y][x]==19)fill(255,165,79); //orangeL
      else if(grid[y][x]==4)fill(238,230,133);//yellowO
      else if(grid[y][x]==5 || grid[y][x]==11)fill(176,226,255);//blueI
      else if(grid[y][x]==6 || grid[y][x]==12 || grid[y][x]==17 || grid[y][x]==20)fill(106,90,205);//deepblueJ
      else if(grid[y][x]==7 || grid[y][x]==13 || grid[y][x]==18 || grid[y][x]==21)fill(205,181,205);//purpleT
      else if(grid[y][x]==8 || grid[y][x]==14)fill(193,255,193);//greenS
      else if(grid[y][x]==9 || grid[y][x]==15)fill(250,128,124);//pinkZ
      else fill(0);
      rect(x*25,y*25,25,25);
      if(x>300)x=-x;
      if(x<0)x=-x; 
    }
  }
  if(rot==0&&nextShape==0){
    L0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==0 && L0safe(nowX,nowY+1))nowY++;
      else{        
        grid[nowY][nowX]=3;
        grid[nowY+1][nowX]=3;
        grid[nowY+2][nowX]=3;
        grid[nowY+2][nowX+1]=3;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0&&nextShape==1||rot==1&&nextShape==1||rot==2&&nextShape==1||rot==3&&nextShape==1){
    O0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==1 && Osafe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY][nowX]=4;
        grid[nowY+1][nowX]=4;
        grid[nowY][nowX+1]=4;
        grid[nowY+1][nowX+1]=4;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0&&nextShape==2||rot==2&&nextShape==2){
    I0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==2 && I0safe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY][nowX]=5;
        grid[nowY][nowX+1]=5;
        grid[nowY][nowX+2]=5;
        grid[nowY][nowX+3]=5;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0&&nextShape==3){
    J0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==3 && J0safe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY+2][nowX]=6;
        grid[nowY+1][nowX+1]=6;
        grid[nowY+2][nowX+1]=6;
        grid[nowY][nowX+1]=6;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0&&nextShape==4){
    T0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==4 && T0safe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY][nowX]=7;
        grid[nowY][nowX+1]=7;
        grid[nowY][nowX+2]=7;
        grid[nowY+1][nowX+1]=7;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0&&nextShape==5||rot==2&&nextShape==5){
    S0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==5 && S0safe(nowX,nowY+1))nowY++;
      else{      
        grid[nowY][nowX]=8;
        grid[nowY+1][nowX]=8;
        grid[nowY+1][nowX+1]=8;
        grid[nowY+2][nowX+1]=8;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==0&&nextShape==6||rot==2&&nextShape==6){
    Z0(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==6 && Z0safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=9;
        grid[nowY+1][nowX+2]=9;
        grid[nowY][nowX+1]=9;
        grid[nowY+1][nowX+1]=9;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==1&&nextShape==0){
    L1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==0 && L1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+1][nowX]=10;
        grid[nowY+1][nowX+1]=10;
        grid[nowY][nowX+2]=10;
        grid[nowY+1][nowX+2]=10;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==1&&nextShape==2||rot==3&&nextShape==2){
    I1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==2 && I1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+3][nowX]=11;
        grid[nowY+2][nowX]=11;
        grid[nowY+1][nowX]=11;
        grid[nowY][nowX]=11;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==1&&nextShape==3){
    J1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==3 && J1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=12;
        grid[nowY+1][nowX]=12;
        grid[nowY+1][nowX+1]=12;
        grid[nowY+1][nowX+2]=12;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  if(rot==1&&nextShape==4){
    T1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==4 && T1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+1][nowX+1]=13;
        grid[nowY+1][nowX]=13;
        grid[nowY][nowX+1]=13;
        grid[nowY+1][nowX+2]=13;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==1&&nextShape==5||rot==3&&nextShape==5){
    S1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==5 && S1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX+1]=14;
        grid[nowY][nowX+2]=14;
        grid[nowY+1][nowX]=14;
        grid[nowY+1][nowX+1]=14;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  if(rot==1&&nextShape==6||rot==3&&nextShape==6){
    Z1(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==6 && Z1safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+1][nowX]=15;
        grid[nowY+2][nowX]=15;
        grid[nowY][nowX+1]=15;
        grid[nowY+1][nowX+1]=15;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==2&&nextShape==0){
    L2(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==0 && L2safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=16;
        grid[nowY+1][nowX+1]=16;
        grid[nowY][nowX+1]=16;
        grid[nowY+2][nowX+1]=16;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==2&&nextShape==3){
    J2(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==3 && J2safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=17;
        grid[nowY+2][nowX]=17;
        grid[nowY+1][nowX]=17;
        grid[nowY][nowX+1]=17;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==2&&nextShape==4){
    T2(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==4 && T2safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY+1][nowX]=18;
        grid[nowY][nowX+1]=18;
        grid[nowY+1][nowX+1]=18;
        grid[nowY+2][nowX+1]=18;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==3&&nextShape==0){
    L3(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==0 && L3safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=19;
        grid[nowY][nowX+1]=19;
        grid[nowY][nowX+2]=19;
        grid[nowY+1][nowX]=19;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==3&&nextShape==3){
    J3(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==3 && J3safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=20;
        grid[nowY+1][nowX+2]=20;
        grid[nowY][nowX+1]=20;
        grid[nowY][nowX+2]=20;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
  else if(rot==3&&nextShape==4){
    T3(nowX,nowY);
    if(frameCount%20==0){
      if(nextShape==4 && T3safe(nowX,nowY+1))nowY++;
      else{
        grid[nowY][nowX]=21;
        grid[nowY+1][nowX]=21;
        grid[nowY+2][nowX]=21;
        grid[nowY+1][nowX+1]=21;
        nowX=6;nowY=1;
        testDeleteAndNext();
      }
    }
  }
}
int nowX=6,nowY=1;
void keyPressed(){
  // if(keyCode==RIGHT && testSafe( nowShape, nowX+1, nowY, nowAngle)==true ){ b=3; nowX++; } 
  if(keyCode==RIGHT && grid[nowY][nowX+1]==0 ){ b=3; nowX++; }
  if(keyCode==LEFT && grid[nowY][nowX-1]==0 ) { b=2; nowX--; }
  if(keyCode==UP)rot=(rot+1)%4;
  if(keyCode==DOWN){ b=0; nowY++; }
}



顏色資料庫



   (70,130,180)

  (250,128,124)

 (255,165,79)

(176,226,255)

 (106,90,205)

(205,181,205)

(193,255,193)

(250,128,124)

 (238,230,133)



🍮有751行囉🍩


08160741_week12

 1.雲朵、快速落地、關卡平衡

PImage[] Dino_idle = new PImage[2];
PImage[] Dino_land = new PImage[3];
PImage Dino_die;
PImage cloud;
PImage[] Saboten = new PImage[3];
PImage Game_Over;

int DinoAnim_Timer = 0,PlayerFrame = 2,currentFrame = 0,bad_cooldown = 0,c_bad_cooldown = 0,score = 0,distance = 0,stage_lv = 0,LandingCD = 0;
int failednumber = 0;

float randomX,randomY,random;
float jump_force,gravity;

float playerX,playerY;
float c_playerX,c_playerY;

int cloud_posX = -100,cloud_posY = -100;

int[] saboten_if = new int[10];
int[] saboten_pos = new int[10];

int[] cloud_if = new int[10];
int[][] cloud_pos = new int[10][2];


float[] m_CollisionX = new float[10];
float[] m_CollisionY = new float[10];
float[] s_CollisionX = new float[10];
float[] s_CollisionY = new float[10];

boolean isDebug = false;

boolean jumping = false,Onground = true;
boolean isgameover = false;
void setup()
{
  size(1200,700);
  frameRate(24);
  
  //基本屬性
  jump_force = 40;
  gravity = 0;
  
  //恐龍的預設動畫圖片
  Dino_idle[0] = loadImage("dino_idle_0.png");
  Dino_idle[1] = loadImage("dino_idle_1.png");
  
  //恐龍的落地動畫圖片
  Dino_land[0] = loadImage("dino_land_0.png");
  Dino_land[1] = loadImage("dino_land_1.png");
  Dino_land[2] = loadImage("dino_land_2.png");
  
  //恐龍的死亡圖片
  Dino_die = loadImage("dino_die_0.png");
  
  //仙人掌
  Saboten[0] = loadImage("bad_0.png"); //65x100
  Saboten[1] = loadImage("bad_1.png"); //75x110
  Saboten[2] = loadImage("bad_2.png"); //35x120
  
  //雲
  cloud = loadImage("cloud_0.png");
  //遊戲結束
  Game_Over = loadImage("game_over_0.png");
  
  //玩家初始位置
  playerX = 100;
  playerY = 580;
}

void draw()
{
   background(255);
   display();
  if(isgameover == false)
  {
    ObjectMove();
    
    //跳躍處理      
    if(LandingCD > 0)
    {
      LandingCD -= (stage_lv + 1);
      if(LandingCD < 0) LandingCD = 0;
    }
    if(LandingCD == 0)
    {
      if(jumping == true)
      {
        playerY -= jump_force;
        if(jump_force > 0) jump_force -= 3;
        Onground = false;
        if(playerY <= 300) jumping = false;
      }
      if(jumping == false && Onground == false)
      {
        playerY += gravity;
        gravity += 8;
        if(playerY >= 580)
        {
          playerY = 580;
          Onground = true;
          jump_force = 40;
          gravity = 0;
        }
      } 
    }
    
    //分數增加
    distance++;  
    score = distance/2;
    
    //根據分數進行階段提升
    if(score > 100) stage_lv = 1;
    if(score > 500) stage_lv = 2;
    if(score > 1000) stage_lv = 3;
    
    //判定產生仙人掌
    random = random(0,10);
    random = int(random);
    
    if(random == 1 && bad_cooldown == 0)
    {
      for(int i = 0;i < 10;i++)
      {
        if(saboten_if[i] == 0)
        {
          random = random(0,3);
          random = int(random);
          if(random == 0)
            saboten_if[i] = 1;
          if(random == 1)
            saboten_if[i] = 2;
          if(random == 2)
            saboten_if[i] = 3;
            
          saboten_pos[i] = 1300;
          
          if(stage_lv == 0) bad_cooldown = 30;
          if(stage_lv == 1) bad_cooldown = 25;
          if(stage_lv == 2) bad_cooldown = 15;
          if(stage_lv == 3) bad_cooldown = 15;
          
          break;
        }
      }
    }
    else failednumber++;
    
    //判定生成雲朵
    random = random(0,25);
    random = int(random);
    
    if(c_bad_cooldown == 0)
    {
      for(int i = 0;i < 10;i++)
      {
        if(random == 5)
        {
          if(cloud_if[i] == 0) cloud_if[i] = 1;
          else continue;
        }
        for(int j = 0;j < 2;j++)
        {
          if(cloud_if[i] == 1)
          {
            if(cloud_pos[i][j] == 0 && j == 0) cloud_pos[i][j] = 1300;
            if(cloud_pos[i][j] == 0 && j == 1)
            {
              random = random(200,400);
              cloud_pos[i][j] = int(random);
              c_bad_cooldown = 60;
              
              break;
            }            
          }
        }
        if(cloud_if[i] == 1) break;
      }
    }
    
    
  }
}

void display()
{ 
  //debug
  if(isDebug == true) debug(); 
  //雲
  for(int i = 0;i < 10;i++)
  {
    if(cloud_if[i] == 0) continue; 
    for(int j = 0;j < 2;j++)
    { 
      if(j == 0)
      {
        cloud_posX = cloud_pos[i][j];
        continue;
      }
      if(j == 1)
      {
        cloud_posY = cloud_pos[i][j];
        image(cloud,cloud_posX,cloud_posY);
      }
    }
  }
  
  //遊戲結束
  if(isgameover) image(Game_Over,600,350);
  
  
  //分數顯示
  textSize(80);
  fill(0); 
  String m_score = nf(score, 4);
  text(m_score,950,100);
  
  //text(cloud_pos[0][0],950,300);
  //text(cloud_pos[0][1],950,400);
  
  //恐龍動畫
  DinoAnim_Timer++;  
  imageMode(CENTER);
  if(isgameover)
  {
    image(Dino_die,playerX,playerY);
  }
  else if(LandingCD == 0)
  {
    if(DinoAnim_Timer % PlayerFrame == 0)
    {
      currentFrame++;
      if(currentFrame == PlayerFrame) currentFrame = 0;
      DinoAnim_Timer = 0;
    }
    image(Dino_idle[currentFrame],playerX,playerY);
  }
  else if(LandingCD > 0)
  {
    if(LandingCD > LandingCD/2)
    {
      image(Dino_land[0],playerX,playerY);
    }
    if(LandingCD > (LandingCD/2)/2)
    {
      image(Dino_land[1],playerX,playerY);
    }
    if(LandingCD > 0)
    {
      image(Dino_land[2],playerX,playerY);
    }
  }
  
  //地面
  stroke(0);
  line(0,600,1200,600);
  
  //仙人掌
  for(int i = 0;i < 10;i++)
  {
    if(saboten_if[i] != 0)
    {
        if(saboten_if[i] == 1) image(Saboten[0],saboten_pos[i],580);
        if(saboten_if[i] == 2) image(Saboten[1],saboten_pos[i],580);
        if(saboten_if[i] == 3) image(Saboten[2],saboten_pos[i],580);
      
    }
  }
}

void ObjectMove()
{
  //根據階段有不同的移動速度
  //仙人掌移動
  for(int i =0;i < 10;i++)
  {
    if(saboten_pos[i] < -50) saboten_if[i] = 0;
    saboten_pos[i] -= 20 * ((stage_lv/1.8) + 1);
  }
  if(bad_cooldown > 0) bad_cooldown--;
  
  CollisionDet();
  
  for(int i = 0;i < 10;i++)
  {
    if(cloud_if[i] == 0) continue;
    for(int j = 0;j < 2;j++)
    {  
      if(j == 1) cloud_pos[i][j] = 0;
      if(j == 0)
      {
        if(cloud_pos[i][j] < -100)
        {
          cloud_pos[i][j] = 0;
          cloud_if[i] = 0;
          continue;
        }
        
        
        cloud_pos[i][j] -= 20;
        break;
      }
    }
  }
  if(c_bad_cooldown > 0) c_bad_cooldown--;
}

void keyPressed()
{
  if(key == 32)
  {
    if(Onground && LandingCD == 0)
    {
      jumping = true;
      Onground = false;
    }
    
    if(isgameover == true)
    {
      restart();
    }  
    return;

  }
  
  if(key == CODED)
  {
    if(keyCode == DOWN)
    {
      if(jumping) jumping = false;
      if(!Onground) Onground = true;
      
      LandingCD = 8 - stage_lv;
      
      jump_force = 40;
      gravity = 0;
      playerY = 580;
    }
    return;
  }
  /*if(key == 's')
  {
    stop();
  }*/
}

void CollisionDet()
{
  c_playerX = playerX;
  c_playerY = playerY;
  
  for(int i = 0;i < 10;i++)
  {
    if(saboten_if[i] == 1)
    {
      s_CollisionX[i] = saboten_pos[i] - 32.5 + 5;
      s_CollisionY[i] = 580 - 50;
      m_CollisionX[i] = saboten_pos[i] + 32.5 - 5;
      m_CollisionY[i] = 580 + 50;
    }
    if(saboten_if[i] == 2)
    {
      s_CollisionX[i] = saboten_pos[i] - 37.5 + 8;
      s_CollisionY[i] = 580 - 55;
      m_CollisionX[i] = saboten_pos[i] + 37.5 - 8;
      m_CollisionY[i] = 580 + 55;
    }
    if(saboten_if[i] == 3)
    {
      s_CollisionX[i] = saboten_pos[i] - 17.5 + 3;
      s_CollisionY[i] = 580 - 60;
      m_CollisionX[i] = saboten_pos[i] + 17.5 - 3;
      m_CollisionY[i] = 580 + 60;
    }
    
    if(saboten_if[i] != 0 && c_playerX + 30 >= s_CollisionX[i] && c_playerX + 30 <= m_CollisionX[i] && c_playerY + 40 >= s_CollisionY[i] && c_playerY + 40 <= m_CollisionY[i])
    {
         //撞到了
      isgameover = true;   
      
          textSize(40);
      text(c_playerX,0,100);
      text(c_playerY,0,200);
      
      
      text(s_CollisionX[i],200,100);
      text(m_CollisionX[i],200,200);
      text(s_CollisionY[i],200,300);
      text(m_CollisionY[i],200,400); 
         
    }
    else if(saboten_if[i] != 0 && c_playerX - 30 >= s_CollisionX[i] && c_playerX - 30 <= m_CollisionX[i] && c_playerY + 40 >= s_CollisionY[i] && c_playerY + 40 <= m_CollisionY[i])
    {
      //撞到了
      isgameover = true;    
      
          textSize(40);
      text(c_playerX,0,100);
      text(c_playerY,0,200);
      
      text(s_CollisionX[i],200,100);
      text(m_CollisionX[i],200,200);
      text(s_CollisionY[i],200,300);
      text(m_CollisionY[i],200,400); 
    }
  }
  
}

void restart()
{
  for(int i = 0;i < 10;i++)
  {
    saboten_if[i] = 0;
    saboten_pos[i] = 0;
    
  }
  distance = 0;
  stage_lv = 0;  
  
  for(int i = 0;i < 10;i++)
  {
    saboten_if[i] = 0;
    saboten_pos[i] = 0;
    
    cloud_if[i] = 0;
  }
  
  for(int i = 0;i < 10;i++)
  {
    for(int j = 0;j < 2;j++)
    {
      cloud_pos[i][j] = 0;
    }
  }
  
  
  isgameover = false;
}

void debug()
{
    textSize(40);
    text(c_playerX,0,100);
    text(c_playerY,0,200);
    
    text(failednumber,400,100);
}

2.預計進度:階段提高提示、地面些微變化、空中障礙、場景裝飾