import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Pong extends JApplet implements KeyListener, Runnable{
// Anfang Variablen
private JPanel jpaCenter = new JPanel();
private final int BALKEN_BREITE = 5;
private final int BALKEN_HOEHE = 40;
private final int BALL_DURCHMESSER = 10;
private boolean[] taste = new boolean[256];
private Point[] balken = new Point[2];
private int[] lebenSpieler = new int[2];
private String[] nameSpieler = new String[2];
private Point ball;
private Graphics spielfeld;
private int xBewegung, yBewegung;
private JPanel jpaNorth = new JPanel();
private JLabel jlbLinks = new JLabel();
private JLabel jlbMitte = new JLabel();
private JLabel jlbRechts = new JLabel();
private boolean spiel = false, pause;
private int ballKontakteInFolge, geschwindigkeit;
// Ende Variablen
public void init() {
System.out.println("Init");
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
// Anfang Komponenten
cp.add(jpaCenter, BorderLayout.CENTER);
cp.add(jpaNorth, BorderLayout.NORTH);
jpaNorth.add(jlbLinks, BorderLayout.NORTH);
jlbMitte.setHorizontalAlignment(SwingConstants.CENTER);
jpaNorth.add(jlbMitte, BorderLayout.NORTH);
jlbRechts.setText("Bitte clicken sie zum starten hier ! ");
jlbRechts.setHorizontalAlignment(SwingConstants.RIGHT);
jpaNorth.add(jlbRechts, BorderLayout.NORTH);
// Ende Komponenten
addKeyListener(this);
addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if(jlbRechts.getText().equals("Bitte clicken sie zum starten hier ! "))
go();
}
});
}
private void go(){
System.out.println("Go");
// setzen der startpositionen der Balken und des balls
int balkenYPosition = jpaCenter.getHeight() / 2;
balkenYPosition = balkenYPosition - (BALKEN_HOEHE / 2);
balken[0] = new Point(1, balkenYPosition);
balken[1] = new Point((jpaCenter.getWidth() - BALKEN_BREITE - 2), balkenYPosition);
ball = new Point(100, 100);
for(int i = 0; i < balken.length; i++){ // Setzen Spielernamen und
lebenSpieler[i] = 15; // deren leben
nameSpieler[i] = "Spieler" + i;
}
showLabel();
spielfeld = jpaCenter.getGraphics(); // definieren des Spielfeld
paint(); // malen des Spielfeldes
ballKontakteInFolge = 0;
geschwindigkeit = 5;
xBewegung = yBewegung = 1;
pause = false;
if(!spiel){ // wenn kein Spiel läuft
spiel = true;
new Thread(this).start(); // starten des balls
}
}
// Anfang Ereignisprozeduren
public void keyTyped(KeyEvent e){
if(e.getKeyChar() == 'n'){
go();
}else if(e.getKeyChar() == 'p'){
if(pause){
pause = false;
paint();
}
else pause = true;
}else if(e.getKeyChar() == 'i'){
pause = true;
showInfo();
}
}
public void keyPressed(KeyEvent e){
if(taste[e.getKeyCode()]) return; //wenn das drücken der taste bereits registriert ist dann breche ab
taste[e.getKeyCode()] = true;
if(e.getKeyChar() == 'w'){
moveBalken(e.getKeyCode(), 0, true);
}else if(e.getKeyChar() == 's'){
moveBalken(e.getKeyCode(), 0, false);
}else if(e.getKeyCode() == 38){
moveBalken(e.getKeyCode(), 1, true);
}else if(e.getKeyCode() == 40){
moveBalken(e.getKeyCode(), 1, false);
}
}
public void keyReleased(KeyEvent e){
taste[e.getKeyCode()] = false;
}
public void run(){
// Bewegen des balls
System.out.println("Run");
while(spiel){
if(ball.y == 1 || (ball.y + BALL_DURCHMESSER) == (jpaCenter.getHeight() - 2)) // Treffen auf oberen oder unteren Rand
yBewegung *= -1;
clearBall();
if(ball.x == 1){
lebenSpieler[0]--;
ballKontakteInFolge = 0;
showLabel();
if(lebenSpieler[0] == 0){
showInfo("Herzlichen Glückwunsch " + nameSpieler[1] + " Sie haben gewonnen!!!\n" + nameSpieler[0] + " hatte keien chance und hat verloren! LOSER!!!\n");
spiel = false;
return;
}else{
int x = (jpaCenter.getWidth() / 2) - (BALL_DURCHMESSER / 2);
int y = (jpaCenter.getHeight() / 2) - (BALL_DURCHMESSER / 2);
ball.move(x, y);
}
}else if(ball.x == (jpaCenter.getWidth() - 2 - BALL_DURCHMESSER)){
lebenSpieler[1]--;
ballKontakteInFolge = 0;
showLabel();
if(lebenSpieler[1] == 0){
showInfo("Herzlichen Glückwunsch " + nameSpieler[0] + " Sie haben gewonnen!!!\n" + nameSpieler[1] + " hatte keien chance und hat verloren! LOSER!!!\n");
spiel = false;
return;
}else{
int x = (jpaCenter.getWidth() / 2) - (BALL_DURCHMESSER / 2);
int y = (jpaCenter.getHeight() / 2) - (BALL_DURCHMESSER / 2);
ball.move(x, y);
}
}else if((ball.x == (balken[0].x + BALKEN_BREITE)) && ((ball.y + BALL_DURCHMESSER) >= balken[0].y)&& (ball.y <= (balken[0].y + BALKEN_HOEHE))){
xBewegung *= -1; // balken 0
ballKontakteInFolge++;
drawBalken(0);
}else if(((ball.x + BALL_DURCHMESSER) == balken[1].x) && ((ball.y + BALL_DURCHMESSER) >= balken[1].y)&& (ball.y <= (balken[1].y + BALKEN_HOEHE))) {
xBewegung *= -1; // balken 1
ballKontakteInFolge++;
drawBalken(1);
}
ball.x += xBewegung;
ball.y += yBewegung;
drawBall();
if(ballKontakteInFolge == 10 && geschwindigkeit > 1){
ballKontakteInFolge = 0;
geschwindigkeit--;
}
delay(geschwindigkeit);
while(pause);
}
}
// Ende Ereignisprozeduren
private void showLabel(){
jlbLinks.setText(" " + nameSpieler[0] + ": " + lebenSpieler[0]);
jlbMitte.setText(" Neues Spiel [n] Pause [p] Info [i] ");
jlbRechts.setText(" " + nameSpieler[1] + ": " + lebenSpieler[1]);
}
private void showInfo(){
showInfo("");
}
private void showInfo(final String text){
new Frame("Info"){
private Button buOK = new Button();
private TextArea taAusgabe = new TextArea();
private Panel paSouth = new Panel();
{
setSize(400, 400);
setLocation(10, 10);
setLayout(new BorderLayout());
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {setVisible(false); setFocus();}
});
add("Center", taAusgabe);
add("South", paSouth);
buOK.setLabel(" OK ");
buOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
setVisible(false);
setFocus();
}
});
paSouth.add(buOK);
setVisible(true);
taAusgabe.append(text);
taAusgabe.append("\nBEDIENUG\nTasten " + nameSpieler[0] + ": Hoch(w) Runter(s)\n");
taAusgabe.append("Tasten " + nameSpieler[1] + ": Hoch(Pfeiltaste hoch) Runter(Pfeiltaste runter)\n");
taAusgabe.append("Letze Ballgeschwindigkeit (1 = MAX): " + geschwindigkeit);
taAusgabe.append("Version 1.0 vom 02.01.2006\n");
taAusgabe.append("\nACHTUNG\nNach beenden des Fensters bitte [p] zum weiterspielen\nb.z.w. [n] für ein neues Spiel drücken!!!\n");
}
};
}
private void paint(){
System.out.println("Paint");
spielfeld.clearRect(0, 0, jpaCenter.getWidth(), jpaCenter.getHeight()); // Löschen alter objecte auf den Spielfeld
spielfeld.drawRect(0, 0, (jpaCenter.getWidth() - 1), (jpaCenter.getHeight() - 1)); // Malen eines randes
for(int i = 0; i < balken.length; i++){ // Setzen der Balken und bälle
drawBalken(i);
}
drawBall();
}
private void setFocus(){
this.requestFocus();
this.repaint();
}
private void drawBalken(int i){
spielfeld.drawRect(balken[i].x, balken[i].y, BALKEN_BREITE, BALKEN_HOEHE);
}
private void drawBall(){
spielfeld.drawOval(ball.x, ball.y, BALL_DURCHMESSER, BALL_DURCHMESSER);
}
private void clearBalken(int i){
spielfeld.clearRect(balken[i].x, balken[i].y, (BALKEN_BREITE + 1), (BALKEN_HOEHE + 1));
}
private void clearBall(){
spielfeld.clearRect(ball.x, ball.y, (BALL_DURCHMESSER + 1), (BALL_DURCHMESSER + 1));
}
private static void delay(long millis){
try{Thread.sleep(millis);}catch(InterruptedException e){ }
}
private void moveBalken(final int zeichen, final int balkenNummer, final boolean hoch){ // Parameter: gedrucktes zeichen
new Thread(){ // auf dessen loslassen gewartet wird / zu bewegener Button / richtung in die er zu bewegen ist
public void run(){
while(taste[zeichen]){
while(pause); // Solange das spiel pausiert ist aktion herauszögern
if((balken[balkenNummer].y + BALKEN_HOEHE) == (jpaCenter.getHeight() - 2) && !hoch)
break; // wenn der unter Rand erreicht ist
if(balken[balkenNummer].y == 1 && hoch)
break;
clearBalken(balkenNummer);
if(hoch) balken[balkenNummer].y --;
else balken[balkenNummer].y ++;
drawBalken(balkenNummer);
delay(2); // bewegungsgeschwindigkeit
}
}
}.start();
}
}