// Triangle Puzzle by // Dr. Roger Webster // 4/29/96 import java.applet.*; import java.awt.*; import java.awt.image.*; import java.net.*; import java.util.*; public class Triangle extends Applet { protected Image image; // image to display. protected Image trihole_image; // image to display. protected Image hole_image; // image to display. protected Vector rects; // list of rectangles in it. protected Board board; protected boolean user_play_mode = true; protected int peg1, peg2, hole; protected boolean have_a_peg = false; protected Trianglewindow Twin; protected Frame f; public void init() { // load the image to be displayed. image = this.getImage(this.getDocumentBase(), this.getParameter("image")); // lookup a list of rect areas and map to. rects = new Vector(); ImagemapRectangle r; int i = 0; while((r = getRectangleParameter("rect" + i)) != null) { rects.addElement(r); i++; } board = new Board(); // create a board ds trihole_image = this.getImage(this.getDocumentBase(), this.getParameter("triholeimage")); hole_image = this.getImage(this.getDocumentBase(), this.getParameter("holeimage")); f = new Frame("Triangle Puzzle Message Window"); f.resize(30, 100); f.show(); Twin = new Trianglewindow (this, f, "Triangle Puzzle Message Window", "Starting Triangle Puzzle"); Twin.show(); load_croppedimages(); Twin.write_msg("Starting Triangle Puzzle"); } // Called when applet is being unloaded from the system. // usehere to "flush" the image. This may result in memory // and other resources being freed quicker. public void destroy() { f.dispose(); image.flush(); trihole_image.flush(); hole_image.flush(); Twin.dispose(); } // Display the image. public void paint(Graphics g) { g.drawImage(image, 0, 0, this); DrawPuzzle(g); } // find the rectangle we're inside private ImagemapRectangle findrect(int x, int y) { int i; ImagemapRectangle r = null; for(i = 0; i < rects.size(); i++) { r = (ImagemapRectangle) rects.elementAt(i); if (r.inside(x, y)) break; } if (i < rects.size()) return r; else return null; } public boolean action(Event e, Object what) { if (e.target instanceof Button) { this.showStatus("in this's action method"); String label = (String)what; if (label.equals ("SOLVE")) Twin.write_msg("solve hit"); return true; } return false; } public int load_croppedimages() { int i; ImagemapRectangle r = null; for(i = 0; i < rects.size(); i++) { r = (ImagemapRectangle) rects.elementAt(i); if (r.pegimage == null) { ImageFilter cropper = new CropImageFilter(r.x, r.y, r.width, r.height); ImageProducer prod = new FilteredImageSource(image.getSource(), cropper); r.pegimage = createImage(prod); } /* This works if the gifs are aligned!!! RWW if (r.holeimage == null) { ImageFilter cropper = new CropImageFilter(r.x, r.y, r.width, r.height); ImageProducer prod = new FilteredImageSource(hole_image.getSource(), cropper); r.holeimage = createImage(prod); } */ r.holeimage = hole_image; } if (i < rects.size()) return 1; else return 0; } private ImagemapRectangle Peg_to_Rectangle(int peg) { int i; ImagemapRectangle r = null; for(i = 0; i < rects.size(); i++) { r = (ImagemapRectangle) rects.elementAt(i); if (r.holenum == peg) break; } if (i < rects.size()) return r; else return null; } private int DrawPuzzle(Graphics g) { int i; ImagemapRectangle r = null; for(i = 0; i < rects.size(); i++) { r = (ImagemapRectangle) rects.elementAt(i); if (r.is_a_peg) g.drawImage(r.pegimage, r.x, r.y, this); else g.drawImage(hole_image, r.x, r.y, this); } if (i < rects.size()) return 1; else return 0; } // On button down, highlight the rectangle,display message public boolean mouseDown(Event e, int x, int y) { int left; ImagemapRectangle r = findrect(x, y); this.showStatus("click on a peg and then the hole"); if (r == null) return false; Graphics g = this.getGraphics(); g.drawRect(r.x, r.y, r.width, r.height); if (user_play_mode) { if (have_a_peg) { hole = r.holenum; have_a_peg = false; peg2 = board.try_jumping(peg1, hole); if (peg2 != 0) { left = board.count_ones(); Twin.write_msg("There are now: " + left + " pegs left"); draw_jumping_peg (peg1, peg2, hole); } } else { peg1 = r.holenum; have_a_peg = true; this.showStatus("peg1: "+peg1+" selected, now click on the hole"); } } return true; } // On button up, unhighlight the rectangle. // If still inside the rectangle public boolean mouseUp(Event e, int x, int y) { return true; } public void draw_jumping_peg (int peg1, int peg2, int hole) { Graphics g = this.getGraphics(); ImagemapRectangle r = Peg_to_Rectangle(peg1); r.is_a_peg = false; r = Peg_to_Rectangle(peg2); r.is_a_peg = false; r = Peg_to_Rectangle(hole); r.is_a_peg = true; repaint(); } // Parse comma-separated list of rectangle coords and protected ImagemapRectangle getRectangleParameter(String name) { int x, y, w, h; int holenum; Image pegimage = null; Image holeimage = null; boolean is_a_peg; String value = this.getParameter(name); if (value == null) return null; try { StringTokenizer st = new StringTokenizer(value, ","); x = Integer.parseInt(st.nextToken()); y = Integer.parseInt(st.nextToken()); w = Integer.parseInt(st.nextToken()); h = Integer.parseInt(st.nextToken()); holenum = Integer.parseInt(st.nextToken()); } catch (NoSuchElementException e) return null; catch (NumberFormatException e) return null; if (holenum == 4) // middle hole has no peg to start is_a_peg = false; else is_a_peg = true; return new ImagemapRectangle(x, y, w, h, holenum, pegimage, hole_image, is_a_peg); } public int solve () { int list_of_moves = 1; int isequal; isequal = board.is_equal_to_goal(); if (isequal == 15 ) Twin.write_msg("Board equal to goal_state"+isequal); else Twin.write_msg("Board NOT equal to goal_state"+isequal); return (list_of_moves); } // end of solve } // end Triangle.java // like java.awt.Rectangle, but with added fields // The constructor lets us create them from param specs. class ImagemapRectangle extends Rectangle { int holenum; Image pegimage; Image holeimage; boolean is_a_peg; public ImagemapRectangle(int x, int y, int w, int h, int holenum, Image pegimage, Image holeimage, boolean is_a_peg) { super(x, y, w, h); this.holenum = holenum; this.pegimage = pegimage; this.holeimage = holeimage; this.is_a_peg = is_a_peg; } }