/********************************/ /*              */ /* ブロック崩し ver.0.93  */ /* */ /* 1997/ 5/21 宍戸 輝光  */ /*              */ /********************************/ import java.awt.*; import java.util.Random; public class block extends java.applet.Applet implements Runnable { Image screen; Graphics g_screen; Panel pn; Button start; Choice level; Thread runner; Random rnd=new Random(); String s; FontMetrics fm; int i,j,x,y,oldX,oldY,dx,dy,gamest,wait,sc; int barX,barY,oldBarX,oldBarY,ballX,ballY,oldBallX,oldBallY; int st[][]=new int[20][20]; public void start(){ resize(360,400); setBackground(Color.green); /*アプレットの背景を緑にする*/ screen=createImage(320,320); g_screen=screen.getGraphics(); g_screen.setFont(new Font("TimesRoman",Font.BOLD,18)); fm=g_screen.getFontMetrics(new Font("TimesRoman",Font.BOLD,18)); pn=new Panel(); start=new Button(); start.setBackground(Color.lightGray); start.setFont(new Font("TimesRoman",Font.PLAIN,16)); start.setLabel("Start"); level=new Choice(); level.setBackground(Color.white); level.setFont(new Font("TimesRoman",Font.PLAIN,12)); level.addItem("Very Hard"); level.addItem("Hard"); level.addItem("Normal"); level.addItem("Easy"); level.select(2); this.setLayout((LayoutManager)null); add(pn); pn.reshape(120,360,160,36); pn.setLayout(new FlowLayout(FlowLayout.LEFT,8,4)); pn.add(start); pn.add(level); screenInit(); repaint(); s=new String(); wait=300; gamest=0; if (runner==null) { runner=new Thread(this); /*スレッド生成*/ runner.start(); } } public void stop() { /*終了時にスレッド破棄*/ if (runner!=null) { runner.stop(); runner=null; } } public synchronized void screenInit() { /*画面・ブロックを初期化*/ g_screen.setColor(Color.white); g_screen.fillRect(0,0,320,320); g_screen.setColor(Color.black); g_screen.fillRect(16,16,288,304); for (i=1;i<4;i++) /*画面情報にブロックの配置を設定*/ for (j=0;j<9;j++) { st[j*2+1][i]=1; st[j*2+2][i]=1; } for (i=0;i<20;i++) { /*画面情報に壁を設定*/ st[i][0]=3; st[0][i]=3; st[19][i]=3; st[i][17]=0; } for (i=1;i<4;i++) { /*ブロックを描く*/ for (j=0;j<9;j++) { if ((i % 2)==0) /*ブロックの色決定*/ g_screen.setColor(Color.blue); else g_screen.setColor(Color.red); g_screen.fillRect(j*32+16,i*16,32,16); g_screen.setColor(Color.white); g_screen.drawRect(j*32+16,i*16,32,16); } } st[10][17]=2; st[11][17]=2; oldBarX=10; oldBarY=17; g_screen.setColor(Color.white); /*バーを描く*/ g_screen.fillRect(160,272,32,12); dx=1; /*ボールの移動量初期値*/ dy=-1; } public void run() { /*スレッド本体*/ int sx; double r; while (true) { if (gamest==1) ballMove(); /*ボール移動*/ else { /*ゲーム開始・終了メッセージ*/ r=rnd.nextDouble(); /*文字の色を変える*/ if (r<0.25) g_screen.setColor(Color.magenta); else if (r<0.50) g_screen.setColor(Color.blue); else if (r<0.75) g_screen.setColor(Color.yellow); else g_screen.setColor(Color.red); if (gamest==0) s="Push Start Button!!"; else if (gamest==2) s="Game Over!!"; else s="Game Clear!!"; sx=(400-fm.stringWidth(s))/2;/*センタリング*/ g_screen.drawString(s,96,160); } repaint(); try { Thread.sleep(wait); } /*ウエイト*/ catch (InterruptedException e) {} } } public synchronized void ballMove() { int i,j,wx,wy; g_screen.setColor(Color.black); g_screen.fillOval(oldBallX*16,oldBallY*16,16,16); g_screen.setColor(Color.cyan); g_screen.fillOval(ballX*16,ballY*16,16,16); if (st[ballX+dx][ballY]==1) { /*ブロックとの衝突判定*/ wx=(ballX+dx-1)/2; st[wx*2+1][ballY]=0; st[wx*2+2][ballY]=0; g_screen.setColor(Color.black); g_screen.fillRect(wx*32+16,ballY*16,32,17); dx=-dx; sc++; if (wait>50) wait--; if (sc>=27) { /*ゲームクリア*/ gamest=3; start.enable(true); level.enable(true); wait=300; } } if (st[ballX][ballY+dy]==1) { /*ブロックとの衝突判定*/ wx=(ballX-1)/2; st[wx*2+1][ballY+dy]=0; st[wx*2+2][ballY+dy]=0; g_screen.setColor(Color.black); g_screen.fillRect(wx*32+16,(ballY+dy)*16,32,17); dy=-dy; sc++; if (wait>50) wait--; if (sc>=27) { /*ゲームクリア*/ gamest=3; start.enable(true); level.enable(true); wait=300; } } if (st[ballX+dx][ballY]>1) /*壁との衝突判定*/ dx=-dx; if (st[ballX][ballY+dy]>1) /*壁との衝突判定*/ dy=-dy; oldBallX=ballX; oldBallY=ballY; ballX+=dx; /*ボール移動*/ ballY+=dy; if (ballY>=19) { /*ミス判定*/ gamest=2; start.enable(true); level.enable(true); wait=300; } } public boolean action(Event evt,Object what) { if (evt.target==start) { /*ゲーム開始*/ start.enable(false); level.enable(false); wait=level.getSelectedIndex()*50+50; ballX=(rnd.nextInt() % 6)+10; /*ボールの初期位置*/ ballY=16; oldBallX=ballX; oldBallY=ballY; gamest=1; sc=0; screenInit(); repaint(); } return false; } public boolean mouseMove(Event evt,int mx,int my){ /*マウス移動*/ if (mx<36 ||mx>307 ||my<256 ||my>324 ||gamest!=1) return false; barX=(int)((mx-36)/16)+1; st[oldBarX][17]=0; st[oldBarX+1][17]=0; st[barX][17]=2; st[barX+1][17]=2; synchronized(this) { /*他のスレッドとは排他的実行*/ g_screen.setColor(Color.black); g_screen.fillRect(oldBarX*16,272,32,12); g_screen.setColor(Color.white); g_screen.fillRect(barX*16,272,32,12); } oldBarX=barX; return true; } public void paint(Graphics g){ g.drawImage(screen,20,20,this); } public void update(Graphics g){ paint(g); } }