/* Beispielloesung zu Blatt 11 - AI 1 - WS 2006/07 nh - 01/2007 */ import IOulm.*; public class Tennis { /* Die Verwendung von sprechenden Variablen / Konstanten hilft, sich im Programmcode besser zurechtzufinden. Daher definieren wir fuer alle moeglichen Zustaende eine entsprechende Konstante vom Typ integer */ public final static int STATE_0to0 = 0; public final static int STATE_15to0 = 1; public final static int STATE_30to0 = 2; public final static int STATE_40to0 = 3; public final static int STATE_0to15 = 4; public final static int STATE_15to15 = 5; public final static int STATE_30to15 = 6; public final static int STATE_40to15 = 7; public final static int STATE_0to30 = 8; public final static int STATE_15to30 = 9; public final static int STATE_30to30 = 10; public final static int STATE_40to30 = 11; public final static int STATE_0to40 = 12; public final static int STATE_15to40 = 13; public final static int STATE_30to40 = 14; public final static int STATE_deuce = 15; public final static int STATE_advA = 16; public final static int STATE_advB = 17; public final static int STATE_gameA = 18; public final static int STATE_gameB = 19; // ab jetzt: Variablen-Deklaration (NICHT mehr Konstanten!) public static boolean gameOver = false; // Spiel zu Ende (gewonnen)? public static boolean readInput; // hat's Einlesen geklappt? public static char ch; // das eingelesene Zeichen public static int state = STATE_0to0; // Start-Zustand: 0 zu 0 // Und los geht's public static void main (String args[]) { System.out.println("Willkommen beim Tennisautomaten!"); // Solange das Spiel nicht gewonnen wurde... while (!gameOver) { // ... erstmal den aktuellen Spielstand ausgeben switch (state) { case STATE_0to0: System.out.println("Es steht 0 zu 0."); break; case STATE_15to0: System.out.println("Es steht 15 zu 0."); break; case STATE_30to0: System.out.println("Es steht 30 zu 0."); break; case STATE_40to0: System.out.println("Es steht 40 zu 0."); break; case STATE_0to15: System.out.println("Es steht 0 zu 15."); break; case STATE_15to15: System.out.println("Es steht 15 zu 15."); break; case STATE_30to15: System.out.println("Es steht 30 zu 15."); break; case STATE_40to15: System.out.println("Es steht 40 zu 15."); break; case STATE_0to30: System.out.println("Es steht 0 zu 30."); break; case STATE_15to30: System.out.println("Es steht 15 zu 30."); break; case STATE_30to30: System.out.println("Es steht 30 zu 30."); break; case STATE_40to30: System.out.println("Es steht 40 zu 30."); break; case STATE_0to40: System.out.println("Es steht 0 zu 40."); break; case STATE_15to40: System.out.println("Es steht 15 zu 40."); break; case STATE_30to40: System.out.println("Es steht 30 zu 40."); break; case STATE_deuce: System.out.println("Einstand."); break; case STATE_advA: System.out.println("Vorteil fuer Spieler A!"); break; case STATE_advB: System.out.println("Vorteil fuer Spieler B!"); break; case STATE_gameA: System.out.println("Spieler A hat gewonnen!"); gameOver = true; break; case STATE_gameB: System.out.println("Spieler B hat gewonnen!"); gameOver = true; break; default: System.out.println("ERROR!"); } // wenn das Spiel gewonnen ist, verlassen wir an der Stelle die // aktuelle Ausfuehrung der While-Schleife. Das geht mit "continue". if (gameOver) continue; // Einlesen des Spielers, der den Ballwechsel gewonnen hat // inklusive Fehlerbehandlung readInput = false; while (!readInput) { System.out.println("Welcher Spieler hat den Ballwechsel " + "gewonnen (A oder B)?"); if (Urc.readChar()) { ch = Urc.getChar(); if (ch == 'a' || ch == 'A' || ch == 'b' || ch == 'B') { readInput = true; } else { System.out.println("Dies war eine ungueltige Eingabe!"); } Urc.readChar(); } } // Zustandsuebergang: in Abhaengigkeit des momentanen Zustandes // sowie der Ballwechsel-Siegers (A oder B) gelangen wir in // einen neuen Zustand switch (ch) { case 'a': case 'A': switch (state) { case STATE_0to0: state = STATE_15to0; break; case STATE_15to0: state = STATE_30to0; break; case STATE_30to0: state = STATE_40to0; break; case STATE_40to0: state = STATE_gameA; break; case STATE_0to15: state = STATE_15to15; break; case STATE_15to15: state = STATE_30to15; break; case STATE_30to15: state = STATE_40to15; break; case STATE_40to15: state = STATE_gameA; break; case STATE_0to30: state = STATE_15to30; break; case STATE_15to30: state = STATE_30to30; break; case STATE_30to30: state = STATE_40to30; break; case STATE_40to30: state = STATE_gameA; break; case STATE_0to40: state = STATE_15to40; break; case STATE_15to40: state = STATE_30to40; break; case STATE_30to40: state = STATE_deuce; break; case STATE_deuce: state = STATE_advA; break; case STATE_advA: state = STATE_gameA; break; case STATE_advB: state = STATE_deuce; break; // der Default-Fall ist hier nur der Vollstaendigkeit // halber aufgefuehrt. default: System.err.println("Ungueltiger Zustand! " + "Programmabbruch!"); System.exit(1); // Programm verlassen } break; case 'b': case 'B': switch(state) { case STATE_0to0: state = STATE_0to15; break; case STATE_15to0: state = STATE_15to15; break; case STATE_30to0: state = STATE_30to15; break; case STATE_40to0: state = STATE_40to15; break; case STATE_0to15: state = STATE_0to30; break; case STATE_15to15: state = STATE_15to30; break; case STATE_30to15: state = STATE_30to30; break; case STATE_40to15: state = STATE_40to30; break; case STATE_0to30: state = STATE_0to40; break; case STATE_15to30: state = STATE_15to40; break; case STATE_30to30: state = STATE_30to40; break; case STATE_40to30: state = STATE_deuce; break; case STATE_0to40: state = STATE_gameB; break; case STATE_15to40: state = STATE_gameB; break; case STATE_30to40: state = STATE_gameB; break; case STATE_deuce: state = STATE_advB; break; case STATE_advA: state = STATE_deuce; break; case STATE_advB: state = STATE_gameB; break; default: System.err.println("Ungueltiger Zustand! " + "Programmabbruch!"); System.exit(1); } } } } }