import java.applet.Applet; import java.awt.*; import MuehleState; public class Muehle extends Applet { public void init () { setLayout (new BorderLayout()); OutText textarea = new OutText (); MuehleSpiel spiel = new MuehleSpiel (textarea); spiel.resize (440, 440); add ("Middle", spiel); add ("South", textarea); spiel.start (); } } class MuehleSpiel extends Canvas { OutText outtext; Stein stone; Brett Spielfeld; MuehleState Steinfeld; int marked; boolean win, gameStarted; public MuehleSpiel (OutText text) { outtext = text; Spielfeld = new Brett (); Steinfeld = new MuehleState (); stone = new Stein (); marked = 0; } public void start () { win = false; gameStarted = false; repaint (); outtext.selectLevel (); } public void paint (Graphics g) { Spielfeld.paint (g); stone.paint (Steinfeld, g); if (marked != 0) { g.setColor (Color.red); Rectangle r = stone.getDimension (marked); g.fillOval (r.x, r.y, r.width, r.height); } } void gewonnen (int color) { if (color != MuehleState.EMPTY) { if (color == MuehleState.WHITE) outtext.putText ("Sie haben gewonnen!!! Taste fuer neues Spiel druecken"); else outtext.putText ("Versager, der Computer hat gewonnen!!! Taste fuer neues Spiel druecken"); win = true; outtext.reset (); Steinfeld.reset (MuehleState.Mensch); } } void setzen (int feld) { if (Steinfeld.isValidMove (0, feld)) { Steinfeld.doMove (0, feld); repaint (); System.out.println (Steinfeld.getState()); if (Steinfeld.getState() != MuehleState.DEL) { System.out.println (Steinfeld.getState()); outtext.putText ("Der Computer ist am Zug"); Steinfeld = (MuehleState) Steinfeld.bestMove (outtext.getLevel ()); repaint (); if (Steinfeld.getState() == MuehleState.SET) outtext.putText ("Setzen Sie einen neuen Stein"); else outtext.putText ("Waehlen Sie den Stein, der verschoben werden soll"); } else outtext.putText ("MUEHLE!!! Waehlen Sie einen Stein zum Wegnehmen"); } else outtext.putText ("Waehlen Sie ein anderes Feld aus"); } void verschieben (int feld) { if (marked > 0) { if (Steinfeld.isValidMove (marked, feld)) { Steinfeld.doMove (marked, feld); marked = 0; repaint (); if (Steinfeld.getState() != MuehleState.DEL) { outtext.putText ("Der Computer ist am Zug"); Steinfeld = (MuehleState) Steinfeld.bestMove (outtext.getLevel()); repaint (); gewonnen (Steinfeld.won ()); outtext.putText ("Waehlen Sie den Stein, der verschoben werden soll"); } else outtext.putText ("MUEHLE!!! Waehlen Sie einen Stein zum Wegnehmen"); } else { marked = 0; outtext.putText ("Dieser Zug ist nicht moeglich"); repaint (); } } else if (Steinfeld.positionColor (feld) == MuehleState.WHITE) { marked = feld; outtext.putText ("Waehlen Sie die neue Position des Steins"); repaint (); } } void loeschen (int feld) { if (Steinfeld.doRemove (feld)) { repaint (); gewonnen (Steinfeld.won ()); outtext.putText ("Der Computer ist am Zug"); Steinfeld = (MuehleState) Steinfeld.bestMove (outtext.getLevel ()); repaint (); gewonnen (Steinfeld.won ()); if (Steinfeld.getState() == MuehleState.SET) outtext.putText ("Setzen Sie einen Stein"); else outtext.putText ("Waehlen Sie den Stein, der verschoben werden soll l"); } else outtext.putText ("Waehlen Sie einen anderen Stein zum Wegnehmen aus"); } public boolean mouseMove (Event evt, int x, int y) { if (!gameStarted && outtext.madeInputs()) { gameStarted = true; Steinfeld.reset (outtext.getStarter ()); if (outtext.getStarter() == MuehleState.Computer) { outtext.putText ("Der Computer ist am Zug"); Steinfeld = (MuehleState) Steinfeld.bestMove (outtext.getLevel()); repaint (); } outtext.putText ("Setzen Sie Ihren ersten Stein"); } return false; } public boolean mouseUp (Event evt, int x, int y) { int feld; feld = stone.isInside (x, y); if (feld > 0 && gameStarted) { switch (Steinfeld.getState()) { case MuehleState.SET : setzen (feld); break; case MuehleState.MOVE: verschieben (feld); break; case MuehleState.DEL : loeschen (feld); } } if (win) { start (); } return true; } } class Stein { Rectangle stone[] = new Rectangle[24]; int rectWidth=40; public Stein () { int i, j, k=0; for (i=0 ; i<3 ; ++i) stone [i] = new Rectangle (20+i*180, 20, rectWidth, rectWidth); for (i=0 ; i<3 ; ++i) stone [i+ 3] = new Rectangle (80+i*120, 80, rectWidth, rectWidth); for (i=0 ; i<3 ; ++i) stone [i+ 6] = new Rectangle (140+i*60, 140, rectWidth, rectWidth); for (i=0 ; i<3 ; ++i) stone [i+ 9] = new Rectangle (20+i*60, 200, rectWidth, rectWidth); for (i=0 ; i<3 ; ++i) stone [i+12] = new Rectangle (260+i*60, 200, rectWidth, rectWidth); for (i=0 ; i<3 ; ++i) stone [i+15] = new Rectangle (140+i*60, 260, rectWidth, rectWidth); for (i=0 ; i<3 ; ++i) stone [i+18] = new Rectangle (80+i*120, 320, rectWidth, rectWidth); for (i=0 ; i<3 ; ++i) stone [i+21] = new Rectangle (20+i*180, 380, rectWidth, rectWidth); } public int isInside (int x, int y) { int i=0; while (!stone[i].inside (x, y) && i<23) ++i; if (stone[i].inside (x, y)) return (i+1); return 0; } public Rectangle getDimension (int Stein) { return stone[Stein-1]; } public void paint (MuehleState Steinfeld, Graphics g) { for (int i=0 ; i<24 ; ++i) { switch (Steinfeld.positionColor (i+1)) { case MuehleState.WHITE : { g.setColor (Color.white); g.fillOval (stone[i].x, stone[i].y, stone[i].width, stone[i].height); } break; case MuehleState.BLACK : { g.setColor (Color.black); g.fillOval (stone[i].x, stone[i].y, stone[i].width, stone[i].height); } } } } } class Brett { int startx, starty, width, height; public Brett () { startx = 40; starty = 40; width = 360; height = 360; } public void paint (Graphics g) { g.setColor (Color.black); g.drawRect (startx, starty, width, height); g.drawRect (startx+60, starty+60, width-120, height-120); g.drawRect (startx+120, starty+120, width-240, height-240); g.drawLine ( 40, 220, 160, 220); g.drawLine (280, 220, 400, 220); g.drawLine (220, 40, 220, 160); g.drawLine (220, 280, 220, 400); } } class OutText extends Panel { String text; Choice c; Label l1, l2, l; Button Mensch, Computer; int level, Starter; boolean gotInputs; public OutText () { l = null; level = 1; gotInputs = false; } public void putText (String text) { if (l != null) remove (l); l = new Label (text); add (l); layout (); } public void selectLevel () { if (l != null) { remove (l); l=null; } l1 = new Label ("Waehlen Sie den Schwierigkeitsgrad: "); add (l1); c = new Choice (); c.addItem ("Level 1"); c.addItem ("Level 2"); c.addItem ("Level 3"); c.addItem ("Level 4"); c.addItem ("Level 5"); add (c); l2 = new Label ("Wer soll das Spiel beginnen ? "); Mensch = new Button ("Mensch"); Computer = new Button ("Computer"); } public int getLevel () { return level; } public int getStarter () { return Starter; } public boolean madeInputs () { return gotInputs; } public void reset () { level = 1; gotInputs = false; } public boolean action (Event evt, Object obj) { if (evt.target instanceof Choice) { level = c.getSelectedIndex() + 1; remove (l1); remove (c); add (l2); add (Mensch); add (Computer); layout (); return true; } if (evt.target instanceof Button) { String label = (String)obj; if (label == "Mensch") Starter = MuehleState.Mensch; else Starter = MuehleState.Computer; remove (l2); remove (Mensch); remove (Computer); gotInputs = true; return true; } return false; } } /* class MuehleState { final static int SET=0, DEL=1, MOVE=2, EMPTY=0, WHITE=1, BLACK=2; final static int Mensch=1, Computer=-1; public boolean doRemove (int i) {return true;} public int won () {return 0;} public void doMove (int i, int j) {} public boolean isValidMove (int i, int j) {return true;} public int positionColor (int i) {return 1;} public void bestMove (int Level) {} public int getState () {return 0;} public void reset (int a) {} } */