/**
* Ein Schiebespiel als Java 1.1.8 komplatibles Applet<br>
* Author: L-ectron-X, 2003
*/
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class JPuzzleApplet extends Applet implements ActionListener {
private Panel numbersPanel, functionPanel;
private Label l_moves, l_empty;
private Font buttonFont;
private Button[][] buttons;
private Button b_toMix, b_toReset;
private int numberOfButtons;
private int size = 4;
private int movesCounter;
public void init() {
numberOfButtons = size * size;
this.setLayout(new BorderLayout());
buttonFont = new Font("Arial", 0, 30);
numbersPanel = new Panel();
numbersPanel.setLayout(new GridLayout(size, size));
numbersPanel.setBackground(Color.lightGray);
l_moves = new Label();
l_moves.setAlignment(Label.CENTER);
l_moves.setForeground(Color.white);
l_empty = new Label();
initNumberButtons();
b_toMix = new Button("Mischen");
b_toMix.addActionListener(this);
b_toReset = new Button("Sortieren");
b_toReset.addActionListener(this);
functionPanel = new Panel();
functionPanel.setLayout(new GridLayout(1, 4));
functionPanel.setBackground(Color.gray);
functionPanel.add(l_moves);
functionPanel.add(b_toMix);
functionPanel.add(b_toReset);
functionPanel.add(l_empty);
this.add(numbersPanel, BorderLayout.CENTER);
this.add(functionPanel, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj == b_toMix)
mixNumberButtons();
else if(obj == b_toReset)
initNumberButtons();
else
moveNumberButton(e);
}
private void mixNumberButtons() {
Button b1, b2;
int[] r = new int[4]; //Zufallszahlen (Koordinaten für 2 Buttons)
for(int i = 0; i < numberOfButtons; i++) { //Durchläufe
for(int j = 0; j < r.length; j++) { //Zufallszahlen
//Zufallszahlen ermitteln
r[j] = (int) (Math.random() * size);
}
//Zufalls-Buttons ermitteln
b1 = buttons[r[0]][r[1]];
b2 = buttons[r[2]][r[3]];
//Plätze der Buttons vertauschen
buttons[r[2]][r[3]] = b1;
buttons[r[0]][r[1]] = b2;
}
drawButtons();
movesCounter = 0;
setMovesCounter();
}
private void initNumberButtons() {
Button[][] b = new Button[size][size];
int z = 1;
for(int i = 0; i < size; i++) {
for(int j = 0; j < size; j++) {
b[i][j] = new Button(String.valueOf(z));
b[i][j].addActionListener(this);
b[i][j].setFont(buttonFont);
z += 1;
}
}
buttons = b;
//letzten Button unsichtbar machen
buttons[size-1][size-1].setVisible(false);
drawButtons();
movesCounter = 0;
setMovesCounter();
}
private void moveNumberButton(ActionEvent e) {
Button b = (Button)e.getSource();
String label = b.getLabel();
//Koordinaten von Buttons im zweidimensionalen Array
int xb1 = 0, yb1 = 0, xb2 = 0, yb2 = 0; //b1 = geklickter Button, b2 = unsichtbarer Button
//Postition des geklickten Buttons im zweidimensionalen Array ermitteln
for(int i = 0; i < size; i++) {
for(int j = 0; j < size; j++) {
//Koordinaten des geklickten Buttons speichern
if(buttons[i][j].getLabel().equals(label)) {
xb1 = i;
yb1 = j;
}
//Koordinaten des unsichtbaren Buttons
if(buttons[i][j].getLabel().equals(String.valueOf(numberOfButtons))) {
xb2 = i;
yb2 = j;
}
}
}
// links neben dem Button rechts neben dem Button
if((xb2 == xb1-1 && yb2 == yb1) || (xb2 == xb1+1 && yb2 == yb1) ||
// über dem Button unter dem Button
(yb2 == yb1-1 && xb2 == xb1) || (yb2 == yb1+1 && xb2 == xb1)) {
Button bt1 = buttons[xb1][yb1];
Button bt2 = buttons[xb2][yb2];
buttons[xb2][yb2] = bt1;
buttons[xb1][yb1] = bt2;
drawButtons();
}
}
private void drawButtons() {
numbersPanel.removeAll();
for(int i = 0; i < size; i++) {
for(int j = 0; j < size; j++) {
numbersPanel.add(buttons[i][j]);
}
}
validate();
setMovesCounter();
}
private void setMovesCounter() {
l_moves.setText("Züge: "+Integer.toString(movesCounter++));
}
}