import java.awt.*;
import javax.swing.*;
import java.awt.Toolkit;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JWindow;
import java.awt.Label;
public class PingPong extends JFrame
{
private final Dimension dim = new Dimension(600,300);
private final Dimension pos = Toolkit.getDefaultToolkit().getScreenSize();
private Graphics2D bilder;
private boolean[] druektasten = new boolean[7];
private boolean xrechts=true,xlinks=false,xrechts2=false,xlinks2=true,xrechts3=true,xlinks3=false,xrechts4=false,xlinks4=true,da1=true,da2=false,da3=false,da4=false,sicher=true;
private int groesseschl1=50,groesseschl2=50,kollisionoben=40,x3=dim.width/2,y3=dim.height/2,ballx=10,bally=10,punktr=0,punktl=0,x4=dim.width/2,y4=dim.height/2,x5=dim.width/2,y5=dim.height/2,x6=dim.width/2,y6=dim.height/2;
private int y1=dim.height/2-groesseschl1/2,y2=dim.height/2-groesseschl2/2,test=1,einmalL,einmalR,test2=1,pf=0,pf2=0,test3=2,test4=2,neu=3,geschw1=150,geschw2=180,geschw3=210,geschw4=120,kolschl1=20,kolschl2=20,tasth=1,tastg=1;
final static int hoch=0,runter=1,w=2,s=3,b=4,h=5,g=6;
private Thread bewegung = new Thread() //Thread für die Bewegung der Schläger
{
public void run() //Beginn des runns des Threads
{
while(true) //Endlosschleife für die Schläger
{
bilder.clearRect(585,y1,5,groesseschl1); //Schläger rechts wird "entfernt"
bilder.clearRect(10,y2,5,groesseschl2); //Schläger links wird "entfernt"
if(druektasten[hoch]) //überprüft ob die Variable druektasten[hoch] wahr ist
{
if(y1>kollisionoben) //überprüft ob y1 des rechten Schlägers größer als die Variable kollisionoben ist
{
y1 -=20; //wenn dies zutrifft, dann wird die Variable y1 um 20 verringert (der Schläger1 geht nach oben)
}
}
if(druektasten[runter]) //überprüft ob die Variable druektasten[runter] wahr ist
{
if(y1<dim.height-groesseschl1-20) //überprüft ob y1 des rechten Schlägers kleiner als die Höhe des Frames minus die größe des Schlägers minus 20 ist
{
y1 +=20; //wenn dies zutrifft, dann wird die Variable y1 um 20 erhöht (der Schläger1 geht nach unten)
}
}
if(druektasten[w]) //überprüft ob die Variable druektasten[w] wahr ist
{
if(y2>kollisionoben) //überprüft ob y2 des rechten Schlägers größer als die Variable kollisionoben ist
{
y2 -=20; //wenn dies zutrifft, dann wird die Variable y2 um 20 verringert (der Schläger2 geht nach oben)
}
}
if(druektasten[s]) //überprüft ob die Variable druektasten[w] wahr ist
{
if(y2<dim.height-groesseschl2-20) //überprüft ob y2 des linken Schlägers kleiner als die Höhe des Frames minus die größe des Schlägers minus 20 ist
{
y2 +=20; //wenn dies zutrifft, dann wird die Variable y2 um 20 erhöht (der Schläger2 geht nach unten)
}
}
bilder.fillRect(585,y1,5,groesseschl1); //zeichnet den rechten Schläger neu
bilder.fillRect(10,y2,5,groesseschl2); //zeichnet den linken Schläger neu
try
{
sleep(50); //Pause für 50 Millisekunden (damit die Schläger nicht zu schnell sind)
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
};
private Thread ball = new Thread() //Thread für den ersten Ball
{
public void run() //Beginn des runns des Threads
{
while(true) //Endlosschleife
{
while(xrechts) //Schleife für den Flug des ersten Balles nach rechts
{
if(da1) //überprüft ob da1 wahr ist
{
if(y3+20>=dim.height) //wenn y3+20 größer oder gleich der Höhe des Frames ist
{
test=2; //wird test auf 2 gesetzt
}
else if(y3<=kollisionoben) //wenn y3 kleiner oder gleich kollisionoben ist
{
test=1; //wird test auf 1 gesetzt
}
bilder.clearRect(x3,y3,ballx,bally); //der Ball wird entfernt
x3 +=10; //x3 wird um 10 erhöht (der erste Ball fliegt nach rechts)
if(test==1) //wenn test gleich 1 ist
{
y3 +=10; //wird y3 um 10 erhöht (der erste Ball fliegt nach unten)
}
else if(test==2) //wenn test gleich 2 ist
{
y3 -=10; //wird y3 um 10 verringert (der erste Ball fliegt nach oben)
}
bilder.fillOval(x3,y3,ballx,bally); //der Ball wird gezeichnet
try
{
sleep(geschw1); //Pause für die Länge geschw1 (damit der erste Ball nicht zu schnell ist)
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(x3>580) //wenn x3 größer als 580 ist (also rechts aus dem Bild geht)
{
punktl +=1; //dann wird punktl um 1 erhöht
bilder.clearRect(x3,y3,ballx,bally); //der Ball wird entfernt
da1=false; //da1 wird auf false gesetzt
neu +=1; //neu wird um 1 erhöht
x3=dim.width/2; //x3 wird auf die Breite des Frames geteilt durch 2 gesetzt
y3=dim.height/2; //y3 wird auf die Höhe des Frames geteilt durch 2 gesetzt (dadurch ist er in der Mitte des Frames)
JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL); //die Klasse PunkteL wird aufgerufen und ihr werden Variablen übergeben
einmalL=1; //einmalL wird auf 1 gesetzt
}
if((x3>=580-20)&&(y3<=y1+kolschl1+groesseschl1/2)&&(x3>=585-20)&&(y3>=y1+kolschl1-groesseschl1/2)) //damit wird gesagt, dass wenn der erste Ball gegen den rechten Schläger kommt, dass
{
xrechts=false; //xrechts auf false gesetzt wird
xlinks=true; //xlinks auf true gesetzt wird
if(geschw1>10) //wenn die Geschwindigkeit des ersten Balls höher als 10 ist,
{
geschw1 -=10; //dann wird die Geschwindigkeit des ersten Balls um 10 verringert
}
}
}
}
while(xlinks) //die Schleife für den Flug des ersten Balles nach links
{
if(da1) //wenn da1 auf true ist
{
if(y3+20>=dim.height) //wenn y3+20 größer oder gleich der Höhe des Frames ist
{
test=2; //wird test auf 2 gesetzt
}
else if(y3<=kollisionoben) //wenn y3 kleiner oder gleich kollisonoben ist
{
test=1; //wird test auf 1 gesetzt
}
bilder.clearRect(x3,y3,ballx,bally); //der Ball wird entfernt
x3 -=10; //x3 wird um 10 verringert (der erste Ball fliegt nach links)
if(test==1) //wenn test gleich 1 ist
{
y3 +=10; //wird y3 um 10 erhöht (der erste Ball fliegt nach unten)
}
else if(test==2) //wenn test gleich 2 ist
{
y3 -=10; //wird y3 um 10 verringert (der erste Ball fliegt nach oben)
}
bilder.fillOval(x3,y3,ballx,bally); //der erste Ball wird gezeichnet
try
{
sleep(geschw1); //Pause für die Höhe von geschw1 (damit der erste Ball nicht zu schnell ist)
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(x3<=0) //wenn x3 kleiner oder gleich 0 ist (also links aus dem Bild geht)
{
punktr +=1; //wird punktr um 1 erhöht
bilder.clearRect(x3,y3,ballx,bally); //der erste Ball wird entfernt
da1=false; //da1 wird auf false gesetzt
neu +=1; //neu wird um 1 erhöht
x3=dim.width/2; //x3 wird auf die Breite des Frames geteilt durch 2 gesetzt
y3=dim.height/2; //y3 wird auf die Höhe des Frames geteilt durch 2 gesetzt
JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR); //dke Klasse PunteR wird aufgerufen und ihr werden Variable übergeben
einmalR=1; //einmalR wird auf 1 gesetzt
}
if((x3<=20)&&(y3<=y2+kolschl2+groesseschl2/2)&&(x3<=20)&&(y3>=y2+kolschl2-groesseschl2/2)) //beschreibt, dass wenn der erste Ball gegen den linken Schläger kommt, dass
{
xlinks=false; //xlinks auf false gestezt wird
xrechts=true; //xrechts auf true gesetzt wird
if(geschw1>10) //wenn geschw1 görßer als 10 ist
{
geschw1 -=10; //wird geschw1 um 10 verringert
}
}
}
}
}
}
};
private Thread ball2 = new Thread() //das Gleiche wie bei dem ersten Ball nur für den zweiten Ball
{
public void run()
{
while(true)
{
while(xrechts2)
{
if(da2)
{
if(y4+20>=dim.height)
{
test2=2;
}
else if(y4<=kollisionoben)
{
test2=1;
}
bilder.clearRect(x4,y4,ballx,bally);
x4 +=10;
if(test2==1)
{
y4 +=10;
}
else if(test2==2)
{
y4 -=10;
}
bilder.fillOval(x4,y4,ballx,bally);
try
{
sleep(geschw2);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(x4>580)
{
punktl +=1;
bilder.clearRect(x4,y4,ballx,bally);
da2=false;
neu +=1;
x4=dim.width/2;
y4=dim.height/2;
JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL);
einmalL=1;
}
if((x4>=580-20)&&(y4<=y1+kolschl1+groesseschl1/2)&&(x4>=585-20)&&(y4>=y1+kolschl1-groesseschl1/2))
{
xrechts2=false;
xlinks2=true;
if(geschw2>10)
{
geschw2 -=10;
}
}
}
}
while(xlinks2)
{
if(da2)
{
if(y4+20>=dim.height)
{
test2=2;
}
else if(y4<=kollisionoben)
{
test2=1;
}
bilder.clearRect(x4,y4,ballx,bally);
x4 -=10;
if(test2==1)
{
y4 +=10;
}
else if(test2==2)
{
y4 -=10;
}
bilder.fillOval(x4,y4,ballx,bally);
try
{
sleep(geschw2);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(x4<=0)
{
punktr +=1;
bilder.clearRect(x4,y4,ballx,bally);
da2=false;
neu +=1;
x4=dim.width/2;
y4=dim.height/2;
JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR);
einmalR=1;
}
if((x4<=20)&&(y4<=y2+kolschl2+groesseschl2/2)&&(x4<=20)&&(y4>=y2+kolschl2-groesseschl2/2))
{
xlinks2=false;
xrechts2=true;
if(geschw2>10)
{
geschw2 -=10;
}
}
}
}
}
}
};
private Thread ball3 = new Thread() //das Gleiche wie bei dem ersten Ball nur für den dritten Ball
{
public void run()
{
while(true)
{
while(xrechts3)
{
if(da3)
{
if(y5+20>=dim.height)
{
test3=2;
}
else if(y5<=kollisionoben)
{
test3=1;
}
bilder.clearRect(x5,y5,ballx,bally);
x5 +=10;
if(test3==1)
{
y5 +=10;
}
else if(test3==2)
{
y5 -=10;
}
bilder.fillOval(x5,y5,ballx,bally);
try
{
sleep(geschw3);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(x5>580)
{
punktl +=1;
bilder.clearRect(x5,y5,ballx,bally);
da3=false;
neu +=1;
x5=dim.width/2;
y5=dim.height/2;
JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL);
einmalL=1;
}
if((x5>=580-20)&&(y5<=y1+kolschl1+groesseschl1/2)&&(x5>=585-20)&&(y5>=y1+kolschl1-groesseschl1/2))
{
xrechts3=false;
xlinks3=true;
if(geschw3>10)
{
geschw3 -=10;
}
}
}
}
while(xlinks3)
{
if(da3)
{
if(y5+20>=dim.height)
{
test3=2;
}
else if(y5<=kollisionoben)
{
test3=1;
}
bilder.clearRect(x5,y5,ballx,bally);
x5 -=10;
if(test3==1)
{
y5 +=10;
}
else if(test3==2)
{
y5 -=10;
}
bilder.fillOval(x5,y5,ballx,bally);
try
{
sleep(geschw3);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(x5<=0)
{
punktr +=1;
bilder.clearRect(x5,y5,ballx,bally);
da3=false;
neu +=1;
x5=dim.width/2;
y5=dim.height/2;
JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR);
einmalR=1;
}
if((x5<=20)&&(y5<=y2+kolschl2+groesseschl2/2)&&(x5<=20)&&(y5>=y2+kolschl2-groesseschl2/2))
{
xlinks3=false;
xrechts3=true;
if(geschw3>10)
{
geschw3 -=10;
}
}
}
}
}
}
};
private Thread ball4 = new Thread() //das Gleiche wie bei dem ersten Ball nur für den vierten Ball
{
public void run()
{
while(true)
{
while(xrechts4)
{
if(da4)
{
if(y6+20>=dim.height)
{
test4=2;
}
else if(y6<=kollisionoben)
{
test4=1;
}
bilder.clearRect(x6,y6,ballx,bally);
x6 +=10;
if(test4==1)
{
y6 +=10;
}
else if(test4==2)
{
y6 -=10;
}
bilder.fillOval(x6,y6,ballx,bally);
try
{
sleep(geschw4);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(x6>580)
{
punktl +=1;
bilder.clearRect(x6,y6,ballx,bally);
da4=false;
neu +=1;
x6=dim.width/2;
y6=dim.height/2;
JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL);
einmalL=1;
}
if((x6>=580-20)&&(y6<=y1+kolschl1+groesseschl1/2)&&(x6>=585-20)&&(y6>=y1+kolschl1-groesseschl1/2))
{
xrechts4=false;
xlinks4=true;
if(geschw4>10)
{
geschw4 -=10;
}
}
}
}
while(xlinks4)
{
if(da4)
{
if(y6+20>=dim.height)
{
test4=2;
}
else if(y6<=kollisionoben)
{
test4=1;
}
bilder.clearRect(x6,y6,ballx,bally);
x6 -=10;
if(test4==1)
{
y6 +=10;
}
else if(test4==2)
{
y6 -=10;
}
bilder.fillOval(x6,y6,ballx,bally);
try
{
sleep(geschw4);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(x6<=0)
{
punktr +=1;
bilder.clearRect(x6,y6,ballx,bally);
da4=false;
neu +=1;
x6=dim.width/2;
y6=dim.height/2;
JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR);
einmalR=1;
}
if((x6<=20)&&(y6<=y2+kolschl2+groesseschl2/2)&&(x6<=20)&&(y6>=y2+kolschl2-groesseschl2/2))
{
xlinks4=false;
xrechts4=true;
if(geschw4>10)
{
geschw4 -=10;
}
}
}
}
}
}
};
public PingPong()
{
super("PingPong"); //Frame wird erzeugt
setDefaultCloseOperation(EXIT_ON_CLOSE); //Wenn der Frame geschlossen wird wird die DOS-BOX beendet
setResizable(false); //der Frame wird in der Größe unveränderbar
setSize(dim); //die Größe des Frames wird gesetzt
// ImageIcon icon1 = new ImageIcon( PingPong.class.getResource( "tennisfeld.gif" ) );
// JLabel tennis = new JLabel( icon1 );
// add( tennis, BorderLayout.LINE_START );
setLocation( (pos.width - dim.width ) / 2,(pos.height - dim.height) / 2 ); //die Position des Frames wird bestimmt
addKeyListener(new KeyAdapter() //Beginn des KeyListeners
{
public void keyPressed(KeyEvent evt) //bei gedrückter Taste
{
pruef(evt.getKeyCode(),true); //der Variable pruef wird der Tastencode der gedrückten Taste und den Wert true übergeben
}
public void keyReleased(KeyEvent evt) //bei loslassen der gedrückten Taste
{
pruef(evt.getKeyCode(),false); //der Variable pruef wird der Tastencode der losgelassenen Taste und den Wert false übergeben
}
public void keyTyped(KeyEvent evt2) //bei kurzem drücken einer Taste
{
if(druektasten[b]) //wenn druektasten[b] wahr ist
{
if(neu>0) //wenn neu größer als 0 ist
{
neu -=1; //wird neu um 1 verringert
if(da1==false) //wenn da1 gleich false ist
{
da1=true; //wird da1 auf true gestezt
geschw1=150; //wird die Geschwindigkeit von dem ersten Balls auf 150 gesetzt
}
else if(da2==false) //wenn da2 gleich false ist
{
da2=true; //wird da2 auf true gesetzt
geschw2=180; //wird die Geschwindigkeit von dem zweiten Balls auf 180 gesetzt
}
else if(da3==false) //wenn da3 gleich false ist
{
da3=true; //wird da3 auf true gesetzt
geschw3=210; //wird die Geschwindigkeit von dem dritten Balls auf 210 gesetzt
}
else if(da4==false) //wenn da4 gleich false ist
{
da4=true; //wird da4 auf true gesetzt
geschw4=170; //wird die Geschwindigkeit von dem vierten Balls auf 170 gesetzt
}
}
}
if(druektasten[h]) //wenn druektasten[h] wahr ist
{
if(tasth==1) //wenn tasth gleich 1 ist
{
if(y1<=kollisionoben) //wenn y1 kleiner oder gleich kollisionoben ist
{
groesseschl1=300; //wird die größe des rechten Schlägers auf 300 gesetzt
kolschl1=100; //die Kollision des rechten schlägers wird auf 100 gesetzt
tasth=0; //tasth wird auf 0 gesetzt
}
}
else if(tasth==0) //wenn tasth gleich 0 ist
{
groesseschl1=50; //wird die Größe des rechten Schlägers auf 50 gesetzt
kolschl1=20; //die Kolllision des rechten Schlägers wird auf 20 gesetzt
tasth=1;
bilder.clearRect(585,0,5,300); //der rechte Schläger wird entfernt
}
}
if(druektasten[g]) //das Gleiche wie bei Taste h nur mit der Taste g und dem linken Schläger
{
if(tastg==1)
{
if(y2<=kollisionoben)
{
groesseschl2=300;
kolschl2=100;
tastg=0;
}
}
else if(tastg==0)
{
groesseschl2=50;
kolschl2=20;
tastg=1;
bilder.clearRect(10,0,5,300);
}
}
}
private void pruef(int taste,boolean wert)
{
switch(taste)
{
case KeyEvent.VK_UP: //wenn die Taste Hoch gedrückt ist
druektasten[hoch]=wert; //wird druektasten[hoch] auf den Wert von wert gesetzt
break; //Abbruch
case KeyEvent.VK_DOWN: //Wenn die Taste Runter gedrückt ist
druektasten[runter]=wert; //wird druektasten[runter] auf den Wert von wert gesetzt
break; //Abbruch
case KeyEvent.VK_W: //wenn die Taste W gedrückt ist
druektasten[w]=wert; //wird druektasten[w] auf den Wert von wert gesetzt
break; //Abbruch
case KeyEvent.VK_S: //wenn die Taste S gedrückt ist
druektasten[s]=wert; //wird druektasten[s] auf den Wert von wert gesetzt
break; //Abbruch
case KeyEvent.VK_B: //wenn die Taste B gedrückt ist
druektasten[b]=wert; //wird druektasten[b auf den Wert von wert gesetzt
break; //Abbruch
case KeyEvent.VK_H: //wenn die Taste H gedrückt ist
druektasten[h]=wert; //wird druektasten[h] auf den Wert von wert gesetzt
break; //Abbruch
case KeyEvent.VK_G: //wenn die Taste G gedrückt ist
druektasten[g]=wert; //wird druektasten[g] auf den Wert von wert gesetzt
break; //Abbruch
default:; //wenn nichts davon zutrifft
}
}
});
setVisible(true); //der Frame wird gezeigt
bilder = (Graphics2D)this.getGraphics(); //damit kann gezeichnet werden
}
public static void main(String[] args)
{
new PingPong().start();
}
private void start()
{
JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR); //die Klasse PunkteR wird aufgerufen und ihr werdne Variablen übergeben
JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL); //die Klasse PunkteL wird aufgerufen und ihr werdne Variablen übergeben
bewegung.start(); //der Thread Bewegung wird gestartet
ball.start(); //der Thread für den ersten Ball wird gestartet
ball2.start(); //der Thread für den zweiten Ball wird gestartet
ball3.start(); //der Thread für den dritten Ball wird gestartet
ball4.start(); //der Thread für den vierten Ball wird gestartet
}
}