erstellt: 12.08.99; überarbeitet 21.05.03, 15.01.06, 03.07.11, 26.07.17; übersetzt 06.02.25; deutsche Übersetzung Heinrich Gailer


Wir füllen die Lücken aus

Hinweise: Das ist eine unbewertete Lückenübung. Jede Frage besteht aus einem Satz, bei dem ein oder zwei Wörter fehlen. Ein Button repräsentiert das fehlende Wort bzw. die fehlenden Wörter. Überlegt Euch welches Wort bzw. welche Wörter fehlen. Klickt dann auf die Schaltfläche, um zu sehen ob Ihr richtig lagt. Es wird keine Note für diese Übung ermittelt.


Bei dieser Übung geht es um ein Computerspiel:

Der erste Spieler startet das Programm und gibt ein Wort mit drei Buchstaben ein. Der zweite Spieler sieht nicht, welches Wort eingegeben wird. Nun übergibt der erste Spieler den Computer an den zweiten Spieler. Der zweite Spieler hat fünf Versuche, das Wort zu erraten. Wenn der zweite Spieler das Wort nicht errät, hat der erste Spieler gewonnen.

(Das ist kein allzu gutes Spiel; vielleicht möchtet Ihr es nach dieser Übung verbessern.)


1.   Wenn wir ein Programm beginnen, ist es manchmal sinnvoll, Kommentare zu schreiben, die klarmachen, was zu tun ist. Wir überlegen uns aus welchen zwei Hauptbereichen das Programm besteht. Dann klicken wir auf die Schaltflächen um zu sehen, ob wir übereinstimmen:

public class MatchingGame
{
  public static void main(String[] args)
  {

    

    Code für den ersten Programmabschnitt kommt hier.

    

    Code für den zweiten Programmabschnitt kommt hier.

  }
}

Ihr könntet einwenden, dass das Programm viel komplizierter ist als das. Und das ist es natürlich auch. Aber auf der äußersten Ebene besteht das Programm aus Code, der nur diese beiden Aufgaben erfüllt.


2.   Wir denken an die erste Aufgabe. Der erste Spieler gibt ein Wort mit drei Buchstaben ein. Die Länge eines String-Objekts (die Anzahl der Zeichen, die es enthält) wird durch seine Methode length() bestimmt. Hier ist mehr von dem Programm:

public class MatchingGame
{
  public static void main(String[] args)
  {
    Scanner scan = new Scanner(System.in);

     dasWort;

    // Das Wort vom 1. Spieler holen
    System.out.print("Geben Sie das zu ratende Wort ein ");
    dasWort = scan.

    while ( dasWort.length()  )
    {
        System.out.print(
          "Das Wort muss 3 Zeichen lang sein. Erneut versuchen: ");
        
    }

    // Das Spiel mit dem 2. Spieler spielen.

    . . . .

  }
}


3.   Wir sind mit dem ersten Teil fast fertig, aber es gibt ein Problem: Wenn der erste Spieler die Tastatur an den zweiten Spieler übergibt, sieht er das zu erratende Wort! Was können wir tun, um dieses Problem zu lösen?

(Es gibt elegantere Lösungen als diese, aber das funktioniert gut genug.)



4.   Hier ist das Programm, das diese Idee teilweise umsetzt. Wir gehen davon aus, dass 50 Leerzeilen den Bildschirm löscht.

public class MatchingGame
{
  public static void main(String[] args)
  {
    Scanner scan = new Scanner(System.in);
    String  dasWort;

    // Das Wort vom 1. Spieler holen
    System.out.print("Geben Sie das zu ratende Wort ein: ");
    dasWort = scan.next() ;

    while (dasWort.length() != 3)
    {
       System.out.print(
         "Das Wort muss 3 Zeichen lang sein. Erneut versuchen: ");
       dasWort = scan.next() ;
    }

    // Bildschirm löschen
    int anzahlZeilen = 
     (anzahlZeilen < 50)
    {
        
        anzahlZeilen = anzahlZeilen + 1;
    }

    // Das Spiel mit dem 2. Spieler spielen.

    . . . .

  }
}


5.   Nun zur zweiten Hälfte des Programms. In diesem Teil des Programms versucht der zweite Spieler wiederholt, das Wort zu erraten. Wie wird dieses wiederholte Raten (im Allgemeinen) in dem Programm durchgeführt?

Mit einer



6.   Hier ist das Programm mit etwas getaner Arbeit für die zweite Hälfte. Wir überlegen zunächst welche Variablen benötigt werden und initialisieren sie dann:

public class MatchingGame
{
  public static void main(String[] args)
  {
    Scanner scan = new Scanner(System.in);
    String  dasWort;

    // Das Wort vom 1. Spieler holen
    System.out.print("Geben Sie das zu ratende Wort ein: ");
    dasWort = scan.next() ;

    while (dasWort.length() != 3)
    {
      System.out.print(
        "Das Wort muss 3 Zeichen lang sein. Erneut versuchen: ");
      dasWort = scan.next() ;
    }

    // Bildschirm löschen
    int anzahlZeilen = 0 ;
    while (anzahlZeilen < 50)
    {
      System.out.println();
      anzahlZeilen = anzahlZeilen + 1;
    }

    // Das Spiel mit dem 2. Spieler spielen.
    int zaehler = 1;
     rateversuch;

    System.out.print("Raten Sie: ");
    

    // solange der 2. Spieler das Wort noch nicht erraten hat
    // und er noch einige Versuche übrig hat
    while (anzahlZeilen < 50)
    {

    }

    // überprüfen ob der 2. Spieler gewonnen hat
    if ()
    {

    }

    else
    {

    }

  }
}


