ブロックならべゲーム完成!!!
とりあえず、完成しましたが、まだまだ動作が不安定なところがあります。固定ブロックにする瞬間にバグ(プログラム中のミス)がある。ブロックの種類が少ない。得点が出ない。時間がたつと、スレッドの停止を1000m秒でなく、500m秒にし、ブロックの落下を早くしたい。などなど・・・不満がたくさんあるでしょう。私たちの世界は、人間が頭で考えたことは、実現しています。宇宙旅行も実現しそうですよね。プログラムを実行して、こうした方がいいという妙案がひらめいた人は早速プログラミングしてみよう!
import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.lang.Math; class Blook{ int a[][]=new int[3][3]; void setto(){ double i; i=Math.floor(Math.random()*2+1); int x,y; if(i==1){ for(x=0;x<3;x++) for(y=0;y<3;y++) a[x][y]=0; a[0][2]=1; a[1][2]=1; a[2][2]=1; a[2][1]=1; } else if(i==2){ for(x=0;x<3;x++) for(y=0;y<3;y++) a[x][y]=0; a[0][2]=1; a[1][2]=1; a[2][2]=1; a[1][1]=1; } } } class Board{ int a[][]=new int[15][12]; //置けるか?調査用の配列 int b[][]=new int[15][12]; //固定ブロック用の配列 int c[][]=new int[3][3]; //回転したブロック用の配列 int d[][]=new int[15][12]; //調査終了のブロック配列 Blook blook=new Blook(); int sum=0; int x,y; void zahyou(int x,int y){ this.x=x; this.y=y; } void init(){ int x,y; for(x=1;x<14;x++) for(y=1;y<11;y++) b[x][y]=0; for(x=0;x<15;x++){ b[x][0]=2; b[x][11]=2; } for(y=1;y<11;y++){ b[0][y]=2; b[14][y]=2; } } void setto(){ blook.setto(); } void kaiten(int z){ //回転したブロックの形を表す配列 int x1,y1; for(x1=0;x1<3;x1++) for(y1=0;y1<3;y1++) c[x1][y1]=0; if(z==0){ for(x1=0;x1<3;x1++) for(y1=0;y1<3;y1++) c[x1][y1]=blook.a[x1][y1]; } else if(z==1){ x1=0; for(y1=0;y1<3;y1++) c[x1][y1]=blook.a[y1][2]; x1=1; for(y1=0;y1<3;y1++) c[x1][y1]=blook.a[y1][1]; x1=2; for(y1=0;y1<3;y1++) c[x1][y1]=blook.a[y1][0]; } else if(z==2){ y1=0; for(x1=0;x1<3;x1++) c[x1][y1]=blook.a[x1][2]; y1=1; for(x1=0;x1<3;x1++) c[x1][y1]=blook.a[x1][y1]; y1=2; for(x1=0;x1<3;x1++) c[x1][y1]=blook.a[x1][0]; } else if(z==3){ x1=0; for(y1=0;y1<3;y1++) c[x1][y1]=blook.a[y1][0]; x1=1; for(y1=0;y1<3;y1++) c[x1][y1]=blook.a[y1][1]; x1=2; for(y1=0;y1<3;y1++) c[x1][y1]=blook.a[y1][2]; } } boolean thinkputxy(int z){ //置けるかの調査 int x,y,x1=0; //左矢印、右矢印、回転が可能かの調査 for(x=0;x<15;x++) for(y=0;y<12;y++) if(d[x][y]==1) x1++; if(x1==0) return false; for(x=0;x<15;x++) for(y=0;y<12;y++) a[x][y]=0; kaiten(z); for(x=0;x<3;x++) for(y=0;y<3;y++) if(c[x][y]==1) a[x+this.x][y+this.y]=1; for(x=0;x<15;x++) for(y=0;y<12;y++) if(a[x][y]==1 && b[x][y]==2) return false; return true; } boolean thinkputDown(int z){ //ブロックの下に固定ブロックがないかの調査 int x,y; for(x=0;x<15;x++) for(y=0;y<12;y++) a[x][y]=0; kaiten(z); for(x=0;x<3;x++) for(y=0;y<3;y++) if(c[x][y]==1) a[x+this.x][y+this.y]=1; for(x=0;x<15;x++) for(y=0;y<12;y++) if(a[x][y]==1 && b[x+1][y]==2) return false; return true; } void moveBlook(){ //ブロックの移動 for(x=0;x<15;x++) for(y=0;y<12;y++) d[x][y]=0; for(x=0;x<15;x++) for(y=0;y<12;y++) d[x][y]=a[x][y]; } void fixBlook(){ //ブロックの固定 for(x=0;x<15;x++) for(y=0;y<12;y++) if(a[x][y]==1) b[x][y]=2; for(x=0;x<15;x++) for(y=0;y<12;y++){ a[x][y]=0; d[x][y]=0; } } void sorou(){ int z,con; for(x=1;x<14;x++){ z=0; for(y=1;y<11;y++) if(b[x][y]==2) z++; if(z==10){ con=x; while(con>1){ for(y=1;y<11;y++) b[con][y]=b[con-1][y]; con--; } } } } } public class teto extends Applet implements Runnable{ Thread th; int x,y,z; Board board=new Board(); boolean flag=false; public void start(){ if(th==null){ th=new Thread(this); th.start(); } } public void run(){ while(true){ if(flag==true){ int a,b,x1=0; for(a=0;a<15;a++) for(b=0;b<12;b++) if(board.d[a][b]==1) x1++; if(x1!=0){ x++; board.zahyou(x,y); if(board.thinkputDown(z)==false) board.fixBlook(); else{ board.moveBlook(); } } else{ x=1;y=5; board.zahyou(x,y); board.setto(); if(board.thinkputDown(z)==true) board.moveBlook(); } board.sorou(); repaint(); } try{ th.sleep(1000); } catch(InterruptedException e){stop();} } } public void stop(){ if(th!=null){ th.stop(); th=null; } } public void init(){ x=1;y=5; board.init(); board.setto(); requestFocus(); addKeyListener( new KeyAdapter(){ int a,b,c=0,i=0; public void keyPressed(KeyEvent e){ switch(e.getKeyCode()){ case e.VK_DOWN:{a=x;b=y; a++; board.zahyou(a,b); if(board.thinkputDown(z)==false){ board.fixBlook(); break; } else board.moveBlook(); x=a;y=b; break; } case e.VK_LEFT:{a=x;b=y; b--; board.zahyou(a,b); if(board.thinkputxy(z)==false) break; else board.moveBlook(); x=a;y=b; break; } case e.VK_RIGHT:{a=x;b=y; b++; board.zahyou(a,b); if(board.thinkputxy(z)==false) break; else board.moveBlook(); x=a;y=b; break; } case e.VK_SPACE:{c++; i=c-c/4*4; board.zahyou(x,y); if(board.thinkputxy(i)==false) break; else board.moveBlook(); z=i; } } repaint(); } } ); } public void paint(Graphics g){ int a,b; g.setColor(Color.black); for(b=0;b<12;b++) if(board.b[14][b]==2) g.fillRect(b*20,14*20,19,19); for(a=0;a<14;a++){ if(board.b[a][11]==2) g.fillRect(0*20,a*20,19,19); if(board.b[a][11]==2) g.fillRect(11*20,a*20,19,19); } g.setColor(Color.green); for(a=1;a<14;a++) for(b=1;b<11;b++) if(board.b[a][b]==2) g.fillRect(b*20,a*20,19,19); g.setColor(Color.yellow); for(a=1;a<14;a++) for(b=1;b<11;b++) if(board.d[a][b]==1) g.fillRect(b*20,a*20,19,19); } } }
![]() |