import java.applet.Applet; import java.awt.*; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseEvent; public class robinson extends Applet { TilePanel tilepanel; TileControl tilecontrol; TileBoard tileboard; int width=700,height=500; BorderLayout bl; Image rotImg,flipImg; public void init() { rotImg=getImage(getCodeBase(),"rot.gif"); flipImg=getImage(getCodeBase(),"flip.gif"); bl=new BorderLayout(); setLayout(bl); tilepanel=new TilePanel(70,480,rotImg,flipImg); bl.preferredLayoutSize(tilepanel); add("West",tilepanel); tileboard=new TileBoard(tilepanel,630,480); bl.preferredLayoutSize(tileboard); add("Center",tileboard); tilecontrol=new TileControl(tilepanel,tileboard); bl.preferredLayoutSize(tilecontrol); add("South",tilecontrol); /* setLayout( new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); tilepanel=new TilePanel(70,480); c.gridx=0; c.gridy=0; c.gridwidth=1; c.gridheight=1; c.weightx=0.0; c.weighty=0.0; c.anchor = GridBagConstraints.CENTER; add(tilepanel,c); tilepanel.reshape(630,0,70,480); tilepanel.validate(); */ } } class TileControl extends Panel { TilePanel tilepanel; TileBoard tileboard; Button delete,redraw,clear,zoomin,zoomout,recenter; TileControl(TilePanel tilepanel, TileBoard tileboard) { this.tilepanel = tilepanel; this.tileboard = tileboard; setBackground(Color.lightGray); GridBagLayout gb = new GridBagLayout(); setFont(new Font("Helvetica", Font.PLAIN, 10)); setLayout(gb); GridBagConstraints c = new GridBagConstraints(); c.anchor=GridBagConstraints.SOUTHEAST; c.gridx=GridBagConstraints.RELATIVE; c.insets=new Insets(1,1,1,1); this.delete = new Button("Delete"); gb.setConstraints(delete,c); add(delete); this.redraw = new Button("Redraw"); gb.setConstraints(redraw,c); add(redraw); this.clear = new Button("Clear"); gb.setConstraints(clear,c); add(clear); this.zoomin = new Button("Zoom In"); gb.setConstraints(zoomin,c); add(zoomin); this.zoomout = new Button("Zoom Out"); gb.setConstraints(zoomout,c); add(zoomout); this.recenter = new Button("Re-Center"); gb.setConstraints(recenter,c); add(recenter); validate(); } public void paint(Graphics g) { } /* end of paint method */ public boolean action(Event e, Object arg) { if (e.target instanceof Button) { if (e.target == clear) { for (int x=0; xwidth-70){ curtile=(e.getY()-5)/70; if ((curtile>=0)&&(curtile<6)){ if ( (e.getX() >= width-65) && (e.getX() < width-55) && ((e.getY()-30)%70<30) ){ flip[curtile]=(flip[curtile]+1)%2; paintSide=curtile; } if ( (e.getX() >= width-20) && (e.getX() < width) && ((e.getY()-5)%70<20) ){ if (flip[curtile]==0) rot[curtile]=(rot[curtile]+1)%4; else rot[curtile]=(3+rot[curtile])%4; paintSide=curtile; } mode=1; paintmode=true; } else { mode=0; paintmode=true; } } repaint(); return; } } class TileBoard extends Panel implements MouseListener, MouseMotionListener { Dimension D= new Dimension(630,480); int tilesize=3; int xzeroloc=0,yzeroloc=0; int xnum,ynum; int tilestype[][]; //8*color+4*rot+flip int width, height; TilePanel tilepanel; boolean paintmove=false,paintmovereplace=false,paintclick=false,paintdelete=false,paintAll=false; int curx,cury; int prevx,prevy; int deltype=-1; int startx,starty,endx,endy; TileBoard(TilePanel tilepanel,int width,int height) { this.tilepanel=tilepanel; this.width=width; this.height=height; xnum=width/12; ynum=height/12; tilestype=new int [xnum+1][ynum+1]; for (int x=0; x0) startx=-xzeroloc-1; else startx=0; if (startx+width/(13*tilesize)+2 < xnum) endx=startx+width/(13*tilesize)+2; else endx=xnum; if (-yzeroloc-1>0) starty=-yzeroloc-1; else starty=0; if (starty+height/(13*tilesize)+2 < ynum) endy=starty+height/(13*tilesize)+2; else endy=ynum; } public Dimension preferedSize(){ return D; } public void paint(Graphics g) { g.setColor(Color.black); g.fillRect(0,0,width,height); for (int x=startx;x=0)&&(y>=0)&&(x0)&&(tilestype[x-1][y+1]!=-1)&&(tilestype[x-1][y+1]<8) ) || ( (x>0)&&(tilestype[x-1][y]!=-1)&&(tilestype[x-1][y]<8) ) || ( (x>0)&&(y>0)&&(tilestype[x-1][y-1]!=-1)&&(tilestype[x-1][y-1]<8) ) || ( (y>0)&&(tilestype[x][y-1]!=-1)&&(tilestype[x][y-1]<8) ) || ( (y>0)&&(tilestype[x+1][y-1]!=-1)&&(tilestype[x+1][y-1]<8) ) ) ) return false; // No Blue Tiles Four arround if ( (tilepanel.curtile!=0) && ( (tilestype[x+1][y]>7) && ( ( ( (tilestype[x+1][y+1]>7) && (tilestype[x][y+1]>7) ) || ( (y>0)&&(tilestype[x+1][y-1]>7) && (tilestype[x][y-1]>7) ) ) )|| ( (x>0)&&(tilestype[x-1][y]>7) && ( ( (tilestype[x-1][y+1]>7) && (tilestype[x][y+1]>7) ) || ( (y>0)&&(tilestype[x-1][y-1]>7) && (tilestype[x][y-1]>7) ) ) ) ) ) return false; // West-East if ( (x>0) && (tilestype[x-1][y]!=-1)&& ( ( -Tiles.xcoords[tilepanel.curtile][tilepanel.rot[tilepanel.curtile]][tilepanel.flip[tilepanel.curtile]][3] + Tiles.xcoords[tilestype[x-1][y]/8][(tilestype[x-1][y]/2)%4][tilestype[x-1][y]%2][17] != 12 ) || ( Tiles.ycoords[tilepanel.curtile][tilepanel.rot[tilepanel.curtile]][tilepanel.flip[tilepanel.curtile]][3] != Tiles.ycoords[tilestype[x-1][y]/8][(tilestype[x-1][y]/2)%4][tilestype[x-1][y]%2][17]) ) ) return false; // East-West if ( (tilestype[x+1][y]!=-1)&& ( ( Tiles.xcoords[tilepanel.curtile][tilepanel.rot[tilepanel.curtile]][tilepanel.flip[tilepanel.curtile]][17] - Tiles.xcoords[tilestype[x+1][y]/8][(tilestype[x+1][y]/2)%4][tilestype[x+1][y]%2][3] != 12 ) || ( Tiles.ycoords[tilepanel.curtile][tilepanel.rot[tilepanel.curtile]][tilepanel.flip[tilepanel.curtile]][17] != Tiles.ycoords[tilestype[x+1][y]/8][(tilestype[x+1][y]/2)%4][tilestype[x+1][y]%2][3] ) ) ) return false; // North-South if ( (y>0)&&(tilestype[x][y-1]!=-1)&& ( ( Tiles.xcoords[tilepanel.curtile][tilepanel.rot[tilepanel.curtile]][tilepanel.flip[tilepanel.curtile]][24] != Tiles.xcoords[tilestype[x][y-1]/8][(tilestype[x][y-1]/2)%4][tilestype[x][y-1]%2][10] ) || ( -Tiles.ycoords[tilepanel.curtile][tilepanel.rot[tilepanel.curtile]][tilepanel.flip[tilepanel.curtile]][24] + Tiles.ycoords[tilestype[x][y-1]/8][(tilestype[x][y-1]/2)%4][tilestype[x][y-1]%2][10] != 12) ) ) return false; // South-North if ( (tilestype[x][y+1]!=-1)&& ( ( Tiles.xcoords[tilepanel.curtile][tilepanel.rot[tilepanel.curtile]][tilepanel.flip[tilepanel.curtile]][10] != Tiles.xcoords[tilestype[x][y+1]/8][(tilestype[x][y+1]/2)%4][tilestype[x][y+1]%2][24] ) || ( Tiles.ycoords[tilepanel.curtile][tilepanel.rot[tilepanel.curtile]][tilepanel.flip[tilepanel.curtile]][10] - Tiles.ycoords[tilestype[x][y+1]/8][(tilestype[x][y+1]/2)%4][tilestype[x][y+1]%2][24] != 12) ) ) return false; return true; } public void mousePressed(MouseEvent e) { } public void mouseDragged(MouseEvent e) { e.consume(); curx=e.getX()/(12*tilesize)-xzeroloc; cury=e.getY()/(12*tilesize)-yzeroloc; if (tilepanel.mode==1) mouseMoved(e); else if ( (tilepanel.mode==2)&&(isInArray(curx,cury))&&(tilestype[curx][cury]!=-1) ){ deltype=tilestype[curx][cury]; tilestype[curx][cury]=-1; paintdelete=true; repaint(); } } public void mouseMoved(MouseEvent e) { e.consume(); curx=e.getX()/(12*tilesize)-xzeroloc; cury=e.getY()/(12*tilesize)-yzeroloc; if ( (tilepanel.mode==1)&&((prevx!=curx)||(prevy!=cury)) ){ if (isgoodplace(curx,cury)) { paintmove=true; } repaint(); } } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { e.consume(); curx=e.getX()/(12*tilesize)-xzeroloc; cury=e.getY()/(12*tilesize)-yzeroloc; if ((tilepanel.mode==1)&&(isgoodplace(curx,cury))){ paintmove=true; repaint(); } } public void mouseExited(MouseEvent e) { if ( (tilepanel.mode==1)&&(isgoodplace(curx,cury)) ){ repaint(); } } public void recenter(){ if (width/(2*12*tilesize)-curx0) xzeroloc=0; else xzeroloc=width/(2*12*tilesize)-curx; if (height/(2*12*tilesize)-cury0) yzeroloc=0; else yzeroloc=height/(2*12*tilesize)-cury; } public void mouseClicked(MouseEvent e) { e.consume(); curx=e.getX()/(12*tilesize)-xzeroloc; cury=e.getY()/(12*tilesize)-yzeroloc; if ( (tilepanel.mode==1)&&(isgoodplace(curx,cury)) ){ tilestype[curx][cury]=8*tilepanel.curtile+2*tilepanel.rot[tilepanel.curtile]+tilepanel.flip[tilepanel.curtile]; paintclick=true; repaint(); } if ( (tilepanel.mode==2)&&(isInArray(curx,cury))&&(tilestype[curx][cury]!=-1) ){ deltype=tilestype[curx][cury]; tilestype[curx][cury]=-1; paintdelete=true; repaint(); } if (tilepanel.mode==3){ recenter(); calcBorder(); paintAll=true; repaint(); } if (tilepanel.mode==4){ if (tilesize>1) tilesize--; recenter(); calcBorder(); paintAll=true; repaint(); } if (tilepanel.mode==5){ tilesize++; recenter(); calcBorder(); paintAll=true; repaint(); } } }