7.   Das while in der zweiten Hälfte ist etwas kompliziert. Die Schleife muss weiterlaufen, solange zwei Dinge wahr sind:

  1. Der Spieler hat noch Versuche übrig.
  2. Der Spieler hat das Wort noch nicht erraten.

Um den ersten Teil zu testen, verwenden wir einen relationalen Operator. Um den zweiten Teil zu testen, verwenden wir die Methode equals() von rateversuch. Jeder dieser Werte ist ein true/false-Wert, der mit einem logischen Operator kombiniert werden muss.

public class MatchingGame
{
  public static void main(String[] args)
  {
    Scanner scan = new Scanner(System.in);
    String  dasWort;

    // Das Wort vom 1. Spieler holen

    . . . . .

    // Das Spiel mit dem 2. Spieler spielen.
    int zaehler = 1;
    String rateversuch;

    System.out.print("Raten Sie: ");
    rateversuch = scan.next() ;

    // solange der 2. Spieler das Wort noch nicht erraten hat
    // und er noch einige Versuche übrig hat
    while (zaehler < 5 !rateversuch.)
    {
      System.out.println("Naechster Versuch:");
      rateversuch = scan.next() ;
      zaehler   = 
    }

    // überprüfen ob der 2. Spieler gewonnen hat
    if ()
    {

    }

    else
    {

    }

  }
}

Die Schleifenbedingung kombiniert eine Zählschleife mit einer überwachungsgesteuerten Schleife.



8.   Wenn die Schleife endet, ist eines von zwei Dingen wahr: Der zweite Spieler hat die Zahl erraten und gewonnen, oder der zweite Spieler hat alle Versuche verbraucht und verloren. Die abschließende if-Anweisung muss herausfinden was der Fall ist, um die richtige Schlussmeldung zu schreiben.

Wir überlegen was die if-Anweisung testen soll:

public class MatchingGame
{
  public static void main(String[] args)
  {
    Scanner scan = new Scanner(System.in);
    String  dasWort;

    // Das Wort vom 1. Spieler holen
    . . . . .

    // Das Spiel mit dem 2. Spieler spielen.
    int zaehler = 1;
    String rateversuch;

    System.out.print("Raten Sie: ");
    rateversuch = scan.next() ;

    // solange der 2. Spieler das Wort noch nicht erraten hat
    // und er noch einige Versuche übrig hat
    while ( zaehler < 5  &&  !rateversuch.equals( dasWort ) )
    {
      System.out.print("Naechster Versuch: ");
      rateversuch = scan.next() ;
      zaehler = zaehler + 1;
    }

    // überprüfen ob der 2. Spieler gewonnen hat
    if ()
      System.out.println("Sie haben gewonnen!");
    else
      System.out.println("Sie haben verloren!");

  }
}


9.   Hier ist das vollständige Programm. Wir können es in einen Editor kopieren, in eine Datei einfügen, kompilieren und ausführen.

import java.util.Scanner;
public class MatchingGame
{
  public static void main(String[] args)
  {
    Scanner scan = new Scanner(System.in);
    String  dasWort;

    // Das Wort vom 1. Spieler holen
    System.out.print("Geben Sie das zu ratende Wort ein: ");
    dasWort = scan.next() ;

    while (dasWort.length() != 3)
    {
      System.out.print(
        "Das Wort muss 3 Zeichen lang sein. Erneut versuchen: ");
      dasWort = scan.next() ;
    }

    // Bildschirm löschen
    int anzahlZeilen = 0 ;
    while (anzahlZeilen < 50)
    {
      System.out.println();
      anzahlZeilen = anzahlZeilen + 1;
    }

    // Das Spiel mit dem 2. Spieler spielen.
    int zaehler = 1;
    String rateversuch;
    System.out.print("Raten Sie: ");
    rateversuch = scan.next() ;

    // solange der 2. Spieler das Wort noch nicht erraten hat
    // und er noch einige Versuche übrig hat
    while ( zaehler < 5  &&  !rateversuch.equals( dasWort ) )
    {
      System.out.print("Naechster Versuch: ");
      rateversuch = scan.next() ;
      zaehler = zaehler + 1;
    }

    // überprüfen ob der 2. Spieler gewonnen hat
    if ( rateversuch.equals( dasWort ) )
      System.out.println("Sie haben gewonnen!");
    else
      System.out.println("Sie haben verloren!");

  }
}

Sind irgendwelche der if oder while Anweisungen geschachtelt?

Es wäre für Euch von Vorteil, wenn Ihr den Aufbau dieses Programms studieren. Beobachtet, wie es mit einer Folge von while- und if-Anweisungen aufgebaut ist.



10.   Nehmen wir an, wir möchten das Spiel mit DREI versteckten Wörtern statt mit einem spielen. Der erste Spieler gibt ein Wort ein und der zweite Spieler hat fünf Chancen, um es zu erraten. Dann gibt der erste Spieler ein zweites Wort ein, der zweite Spieler hat fünf Chancen, um es zu erraten und so weiter. (Das ist immer noch ein dummes Spiel.)

Wie könnten wir dieses neue Spiel implementieren?    

Ein noch besseres Spiel würde aus drei "Runden" bestehen. Jede Runde würde darin bestehen, dass der erste Spieler ein Wort eingibt und der zweite Spieler rät, gefolgt von dem zweiten Spieler, der ein Wort eingibt und der erste Spieler rät.


Ende des Tests. Wer ihn wiederholen möchte, lädt die Seite im Browser neu.

Zurück zum Inhaltsverzeichnis.