/****************************/ /* 領域の境界線(縁取り) */ /****************************/ import java.awt.*; public class algoborder extends java.applet.Applet { Image screen; Graphics g_screen; Button gob,clb; boolean dot[][]=new boolean[32][32]; int bx,by; public void init(){ resize(240,240); setBackground(Color.green); setFont(new Font("TimesRoman",Font.PLAIN,12)); screen=createImage(193,193); g_screen=screen.getGraphics(); this.setLayout((LayoutManager)null); gob=new Button("G o!"); add(gob); gob.setBounds(8,208,64,28); clb=new Button("Clear"); add(clb); clb.setBounds(120,208,80,28); clearScreen(); bx=0; by=0; } public boolean action(Event evt,Object What) { int i,j,x,y,dx,dy,oldx,oldy,sx,sy; if (evt.target==gob) { /* 境界線を描く */ x=16; y=16; for (i=16;i>1;i--) /* 上に移動しながら壁を探す */ if(dot[x][i]!=dot[x][y]) break; y=++i; sx=x; /* 壁のスタート位置 */ sy=y; dx=-1; /* 最初の探査方向右 */ dy=0; i=0; g_screen.setColor(Color.blue); g_screen.fillRect(sx*6+1,sy*6+1,5,5); g_screen.setColor(Color.red); if (sx==16 && sy==16) return false; do { /* 境界線を描く */ oldx=x; oldy=y; do { if (x+dx<0 ||x+dx>31 ||y+dy<0 ||y+dy>31) break; /* 端に達したら終了 */ if (dot[x+dx][y+dy]==dot[x][y]) { x+=dx; /* 壁がなければ進む */ y+=dy; if (dx==-1 && dy==0) { dx=0; dy=-1; } else if(dx==0 && dy==1) { dx=-1; dy=0; } else if(dx==1 && dy==0) { dx=0; dy=1; } else if (dx==0 && dy==-1) { dx=1; dy=0; } /* 探査方向を一つ戻す */ } else if (dx==-1 && dy==0) { dx=0; dy=1; } else if(dx==0 && dy==1) { dx=1; dy=0; } else if(dx==1 && dy==0) { dx=0; dy=-1; } else if (dx==0 && dy==-1) { dx=-1; dy=0; } /* 壁があれば探査方向を変える */ } while (oldx==x && oldy==y); /* 一つ進むまで繰り返す */ if (sx==x && sy==y) /* 壁のスタート地点まできたら終了 */ break; g_screen.fillRect(x*6+1,y*6+1,5,5); i++; } while (i<1024); /* 無限ループ防止 */ repaint(); return true; } if (evt.target==clb) { clearScreen(); return true; } return false; } public void clearScreen() { /*画面初期化*/ int i,j; g_screen.setColor(Color.white); g_screen.fillRect(0,0,193,193); g_screen.setColor(Color.gray); for (i=0;i<33;i++) { g_screen.drawLine(i*6,0,i*6,193); g_screen.drawLine(0,i*6,193,i*6); } g_screen.setColor(Color.green); g_screen.drawRect(96,96,6,6); for (i=0;i<32;i++) for (j=0;j<32;j++) dot[j][i]=false; repaint(); } public void drawScreen() { /* 領域を描く */ int i,j; for (i=0;i<32;i++) for (j=0;j<32;j++) { if (dot[j][i]) g_screen.setColor(Color.black); else g_screen.setColor(Color.white); g_screen.fillRect(j*6+1,i*6+1,5,5); } repaint(); } public boolean mouseDown(Event evt,int mx,int my) { int x,y; if (mx<8 ||mx>201 ||my<8 ||my>201) return false; x=(mx-8)/6; y=(my-8)/6; dot[x][y]=!dot[x][y]; drawScreen(); bx=x; by=y; return true; } public boolean mouseDrag(Event evt,int mx,int my) { int x,y; if (mx<8 ||mx>201 ||my<8 ||my>201) return false; x=(mx-8)/6; y=(my-8)/6; if (bx==x && by==y) return false; dot[x][y]=!dot[x][y]; drawScreen(); bx=x; by=y; return true; } public void paint(Graphics g){ g.drawImage(screen,8,8,this); /*表示用イメージを表示*/ } public void update(Graphics g){ paint(g); } }