// PUZZLE.JAVA - A simple class to put a jigsaw puzzle together.
//
// author Randy Reichle. Copyright (C) 1996 Randy Reichle
// All Rights Reserved.
//
// Description: Simple jigsaw puzzle from within Java applet,
// implements simple animation, comic book style
// messages and can connect directly to a URL.
//
// Usage Notes: Java 2.0 Beta
//
// Date : 02/15/96
//
// Example of how to call the applet:
//
//
// LEGALESE:
// Permission to use, copy, modify, and distribute this software
// and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
// without fee is hereby granted. No express promises are made,
// as to the usability of this software for any purpose whatsoever.
import java.applet.Applet;
import java.awt.*;
import java.util.*;
import java.awt.image.*;
import java.net.*;
import java.io.*;
public class puzzle extends Applet implements Runnable {
Button
start_button,
instruction_button,
rotate_button;
Thread
kicker = null;
Image
imgs[],
waves[],
talking,
offScrImage;
Graphics
offScrGr;
URL // connecting to URL requires using a web
currURL = null; // browser for connection to occur
int
pi,
pi1,
ro1 = 0,
co1 = 0,
ro2 = 0,
co2 = 0,
loaded=0,
wa=0,
wave=0,
done,
cheat=0,
move=0,
number=0,
inst=0,
starter=0,
talk=0;
int be[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, 18 };
int b[]= { 25, 55,100, 55,173, 55,246, 55,319, 55,392, 55,465, 55,
25,127,100,127, 392,127,465,127,
25,199,100,199, 392,199,465,199,
164, 126, 204, 126, 244, 126, 284, 126, 324, 126,
164, 166, 204, 166, 244, 166, 284, 166, 324, 166,
164, 206, 204, 206, 244, 206, 284, 206, 324, 206 };
int ran[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
public void init() {
try {
currURL = new URL("http://www.javasoft.com/");
} catch (IOException e) {}
randomize();
if(loaded==0) {
talking = getImage(getCodeBase(), "talk.gif");
load_pieces(getImage(getCodeBase(), "pieces.gif"), this);
load_wave(getImage(getCodeBase(), "wave.gif"), this);
loaded=1;
}
offScrImage = createImage(513, 248);
offScrGr = offScrImage.getGraphics();
add(start_button = new Button("Restart"));
add(instruction_button = new Button("Instructions"));
add(rotate_button = new Button("Rotate"));
}
public void load_pieces(Image base_image, Component component) {
imgs = new Image[19];
for (int i=1; i<=19; i++) {
ImageFilter crop = new CropImageFilter(0, 70*(i-1), 70, 70);
imgs[i-1] = component.createImage(
new FilteredImageSource(base_image.getSource(), crop));
component.prepareImage(imgs[i-1], component);
}
}
public void load_wave(Image base_image, Component component) {
waves = new Image[11];
for (int i=1; i<=11; i++) {
ImageFilter crop = new CropImageFilter(0, 68*(i-1), 55, 68);
waves[i-1] = component.createImage(
new FilteredImageSource(base_image.getSource(), crop));
component.prepareImage(waves[i-1], component);
}
}
public void run() {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while ( kicker != null ) {
if(starter==0) { sleep(900); starter=1; }
if(wave!=0) sleep(10);
repaint();
}
}
public boolean imageUpdate(Image img, int flags, int x, int y,
int w, int h) {
return true;
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
if(wave==0 && inst==0) {
offScrGr.setColor(Color.blue);
offScrGr.fillRect(0, 0, 513, 248);
offScrGr.setColor(Color.red);
offScrGr.drawRect( 154, 116, 201, 121);
for(int i=0; i<60; i+=2) { // draw squares if piece is missing
if(be[i/2] == 18) offScrGr.drawRect( b[i], b[i+1], 20, 20);
}
for(int i=0; i<60; i+=2) { // draw pieces
if(be[i/2] != 18) {
offScrGr.drawImage(imgs[be[i/2]], b[i]-24, b[i+1]-24, this);
}
}
offScrGr.setColor(Color.orange);
offScrGr.setFont(new Font("TimesRoman", Font.PLAIN, 24));
offScrGr.drawString(" Waving Duke ",10,23);
offScrGr.drawString(" Jigsaw Puzzle ",355,23);
if(starter==0) {
offScrGr.setColor(Color.white);
offScrGr.fillRect( 155, 117, 200, 120);
offScrGr.setColor(Color.red);
offScrGr.setFont(new Font("TimesRoman", Font.PLAIN, 14));
offScrGr.drawString("Pieces are",230,150);
offScrGr.drawString("Please be patient",210,220);
offScrGr.setFont(new Font("TimesRoman", Font.PLAIN, 24));
offScrGr.drawString("L O A D I N G",185,190);
}
done=0; check_if_done(g);
if(cheat==1) {
for(int i=0; i<15; i++) be[i]=18;
for(int i=15; i<30; i++) { be[i]=i-15; cheat=0; }
}
}
if(wave==1 && inst==0) duke_waving(g);
if(move==1) offScrGr.drawImage(imgs[be[30]], co2, ro2, this);
g.drawImage(offScrImage, 0, 0, this);
}
public void randomize() {
int
rnum,
count = 0;
for(;;) {
rnum = (int)(15 * Math.random());
for(int i=0; i<=14; i++) {
if(rnum==ran[i]) { ran[i]=100; be[count]=rnum; count++; break; }
}
if(count==15) break;
}
for(int i=0; i<=14; i++) {
if(be[i]==5) be[i]=15;
if(be[i]==12) be[i]=16;
if(be[i]==2) be[i]=17;
}
}
public void start() {
if (kicker == null) { kicker = new Thread(this); kicker.start(); }
}
public void stop() {
kicker = null;
}
public void sleep(int pause) {
for(int i=0; i<1000; i++) { for(int j=0; j=222 && co1<=351 && ro1>=205 && ro1<=218 && wave==1) {
getAppletContext().showDocument(currURL);
}
}
if(wave==0) {
for(int i=0; i<60; i+=2) {
if(co1>=b[i]-10 && co1<=b[i]+30 && ro1>=b[i+1]-10 && ro1<=b[i+1]+30){
if((be[i/2]<18)) {
co1=b[i]; ro1=b[i+1]; pi=be[i/2]; pi1=i/2; move=1;
be[30]=pi;
break;
}
if(be[i/2]==18 && (move==1)) {
be[i/2]=pi; be[pi1]=18; move=0; number++;
if(number>=5) { start_button.setLabel("Solve"); }
break;
}
}
}
}
}
if (evt.id == Event.MOUSE_MOVE && inst==0) {
ro1 = evt.y; co1 = evt.x;
ro2=evt.y-30; co2=evt.x-30;
if(co1>=160 && co1<=215 && ro1>=156 && ro1<=225 && inst==0) {
talk=1;
}
if((co1<=160||co1>=215||ro1<=156||ro1>=225) && inst==0 && talk==1){
talk=2;
}
}
switch(evt.id) {
case Event.ACTION_EVENT: {
if("Solve".equals(evt.arg)) { if(inst==0) cheat=1; }
if("Restart".equals(evt.arg)) { restart(); }
if("Instructions".equals(evt.arg)) { instructions(); }
if("Resume".equals(evt.arg)) { resume(); }
if("Rotate".equals(evt.arg)) { rotate(); }
}
}
return true;
}
}