/*
* @(#)Puzzle.java
*
* Copyright (c) 1996 Aaron Fuegi All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
* without fee is hereby granted.
* Acknowledgments:
* Thanks to Jason Heirtzler, previously of Boston University who wrote
* this game as a script long ago.
* Thanks to Arthur van Hoff whose TicTacToe code formed a rough basis for
* this code.
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import java.applet.*;
/**
* A 9-piece Puzzle applet. A very simple, and mostly brain-dead
* implementation of this dumb game!
* @author Aaron Fuegi
*/
public
class Puzzle extends Applet implements MouseListener {
Image offscreenImg;
Graphics offscreenG;
int curlocs[] = {-1,-1,-1,-1,-1,-1,-1,-1,-1};
static final int WIN = 1;
static final int DEBUG = 0;
static final int height=180;
static final int width=177;
int xoff = width / 3;
int yoff = height / 3;
int numPieces=9;
int piecesHigh=3;
int piecesAcross=3;
int openloc;
int ininit=1;
int firstMove=0;
int done[];
int alldone=0;
/**
* Figure what the status of the game is.
*/
int status() {
for (int i=0;i<9;i++)
if (curlocs[i]!=i) { return -1; }
return WIN;
}
/**
* The image for white.
*/
Image squares[];
Image victory;
Image again;
Image win;
/**
* Initialize the applet. Resize and load images.
*/
public void init() {
int i,j;
int temp = -1;
offscreenImg = createImage(this.getSize().width,this.getSize().height);
offscreenG=offscreenImg.getGraphics();
offscreenG.setColor(getBackground());
offscreenG.fillRect(0,0,this.getSize().width,this.getSize().height);
showStatus("Beginning Loading Pieces...");
done=new int[numPieces];
for(i=0;i<9;i++) done[i]=0;
squares = new Image[numPieces];
for (i=0;i<9;i++) {
squares[i] = getImage(getCodeBase(), "images/puzzle/p"+i+".gif");
showStatus("Loaded piece "+i+"/"+numPieces);
}
showStatus("Loading other images for end game");
victory = getImage(getCodeBase(), "images/puzzle/victory.gif");
again = getImage(getCodeBase(), "images/puzzle/again.gif");
if (DEBUG==1) win = getImage(getCodeBase(), "images/puzzle/win.gif");
setBoard();
addMouseListener(this);
}
public void setBoard() {
int i,j;
int movedir;
int deformValue;
/* Set board to winning position */
for (i=0;i<9;i++) {
curlocs[i]= i;
}
openloc=4;
showStatus("Setting up Board");
/* Make random number of moves to deform board position */
deformValue = 150 + (int)Math.floor(Math.random()*100.00);
for (i=0;i5)&&(movedir==2))||
((((openloc+1)%3)==0)&&(movedir==3)))
movedir = (int)Math.floor(Math.random()*4);
deformmove(movedir);
}
showStatus("Begin play");
firstMove=1;
}
public void deformmove(int dir) {
int swapval = -1;
int r,c;
/* Check up,down,left,right */
if (dir==0) { swapval=openloc-3; }
if (dir==2) { swapval=openloc+3; }
if (dir==1) { swapval=openloc-1; }
if (dir==3) { swapval=openloc+1; }
/* No need for dummy variable since black is always 4 */
curlocs[openloc]=curlocs[swapval];
curlocs[swapval]=4;
openloc=swapval;
}
public void update(Graphics g) {
paint(g);
}
/**
* Paint it.
*/
public void paint(Graphics g) {
int i = 0;
if (firstMove==1) {
if (alldone==1) firstMove=0;
for (int r = 0 ; r < 3 ; r++) {
for (int c = 0 ; c < 3 ; c++) {
int loc=r*3+c;
int whichPiece=curlocs[loc];
offscreenG.drawImage(squares[whichPiece], c*xoff + 1, r*yoff + 1, this);
}
}
}
if (status()==WIN) {
showStatus("Game Over: Victory");
offscreenG.drawImage(victory, 200, 1, this);
offscreenG.drawImage(again, 300, 119, this);
}
else if (DEBUG==1)
offscreenG.drawImage(win, 300, 119, this);
else {
offscreenG.fillRect(200,1,300,160);
}
g.drawImage(offscreenImg,0,0,this);
}
public boolean imageUpdate(Image img, int flags, int x, int y, int wid, int ht) {
int i;
int alldonehere=1;
if (flags == ALLBITS) {
for(i=0;i<9;i++) {
if (img.equals(squares[i])) {
done[i]=1;
}
}
for(i=0;i<9;i++) {
if (done[i]!=1) alldonehere=0;
}
if (alldonehere==1) {
alldone=1;
repaint();
}
}
return true;
}
public int makemove(int row, int col) {
int loc=row*3+col;
int r,c,whichPiece;
int swapval = -1;
/* Check up,down,left,right */
if ((row!=0)&&(curlocs[(loc-3)]==4)) { swapval=loc-3; }
if ((row!=2)&&(curlocs[(loc+3)]==4)) { swapval=loc+3; }
if ((col!=0)&&(curlocs[(loc-1)]==4)) { swapval=loc-1; }
if ((col!=2)&&(curlocs[(loc+1)]==4)) { swapval=loc+1; }
if (swapval != -1) {
/* No need for dummy variable since black is always 4 */
curlocs[swapval]=curlocs[loc];
curlocs[loc]=4;
r=swapval/3;
c=swapval % 3;
whichPiece=curlocs[swapval];
offscreenG.drawImage(squares[whichPiece], c*xoff + 1, r*yoff + 1, this);
r=loc/3;
c=loc % 3;
whichPiece=4;
offscreenG.drawImage(squares[whichPiece], c*xoff + 1, r*yoff + 1, this);
return 1;
}
else {
return swapval;
}
}
/**
* The user has clicked in the applet. Figure out where
* and see if a legal move is possible. If it is a legal
* move, respond with a legal move (if possible).
*/
/* public boolean mouseUp(Event evt, int x, int y) { */
public void mouseReleased(MouseEvent e) {
int x,y;
x=e.getX();
y=e.getY();
if ((status()==WIN)&&(x>300)&&(x<400)&&(y>119)&&(y<159)) {
System.out.println("Restart");
setBoard();
repaint();
}
// Figure out the row/colum
int c = (x * 3) / width;
int r = (y * 3) / height;
if ((x>300)&&(x<400)&&(y>119)&&(y<159)&&(DEBUG==1)) {
for(int i=0;i<9;i++)
curlocs[i]=i;
firstMove=1;
}
else if ((c>=0)&&(c<3)&&(r>=0)&&(r<3)) {
if (DEBUG==1) System.out.println("Made move");
makemove(r,c);
}
repaint();
showStatus("Play in progress");
}
public void mousePressed(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public String getAppletInfo() {
return "9-Puzzle by Aaron Fuegi";
}
}