//////////////////////////////////////////////////////////////////////// // // Description: // // Internet: http://bioinformatik.gloomit.de // // Copyright (C) 2006 Phillip Kroll // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// // // Modul: Main // //////////////////////////////////////////////////////////////////////// public class MainClass { public static void main(String[] args) { // Hier Entweder Aufgabe1(); oder Aufgabe2(); // aufrufen Aufgabe1(); } private static void Aufgabe1(){ // Dem Konstruktor von Ball wird eine 1 übergeben // und erzeug so die Ausgabe für Aufgabe 1 Ball ball = new Ball( 1 ); Spieler Hans = new Spieler( ball, "Hans" ); Spieler Vera = new Spieler( ball, "Vera" ); // previousPlayer setzt jeweils fest, // wer von wem den ball bekommt. hier bekommt beispielsweise // Vera den Ball von Hans Vera.previousPlayer = Hans; Hans.previousPlayer = Vera; // Spiel initialisieren, Vera fängt an ball.init( Vera ); Vera.start(); Hans.start(); } private static void Aufgabe2(){ // Dem Konstruktor von Ball wird eine 2 übergeben // und erzeug so die Ausgabe für Aufgabe 2 Ball ball = new Ball( 2 ); Spieler Hans = new Spieler( ball, "Hans" ); Spieler Vera = new Spieler( ball, "Vera" ); Spieler Peter = new Spieler( ball, "Peter" ); // previousPlayer setzt jeweils fest, // wer von wem den ball bekommt. hier bekommt beispielsweise // Vera den Ball von Hans Vera.previousPlayer = Hans; Peter.previousPlayer = Vera; Hans.previousPlayer = Peter; // Spiel initialisieren, Hans fängt an ball.init( Hans ); Vera.start(); Peter.start(); Hans.start(); } } //////////////////////////////////////////////////////////////////////// // // Modul: Spieler // //////////////////////////////////////////////////////////////////////// public class Spieler extends Thread{ private Ball ball; public Spieler previousPlayer; // Konstruktor, Der zu spielende Ball und // ein Name für den Spieler werden hier übergeben Spieler( Ball ball, String name ){ super( name ); this.ball = ball; } public void run(){ while (true){ ball.playMe( this ); // Hier wird eine zufällig Zeit gewartet um zu zeigen // dass unter allen bedigungen die Reihenfloge eingehalten wird. // Die Zeile kann auskommentiert werden try { sleep( Math.round( 1000 * Math.random() ) ); } catch ( InterruptedException E ) {} } } } //////////////////////////////////////////////////////////////////////// // // Modul: Ball // //////////////////////////////////////////////////////////////////////// public class Ball{ public Spieler previousPlayer; public int plays; public int mode; // Konstruktor, mode = 1 löst aufgabe 1, mode = 2 // lößt aufgabe 2 Ball( int mode ){ plays = 0; this.mode = mode; } // initialisieren vor dem Spiel, der übergebene Player // ist der Speiler der anfängt public void init( Spieler player ){ previousPlayer = player; plays = 0; } // ja nachdem welchen wert mode hat wird hier // die ausgabe für aufgabe 1 oder für aufgabe 2 erzeugt public synchronized void playMe( Spieler Spieler ){ if ( mode == 1 ){ playMe1( Spieler ); } else { playMe2( Spieler ); } } // Diese prozedur ergibt eine ausgabe wie in aufgabe 2 // gefordert public synchronized void playMe2( Spieler Spieler ){ while ( ( Spieler.previousPlayer != previousPlayer ) ){ try{ wait(); } catch( InterruptedException e){ } } // Ausgabe erzeugen System.out.println( previousPlayer.getName() + " -> " + Spieler.getName() ); previousPlayer = Spieler; plays++; notifyAll(); } // Diese prozedur ergibt eine ausgabe wie in aufgabe 1 // gefordert public synchronized void playMe1( Spieler Spieler ){ while ( ( Spieler.previousPlayer != previousPlayer ) ){ try{ wait(); } catch( InterruptedException e){ } } // Ausgabe erzeugen String outputString; if ( plays % 2 == 0 ){ outputString = "Ping! "; } else { outputString = "Pong! "; } System.out.println( outputString + Spieler.getName() ); previousPlayer = Spieler; plays++; notifyAll(); } }