import Prog1Tools.*;

public class SpringendeBaelle
{
// Wieviel Zeilen hat der Screen
public static final int SCREEN_ZEILEN = 25;

// Wieviel Spalten hat der Screen
public static final int SCREEN_SPALTEN = 80;

// Schrittanzahl
private static final int SCHRITTE = 100;

// Ballsymbol
private static final char BALL_SYMBOL = 'o';

// Verzögere jeden Schritt um das Zeichnen besser verfolgen zu können
private static final int VERZOEGERUNG = 100;

// Main Methode
public static void main (String[] args)
{
// EJE-Screen
TextScreen screen = TextScreen.getInstance();

// Zeichne Title
screen.setTitle("Schritt (0 / " + SCHRITTE + ")");

// Erzeuge Bälle
Ball ball1 = new Ball();
Ball ball2 = new Ball();
Ball ball3 = new Ball();
Ball ball4 = new Ball();

// Setze Anfangsposition
ball1.setZeile(0);
ball1.setSpalte(0);
ball2.setZeile(0);
ball2.setSpalte(SCREEN_SPALTEN-1);
ball3.setZeile(SCREEN_ZEILEN-1);
ball3.setSpalte(SCREEN_SPALTEN-1);
ball4.setZeile(SCREEN_ZEILEN-1);
ball4.setSpalte(0);

// Zeichne Anfangsposition
screen.write(ball1.getZeile(), ball1.getSpalte(), BALL_SYMBOL);
screen.write(ball2.getZeile(), ball2.getSpalte(), BALL_SYMBOL);
screen.write(ball3.getZeile(), ball3.getSpalte(), BALL_SYMBOL);
screen.write(ball4.getZeile(), ball4.getSpalte(), BALL_SYMBOL);

// Führe Ballbewegung x mal aus
for(int i=0; i < SCHRITTE; i++)
{
// Zeige aktuellen Schritt an
screen.setTitle("Schritt (" + (i + 1) +" / " + SCHRITTE + ")");

// Pause um Programmverlauf besser verfolgen zu können
screen.pause(VERZOEGERUNG);

// Berechne neue Position
ball1.neuePositionBerechnen();
ball2.neuePositionBerechnen();
ball3.neuePositionBerechnen();
ball4.neuePositionBerechnen();

// Zeichne Ball
screen.write(ball1.getZeile(), ball1.getSpalte(), BALL_SYMBOL);
screen.write(ball2.getZeile(), ball2.getSpalte(), BALL_SYMBOL);
screen.write(ball3.getZeile(), ball3.getSpalte(), BALL_SYMBOL);
screen.write(ball4.getZeile(), ball4.getSpalte(), BALL_SYMBOL);
}
}
}




class Ball implements BallSpec
{
// Variablen deklarieren
private int zeile;

private int spalte;

private boolean zeileSteigend;

private boolean spalteSteigend;

// Setter und Getter definieren
public void setZeile(int zeile)
{
this.zeile = zeile;
}

public void setSpalte(int spalte)
{
this.spalte = spalte;
}

public int getZeile()
{
return zeile;
}

public int getSpalte()
{
return spalte;
}

// Ball-Logik
public void neuePositionBerechnen()
{
//
// Teste auf Kollision und ändere Richtung entsprechend
//

// y-Achsen Kollision ?
if ( zeile <= 0 ) // Oben angestoßen
{
zeileSteigend = true;
}
else if (zeile >= SpringendeBaelle.SCREEN_ZEILEN-1) // Unten angestoßen
{
zeileSteigend = false;
}

// x-Achsen Kollision ?
if (spalte <= 0) // Links angestoßen
{
spalteSteigend = true;
}
else if (spalte >= SpringendeBaelle.SCREEN_SPALTEN-1) // Rechts angestoßen
{
spalteSteigend = false;
}

//
// Bewege Ball wie eingestellt
//

// y-Achse bewegen
if (zeileSteigend)
{
zeile++;
}
else
{
zeile--;
}
// x-Achse bewegen
if (spalteSteigend)
{
spalte++;
}
else
{
spalte--;
}
}
}

// Ball Interface
interface BallSpec
{
public final String BALL = null;

public void setZeile (int zeile);

public void setSpalte (int spalte);

public int getZeile ();

public int getSpalte ();

public void neuePositionBerechnen ();
}

Read more: http://feeds.dzone.com/~r/dzone/snippets/~3/dgM-f7TIio8/12689