import java.awt.*;
import javax.swing.ImageIcon;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.Timer;
import java.awt.event.*;
public class SolitaireCanvas extends JComponent implements MouseMotionListener,MouseListener,ActionListener {
TSpielfeld[][] Spielfeld;
private Image kugelImage=null;
private Image kugelImage2=null;
private Image lochImage=null;
private Image spielbrettImage=null;
private Image backgroundImage=null;
private int mapX=100;
private int mapY=20;
private int feldXAnz=7;
private int feldYAnz=7;
private int moeglicheZuegeAnz;
private static int verbleibendeKugelAnz;
private Timer timer;
private int sekunden=0;
private int minuten=0;
private int stunden=0;
private static String zeit="00:00:00";
private int mX, mY;
private int tmpmX, tmpmY;
private boolean mKlick;
private int merkFeldX;
private int merkFeldY;
private int mouseFeldX;
private int mouseFeldY;
private int feldX;
private int feldY;
class TSpielfeld {
int frames;
int aktiv;
public void TSpielfeld() {}
}
public SolitaireCanvas() {
addMouseListener(this);
addMouseMotionListener(this);
init();
}
public void init() {
Spielfeld = new TSpielfeld[feldXAnz][feldYAnz];
for (int y=0; y<feldYAnz; y++) {
for (int x=0; x<feldXAnz; x++) {
Spielfeld[x][y] = new TSpielfeld();
Spielfeld[x][y].frames = 1;
Spielfeld[x][y].aktiv = 1;
if (((x >= 0) && (x <= 1)) && ((y >= 0) && (y <= 1))) {
Spielfeld[x][y].frames = 0;
Spielfeld[x][y].aktiv = 0;
}
if (((x >= 5) && (x <= 6)) && ((y >= 0) && (y <= 1))) {
Spielfeld[x][y].frames = 0;
Spielfeld[x][y].aktiv = 0;
}
if (((x >= 0) && (x <= 1)) && ((y >= 5) && (y <= 6))) {
Spielfeld[x][y].frames = 0;
Spielfeld[x][y].aktiv = 0;
}
if (((x >= 5) && (x <= 6)) && ((y >= 5) && (y <= 6))) {
Spielfeld[x][y].frames = 0;
Spielfeld[x][y].aktiv = 0;
}
}
}
Spielfeld[3][3].frames = 2;
Spielfeld[3][3].aktiv = 1;
ImageIcon b1 = new ImageIcon(Game.class.getResource("img/kugel.png"));
ImageIcon b2 = new ImageIcon(Game.class.getResource("img/kugel2.png"));
ImageIcon b3 = new ImageIcon(Game.class.getResource("img/loch.png"));
ImageIcon b4 = new ImageIcon(Game.class.getResource("img/spielbrett.png"));
ImageIcon b5 = new ImageIcon(Game.class.getResource("img/background.png"));
kugelImage = b1.getImage();
kugelImage2 = b2.getImage();
lochImage = b3.getImage();
spielbrettImage = b4.getImage();
backgroundImage = b5.getImage();
MediaTracker mt = new MediaTracker(this);
mt.addImage(kugelImage, 0);
mt.addImage(kugelImage2, 1);
mt.addImage(lochImage, 2);
mt.addImage(spielbrettImage, 3);
mt.addImage(backgroundImage, 4);
try {
mt.waitForAll();
} catch (Exception e) { }
moeglicheZuegeAnz = checkZugAnz();
verbleibendeKugelAnz = checkKugelAnz();
timer = new Timer(1000,this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == timer) {
sekunden = sekunden + 1;
if (sekunden > 59) {
minuten = minuten + 1;
sekunden = 0;
}
if (minuten > 59) {
stunden = stunden + 1;
minuten = 0;
sekunden = 0;
}
if ((stunden < 10) && (minuten < 10) && (sekunden < 10)) {
zeit = "0"+stunden+":0"+minuten+":0"+sekunden;
}
if ((stunden > 9) && (minuten < 10) && (sekunden < 10)) {
zeit = stunden+":0"+minuten+":0"+sekunden;
}
if ((stunden < 10) && (minuten > 9) && (sekunden < 10)) {
zeit = "0"+stunden+":"+minuten+":0"+sekunden;
}
if ((stunden < 10) && (minuten < 10) && (sekunden > 9)) {
zeit = "0"+stunden+":0"+minuten+":"+sekunden;
}
if ((stunden < 10) && (minuten > 9) && (sekunden > 9)) {
zeit = "0"+stunden+":"+minuten+":"+sekunden;
}
if ((stunden > 9) && (minuten < 10) && (sekunden > 9)) {
zeit = stunden+":0"+minuten+":"+sekunden;
}
if ((stunden > 9) && (minuten > 9) && (sekunden < 10)) {
zeit = stunden+":"+minuten+":0"+sekunden;
}
if ((stunden > 9) && (minuten > 9) && (sekunden > 9)) {
zeit = stunden+":"+minuten+":"+sekunden;
}
repaint();
}
}
static int getVerbleibendeKugelAnz() {
return verbleibendeKugelAnz;
}
static String getZeit() {
return zeit;
}
public void mouseMoved(MouseEvent e) {
mX = (int) e.getPoint().getX();
mY = (int) e.getPoint().getY();
repaint();
}
public void mouseDragged(MouseEvent e) {
mX = (int) e.getPoint().getX();
mY = (int) e.getPoint().getY();
repaint();
}
public void mousePressed(MouseEvent e) {
if (!anMaus) {
mX = (int) e.getPoint().getX();
mY = (int) e.getPoint().getY();
mKlick = true;
repaint();
}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
private boolean anMaus;
public void mouseReleased(MouseEvent e) {
mKlick = false;
if (anMaus){
if (checkZug()) {
Spielfeld[feldX][feldY].frames = 1;
anMaus = false;
} else {
Spielfeld[merkFeldX][merkFeldY].frames = 1;
anMaus = false;
}
tmpmX = 0;
tmpmY = 0;
moeglicheZuegeAnz = checkZugAnz();
verbleibendeKugelAnz = checkKugelAnz();
if (moeglicheZuegeAnz == 0) {
timer.stop();
Input input = new Input();
}
}
repaint();
}
public int checkKugelAnz() {
int z=0;
for (int y=0; y<feldYAnz; y++) {
for (int x=0; x<feldXAnz; x++) {
if (Spielfeld[x][y].aktiv == 1) {
if (Spielfeld[x][y].frames == 1) {
z = z + 1;
}
}
}
}
return z;
}
public int checkZugAnz() {
int z=0;
for (int y=0; y<feldYAnz; y++) {
for (int x=0; x<feldXAnz; x++) {
if (Spielfeld[x][y].aktiv == 1) {
if (Spielfeld[x][y].frames == 1) {
if (x < feldXAnz-2) {
if ((Spielfeld[x+1][y].frames == 1) && (Spielfeld[x+2][y].frames == 2)) {
z = z + 1;
}
}
if (x > 1) {
if ((Spielfeld[x-1][y].frames == 1) && (Spielfeld[x-2][y].frames == 2)) {
z = z + 1;
}
}
if (y < feldYAnz-2) {
if ((Spielfeld[x][y+1].frames == 1) && (Spielfeld[x][y+2].frames == 2)) {
z = z + 1;
}
}
if (y > 1) {
if ((Spielfeld[x][y-1].frames == 1) && (Spielfeld[x][y-2].frames == 2)) {
z = z + 1;
}
}
}
}
}
}
return z;
}
public boolean checkZug() {
if (mouseFeldX == 0) {
if (mouseFeldY == 2) {
if ((Spielfeld[merkFeldX][merkFeldY-1].frames == 1) && (Spielfeld[merkFeldX][merkFeldY-2].frames == 2)) {
Spielfeld[merkFeldX][merkFeldY-1].frames = 2;
return true;
}
}
if (mouseFeldY == -2) {
if ((Spielfeld[merkFeldX][merkFeldY+1].frames == 1) && (Spielfeld[merkFeldX][merkFeldY+2].frames == 2)) {
Spielfeld[merkFeldX][merkFeldY+1].frames = 2;
return true;
}
}
}
if (mouseFeldY == 0) {
if (mouseFeldX == 2) {
if ((Spielfeld[merkFeldX-1][merkFeldY].frames == 1) && (Spielfeld[merkFeldX-2][merkFeldY].frames == 2)) {
Spielfeld[merkFeldX-1][merkFeldY].frames = 2;
return true;
}
}
if (mouseFeldX == -2) {
if ((Spielfeld[merkFeldX+1][merkFeldY].frames == 1) && (Spielfeld[merkFeldX+2][merkFeldY].frames == 2)) {
Spielfeld[merkFeldX+1][merkFeldY].frames = 2;
return true;
}
}
}
return false;
}
public void paint(Graphics g) {
g.drawImage(backgroundImage, 0, 0, null);
int gameWidth1 = ((feldXAnz*33)+((feldXAnz-1)*14));
int gameHeight1 = ((feldYAnz*33)+((feldYAnz-1)*14));
mapX = ((getWidth()/2)-(gameWidth1/2));
mapY = ((getHeight()/2)-(gameHeight1/2));
g.setColor(Color.lightGray);
g.setColor(Color.lightGray);
g.drawImage(spielbrettImage, (getWidth()/2)-(400/2),(getHeight()/2)-(400/2), null);
for (int y=0; y<feldYAnz; y++) {
for (int x=0; x<feldXAnz; x++) {
if (Spielfeld[x][y].aktiv == 1) {
if (Spielfeld[x][y].frames > 0) {
if (Spielfeld[x][y].frames == 1) g.drawImage(kugelImage, mapX+(x*33)+((x/1)*14), mapY+(y*33)+((y/1)*14), null);
if (Spielfeld[x][y].frames == 2) g.drawImage(lochImage, mapX+(x*33)+((x/1)*14)+2, mapY+(y*33)+((y/1)*14)+2, null);
g.setColor(Color.gray);
if ((mX > mapX+(x*33)+((x/1)*14)) && (mX < mapX+(x*33)+((x/1)*14)+33)) {
if ((mY > mapY+(y*33)+((y/1)*14)) && (mY < mapY+(y*33)+((y/1)*14)+33)) {
if (moeglicheZuegeAnz > 0) {
if (!anMaus) if (Spielfeld[x][y].frames == 1) g.drawImage(kugelImage2, mapX+(x*33)+((x/1)*14)-1, mapY+(y*33)+((y/1)*14)-1, null);
g.setColor(Color.red);
feldX = x;
feldY = y;
if (Spielfeld[x][y].frames == 1) {
if (mKlick) {
merkFeldX = x;
merkFeldY = y;
Spielfeld[x][y].frames = 2;
tmpmX = (mapX+(x*33)+((x/1)*14))-(mX);
tmpmY = (mapY+(y*33)+((y/1)*14))-(mY);
anMaus = true;
mKlick = false;
if (!timer.isRunning()) timer.start();
repaint();
}
}
mouseFeldX = (merkFeldX-feldX);
mouseFeldY = (merkFeldY-feldY);
repaint();
}
}
}
}
}
}
}
if (anMaus) {
tmpmX = -16;
tmpmY = -16;
g.drawImage(kugelImage2, mX+tmpmX-1,mY+tmpmY-1, null);
}
g.setColor(Color.black);
Font f = new Font("Comic Sans MS",0,14);
FontMetrics fm = getFontMetrics(f);
g.setFont(f);
g.drawString("Mögliche Züge vorhanden: "+moeglicheZuegeAnz,(getWidth()/2)-(fm.stringWidth("Mögliche Züge vorhanden: "+moeglicheZuegeAnz)/2), 50);
g.drawString("Zeit: "+zeit,(getWidth()/2)-(fm.stringWidth("Zeit: "+zeit)/2), 80);
g.drawString("Verbleibende Kugeln: "+verbleibendeKugelAnz, 20, 540);
}
}