import java.awt.image.BufferedImage;
import java.util.Random;
public class Game {
private PuzzlePiece[] puzzlePieces;
private PuzzlePiece selected;
private int xOffset, yOffset;
private BufferedImage image;
public static int pieceWidth, pieceHeight;
public Game() {
puzzlePieces = new PuzzlePiece[36];
image = PuzzlePic.getPuzzlePicture();
pieceWidth = image.getWidth() / 6;
pieceHeight = image.getHeight() / 6;
Random random = new Random();
int ctr = 0;
for(int i = 0; i < 6; i++) {
for(int j = 0; j < 6; j++) {
BufferedImage img = image.getSubimage(j * pieceWidth , i * pieceHeight,
pieceWidth, pieceHeight);
puzzlePieces[ctr] = new PuzzlePiece(img);
puzzlePieces[ctr++].setPos(random.nextInt(PicturePuzzle.WIDTH - pieceWidth - 1),
random.nextInt(PicturePuzzle.HEIGHT - pieceHeight - 1));
}
}
for(int i = 0; i < 36; i++) {
if(i >= 6) {
linkNorth(puzzlePieces[i], puzzlePieces[i - 6]);
}
if(i <= 29) {
linkSouth(puzzlePieces[i], puzzlePieces[i + 6]);
}
if(i % 6 > 0) {
linkWest(puzzlePieces[i], puzzlePieces[i - 1]);
}
if(i % 6 < 5) {
linkEast(puzzlePieces[i], puzzlePieces[i + 1]);
}
}
}
private void linkNorth(PuzzlePiece a, PuzzlePiece b) {
a.setNorthLink(b);
b.setSouthLink(a);
}
private void linkEast(PuzzlePiece a, PuzzlePiece b) {
a.setEastLink(b);
b.setWestLink(a);
}
private void linkSouth(PuzzlePiece a, PuzzlePiece b) {
a.setSouthLink(b);
b.setNorthLink(a);
}
private void linkWest(PuzzlePiece a, PuzzlePiece b) {
a.setWestLink(b);
b.setEastLink(a);
}
private PuzzlePiece getPuzzlePieceAt(int x, int y) {
for(int i = 0; i < 36; i++) {
PuzzlePiece p = puzzlePieces[i];
if(x >= p.getX() && x <= p.getX() + pieceWidth && y >= p.getY() && y <= p.getY() + pieceHeight) {
return p;
}
}
return null;
}
public int getX(int index) {
return puzzlePieces[index].getX();
}
public int getY(int index) {
return puzzlePieces[index].getY();
}
public BufferedImage getImage(int index) {
return puzzlePieces[index].getImage();
}
public PuzzlePiece getPiece(int index) {
return puzzlePieces[index];
}
public void fixOffsets(int x, int y) {
PuzzlePiece pp = getPuzzlePieceAt(x, y);
if(pp != null) {
selected = pp;
xOffset = x - selected.getX();
yOffset = y - selected.getY();
}
}
public void updateOffsets(int x, int y) {
if(selected != null)
selected.setPos(x - xOffset, y - yOffset);
}
public void releaseOffsets() {
if(selected != null)
selected.updateConnections();
xOffset = 0;
yOffset = 0;
selected = null;
}
public boolean gameOver() {
int x = puzzlePieces[0].getX();
int y = puzzlePieces[0].getY();
int ctr = 0;
for(int i = 0; i < 6; i++) {
for(int j = 0; j < 6; j++) {
PuzzlePiece p = puzzlePieces[ctr++];
if(p.getX() - x == j * pieceWidth && p.getY() - y == i * pieceHeight) {
continue;
}
return false;
}
}
return true;
}
}