processingでテトリスを作っています。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
はじめまして

processingでテトリスを作っています。

#1

投稿記事 by はじめまして » 12年前

コード:

/*
field settings

walls 0
block enabled 1
block fixing 3
block moving 2
*/

boolean gameover=false;
int y,x,i;
int[][] field=new int[22][12];
int[][][] block = 
{
  {
    {0,1,0,0},
    {0,1,0,0},
    {0,1,1,0},
    {0,0,0,0}
  },
  {
    {0,0,1,0},
    {0,0,1,0},
    {0,1,1,0},
    {0,0,0,0}
  },
  {
    {0,1,0,0},
    {0,1,1,0},
    {0,0,1,0},
    {0,0,0,0}
  },
  {
    {0,0,1,0},
    {0,1,1,0},
    {0,1,0,0},
    {0,0,0,0}
  },
  {
    {0,1,0,0},
    {0,1,1,0},
    {0,1,0,0},
    {0,0,0,0}
  },
  {
    {0,0,0,0},
    {0,1,1,0},
    {0,1,1,0},
    {0,0,0,0}
  },
  {
    {0,1,0,0},
    {0,1,0,0},
    {0,1,0,0},
    {0,1,0,0}
  }
};
int block_type,block_mode=0;
int block_gc_y,block_gc_x;//block grid chart
int[][] block_shape=new int [4][4];
int ms;
void setup(){
  frameRate(120); 
  size(500,680);
  stroke(#ffffff);
  for(y=0;y<22;y++){
    for(x=0;x<12;x++){
      if(x==0||x==11||y==0||y==21){
        field[y][x]=0;
      }
      else{
        field[y][x]=1;
      }
    } 
  }
  ms=millis();
}

/******************************/

void draw(){
  if(field[1][5]==3||field[1][6]==3)gameover=true;
  if(millis()-ms>1000&&!gameover){
    block_type=(int)random(7);
    create_block(5/*block_type*/);
    move_block();
    draw_field();
    clear_lines();
    ms=millis();
    message_box();
  }
  else if(gameover){
    rect(70,310,260,60);
    textAlign(CENTER);
    textSize(40);
    fill(#ffffff);
    text("gameover",200,350);
    fill(#000000);
  }
}

void keyPressed(){
  if(key==CODED&&!gameover) {
    if(keyCode==UP){
      turn_block();
      draw_field();
    }
    else if(keyCode==DOWN){
      move_block_down();
      draw_field();
    }
    else if(keyCode==RIGHT){
      move_block_right();
      draw_field();
    }
    else if(keyCode==LEFT){
      move_block_left();
      draw_field();
    }
  }
}

/******************************/

void draw_field(){
  for(y=0;y<22;y++){
    for(x=0;x<12;x++){
      if(field[y][x]==0){
        fill(#cccccc);
        rect(x*30+10,y*30+10,30,30);
      }
      else if(field[y][x]==1){
        fill(#ffffff);
        rect(x*30+10,y*30+10,30,30);
      }
      else if(field[y][x]==2){
        fill(#ff0000);
        rect(x*30+10,y*30+10,30,30);
      }
      else if(field[y][x]==3){
        fill(#4528ce);
        rect(x*30+10,y*30+10,30,30);
      }
    }
  }
}

void create_block(int block_type){
  boolean flag=true;
  for(y=1;y<21;y++){
    for(x=1;x<11;x++){
      if(field[y][x]==2)flag=false;
    }
  }
  if(flag){
    block_gc_y=1;
    block_gc_x=5;
    block_mode=0;
    for(y=0;y<4;y++){
      for(x=0;x<4;x++){
        if(block[block_type][y][x]==1){
          field[y+1][x+4]=2;
        }
      }
    }
  }
}

void move_block(){ 
  if(check_block_down()){
    block_gc_y++;
    for(y=20;y>0;y--){
      for(x=10;x>0;x--){
        if(field[y][x]==2){
          field[y+1][x]=2;
          field[y][x]=1;
        }
      }
    }
  }
  else{
    draw_field();
    lock_block();
  }
}

void move_block_down(){ 
  if(check_block_down()){
    block_gc_y++;
    for(y=20;y>0;y--){
      for(x=10;x>0;x--){
        if(field[y][x]==2){
          field[y+1][x]=2;
          field[y][x]=1;
        }
      }
    }
  }
}

void move_block_right(){ 
  if(check_block_right()){
    block_gc_x++;
    for(y=20;y>0;y--){
      for(x=10;x>0;x--){
        if(field[y][x]==2){
          field[y][x+1]=2;
          field[y][x]=1;
        }
      }
    }
  }
}

void move_block_left(){
  if(check_block_left()){
    block_gc_x--;
    for(y=20;y>0;y--){
      for(x=1;x<11;x++){
        if(field[y][x]==2){
          field[y][x]=1;
          field[y][x-1]=2;
        }
      }
    }
  }
}

void lock_block(){
  for(y=0;y<22;y++){
    for(x=0;x<12;x++){
      if(field[y][x]==2){
        field[y][x]=3;
      }
    }
  }
}

boolean check_block_down(){
  for(y=21;y>=0;y--){
    for(x=11;x>=0;x--){
      if(field[y][x]==2){
        if(field[y+1][x]==3||field[y+1][x]==0)return false;
      }
    }
  }
  return true;
}

boolean check_block_right(){
  for(y=21;y>=0;y--){
    for(x=11;x>=0;x--){
      if(field[y][x]==2){
        if(field[y][x+1]==3||field[y][x+1]==0)return false;
      }
    }
  }
  return true;
}

boolean check_block_left(){
  for(y=21;y>=0;y--){
    for(x=11;x>=0;x--){
      if(field[y][x]==2){
        if(field[y][x-1]==3||field[y][x-1]==0)return false;
      }
    }
  }
  return true;
}

boolean check_line_down(){
  int line=0;
  for(y=21;y>=0;y--){
    for(x=1;x<11;x++){
      if(field[y][x]==3){
        if(field[y+1][x]==1){
          for(x=1;x<11;x++)line+=field[y+1][x];
          if(line==10){
            line=0;
            return true;
          }
          else{
            line=0;
            return false;
          }
        }
      }
    }
  }
  return false;
}

void clear_lines(){
  int line=0;
  int[] line_gc_y=new int [20];
  int count_line=0;
  boolean flag=false;
  for(y=1;y<21;y++){
    for(x=1;x<11;x++){
      line+=field[y][x];
    }
    if(line==30){
      flag=true;
      for(x=1;x<11;x++){
        field[y][x]=1;
      }
      line_gc_y[count_line++]=y;
    }
    line=0;
  }
  if(flag){
    for(i=0;i<=count_line;i++){
      for(y=line_gc_y[i];y>1;y--){
        for(x=1;x<11;x++){
          if(field[y][x]==3){
            field[y][x]=1;
            field[y+1][x]=3;
          }
        }
      }
    }
    draw_field();
  }
}


void turn_block(){//ここのプログラム
  int[][] block_buf=new int [4][4];
  for(y=0;y<4;y++){
    for(x=0;x<4;x++){
      if(field[block_gc_y+y][block_gc_x+x]==2)field[block_gc_y+y][block_gc_x+x]=1;
      if(block_mode==0)block_shape[y][x]=block[block_type][y][x];
      block_buf[y][x]=block_shape[x][y];
    }
  }
  for(y=0;y<4;y++){
    for(x=0;x<4;x++){
      if(block_buf[y][x]==1)field[block_gc_y+y][block_gc_x+x]=2;
      block_shape[y][x]=block_buf[y][x];
    }
  }
  block_mode++;
  if(block_mode==4)block_mode=0;
}

boolean check_block_turn(){
  return false;
}

void message_box(){
  rect(380,300,100,200);
  textAlign(CENTER);
  textSize(20);
  fill(#ffffff);
  text("y =",420,320);
  text("x =",420,340);
  text(block_gc_y,450,320);
  text(block_gc_x,450,340);
  text(block_mode,450,360);
  fill(#000000);
  
}

void turn_block()の中身で移動中のブロックを回転させたいのですが、どうしてもうまく動きません。
実行するとブロックがよくわからない形になったりします。
解決策等教えてください><

はじめまして

Re: processingでテトリスを作っています。

#2

投稿記事 by はじめまして » 12年前

すみません自己解決しました。
単にblock_typeの値の受け渡しがうまくいってないだけでした。ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る