import java.awt.*; import java.applet.Applet; import java.net.*; public class IQPuzzle1 extends Applet { MyWindow winnerwin; Frame f; Completed_puzzle completed_puzzle; Uncompleted_puzzle uncompleted_puzzle; TextField statusline; TextField timeslot; String s; Button restartbutton; Choice newpuzzlebutton; Button showwinnersbutton; Button infobutton; Panel canvasPanel; URL theURL; public void init() { this.setBackground(Color.gray); setLayout(new FlowLayout()); Panel titlePanel = new Panel(); infobutton = new Button("Info"); titlePanel.add (infobutton); newpuzzlebutton = new Choice(); newpuzzlebutton.addItem("Puzzle1"); newpuzzlebutton.addItem("Puzzle2"); newpuzzlebutton.addItem("Puzzle3"); titlePanel.add (newpuzzlebutton); showwinnersbutton = (new Button("Show Winners")); titlePanel.add (showwinnersbutton); restartbutton = (new Button("ReStart")); titlePanel.add (restartbutton); setLayout(new FlowLayout()); canvasPanel = new Panel(); completed_puzzle = new Completed_puzzle(); completed_puzzle.setBackground(Color.yellow); uncompleted_puzzle = new Uncompleted_puzzle(this,s); uncompleted_puzzle.setBackground(Color.yellow); canvasPanel.add (completed_puzzle); canvasPanel.add (uncompleted_puzzle); setLayout(new FlowLayout()); Panel footerPanel = new Panel(); footerPanel.add(new Label("Status", Label.LEFT)); statusline = new TextField(s,40); timeslot =new TextField(" 00:00 "); statusline.setEditable(false); timeslot.setEditable(false); footerPanel.add(statusline); footerPanel.add(timeslot); setLayout(new BorderLayout()); this.add("North", titlePanel); this.add("Center", canvasPanel); this.add("South", footerPanel); } public boolean action(Event evt, Object arg) { if (evt.target == infobutton) { InfoDialog d = new InfoDialog(f, "IQPuzzle Designers", "Dave Shaffer & Chris Ly\n" + "Millersville University\n" + "CopyRight (c)1996"); d.show(); return true; } if (evt.target == showwinnersbutton) { System.out.print(" show winners button pressed\n"); winnerwin = new MyWindow("Frame"); winnerwin.show(); return true; } if (evt.target == restartbutton) { System.out.print(" restart button pressed\n"); uncompleted_puzzle.restart(); return true; } if (evt.target == newpuzzlebutton) { if (newpuzzlebutton.getSelectedItem() == "Puzzle1") { return true; } if (newpuzzlebutton.getSelectedItem() == "Puzzle2") { String urladdress2 = "http://cs.millersv.edu/~dashaffe/java_progs/assign2/IQPuzzle2.html"; try {theURL = new URL(urladdress2);} catch (MalformedURLException e) {} getAppletContext().showDocument(theURL); return true; } if (newpuzzlebutton.getSelectedItem() == "Puzzle3") { String urladdress3 = "http://cs.millersv.edu/~dashaffe/java_progs/assign2/IQPuzzle3.html"; try {theURL = new URL(urladdress3);} catch (MalformedURLException e) {} getAppletContext().showDocument(theURL); return true; } } return true; } } class Completed_puzzle extends Canvas { public void paint(Graphics g) { int w = size().width; int h = size().height; g.drawRect(0, 0, w - 1, h - 1); g.drawString("Completed Puzzle", (w - g.getFontMetrics().stringWidth("Canvas"))/2, 10); g.setFont(new Font("Helvetica", Font.PLAIN, 8)); g.fillRect(100,25,4,4); g.fillRect(50,75,4,4); g.fillRect(150,75,4,4); g.fillRect(50,150,4,4); g.fillRect(150,150,4,4); g.drawLine(102,27,52,77); g.drawLine(102,27,152,77); g.drawLine(52,77,152,77); g.drawLine(52,77,52,152); g.drawLine(52,77,152,152); g.drawLine(152,77,152,152); g.drawLine(152,77,52,152); g.drawLine(52,152,152,152); } public Dimension minimumSize() { return new Dimension(200,200); } public Dimension preferredSize() { return minimumSize(); } } class Uncompleted_puzzle extends Canvas { final Point A = new Point(102,27); final Point B = new Point(52,77); final Point C = new Point(152,77); final Point D = new Point(52,152); final Point E = new Point(152,152); boolean Edge_A_B = false; boolean Edge_A_C = false; boolean Edge_B_C = false; boolean Edge_B_D = false; boolean Edge_B_E = false; boolean Edge_C_D = false; boolean Edge_C_E = false; boolean Edge_D_E = false; final int MAXLINES = 8; Point starts[] = new Point[MAXLINES]; Point ends[] = new Point[MAXLINES]; Point anchor = new Point(-1,-1); Point currentpoint; int currline = 0; Circle c; IQPuzzle1 outerparent; Uncompleted_puzzle(IQPuzzle1 target, String statmessage) { this.outerparent = target; } public void paint(Graphics g) { int w = size().width; int h = size().height; g.drawRect(0, 0, w - 1, h - 1); g.drawString("Solve Puzzle", (w - g.getFontMetrics().stringWidth("Canvas"))/2, 10); g.setFont(new Font("Helvetica", Font.PLAIN, 8)); g.fillRect(100,25,4,4); g.fillRect(50,75,4,4); g.fillRect(150,75,4,4); g.fillRect(50,150,4,4); g.fillRect(150,150,4,4); //draw existing lines for (int i= 0; i < currline; i++) { g.drawLine(starts[i].x, starts[i].y, ends[i].x, ends[i].y); } //draw current line if (currentpoint != null) g.drawLine(anchor.x,anchor.y ,currentpoint.x ,currentpoint.y); } public void restart() { Edge_A_B = false; Edge_A_C = false; Edge_B_C = false; Edge_B_D = false; Edge_B_E = false; Edge_C_D = false; Edge_C_E = false; Edge_D_E = false; currline = 0; anchor.x = -1; anchor.y = -1; currentpoint = null; String s; s = " "; showMessage(s); repaint(); } public boolean mouseUp(Event evt, int x, int y) { c = new Circle(); int userpoint = c.check((double)x,(double)y); if (userpoint > 0) { if (userpoint == 1) { x = 102; y = 27; } else if (userpoint == 2) { x = 52; y = 77; } else if (userpoint == 3) { x = 152; y = 77; } else if (userpoint == 4) { x = 52; y = 152; } else if (userpoint == 5) { x = 152; y = 152; } if (anchor.x == -1) { // first point anchor.x = x; anchor.y = y; String s; s = " "; showMessage(s); return true; } else { currentpoint = new Point(x,y); if (check_line(anchor,currentpoint)) { String s; s = " "; showMessage(s); addline(x,y); return true; } else { currentpoint = null; String s; s = "Cannot draw that line"; showMessage(s); System.out.print(" bad line\n"); return true; } } } else { String s; s = "Click on a valid point"; showMessage(s); System.out.print(" bad point\n"); return true; } } boolean check_line (Point anchor, Point end) { if ((anchor.x == A.x) && (anchor.y == A.y)) { if ((end.x == B.x)&&(end.y == B.y)) { if (Edge_A_B == false) { Edge_A_B = true; return true; } else { return false; } } if ((end.x==C.x)&&(end.y==C.y)) { if (Edge_A_C == false) { Edge_A_C = true; return true; } else { return false; } } } // end outermost if else if ((anchor.x == B.x) && (anchor.y == B.y)) { if ((end.x == A.x)&&(end.y == A.y)) { if (Edge_A_B == false) { Edge_A_B = true; return true; } else { return false; } } if ((end.x==C.x)&&(end.y==C.y)) { if (Edge_B_C == false) { Edge_B_C = true; return true; } else { return false; } } if ((end.x == D.x)&&(end.y == D.y)) { if (Edge_B_D == false) { Edge_B_D = true; return true; } else { return false; } } if ((end.x==E.x)&&(end.y==E.y)) { if (Edge_B_E == false) { Edge_B_E = true; return true; } else { return false; } } } // end else if else if ((anchor.x == C.x) && (anchor.y == C.y)) { if ((end.x == A.x)&&(end.y == A.y)) { if (Edge_A_C == false) { Edge_A_C = true; return true; } else { return false; } } if ((end.x==B.x)&&(end.y==B.y)) { if (Edge_B_C == false) { Edge_B_C = true; return true; } else { return false; } } if ((end.x == D.x)&&(end.y == D.y)) { if (Edge_C_D == false) { Edge_C_D = true; return true; } else { return false; } } if ((end.x==E.x)&&(end.y==E.y)) { if (Edge_C_E == false) { Edge_C_E = true; return true; } else { return false; } } } // end else if else if ((anchor.x == D.x) && (anchor.y == D.y)) { if ((end.x==B.x)&&(end.y==B.y)) { if (Edge_B_D == false) { Edge_B_D = true; return true; } else { return false; } } if ((end.x == C.x)&&(end.y == C.y)) { if (Edge_C_D == false) { Edge_C_D = true; return true; } else { return false; } } if ((end.x==E.x)&&(end.y==E.y)) { if (Edge_D_E == false) { Edge_D_E = true; return true; } else { return false; } } } // end else if else if ((anchor.x == E.x) && (anchor.y == E.y)) { if ((end.x==B.x)&&(end.y==B.y)) { if (Edge_B_E == false) { Edge_B_E = true; return true; } else { return false; } } if ((end.x == C.x)&&(end.y == C.y)) { if (Edge_C_E == false) { Edge_C_E = true; return true; } else { return false; } } if ((end.x==D.x)&&(end.y==D.y)) { if (Edge_D_E == false) { Edge_D_E = true; return true; } else { return false; } } } return false; } void showMessage (String message) { outerparent.statusline.setText(message); } void addline (int x, int y) { starts[currline] = anchor; ends[currline] = new Point(x,y); currline++; repaint(); anchor = currentpoint; if (currline == MAXLINES) { String s; s = "CONGRATULATIONS!!! Puzzle Solved "; showMessage(s); } } public Dimension minimumSize() { return new Dimension(200,200); } public Dimension preferredSize() { return minimumSize(); } } class Circle { final Point A = new Point(102,27); final Point B = new Point(52,77); final Point C = new Point(152,77); final Point D = new Point(52,152); final Point E = new Point(152,152); public Circle() { } double r = 5.0; // is point (a,b) inside this circle? public int check(double a, double b) { if (isInside(a,b,A)) return 1; if (isInside(a,b,B)) return 2; if (isInside(a,b,C)) return 3; if (isInside(a,b,D)) return 4; if (isInside(a,b,E)) return 5; return 0; } public boolean isInside(double a, double b,Point thepoint) { double dx = a - thepoint.x; double dy = b - thepoint.y; double distance = Math.sqrt(dx*dx + dy*dy); if (distance < r) return true; else return false; } }