/*
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);
}
実行するとブロックがよくわからない形になったりします。
解決策等教えてください><