# PingPong HILFE !!!



## Hax0r (24. Jun 2009)

Hey Leute ich bin neu hier und brauche ein bisschen hilfe ;-)
Ich hab seit ca 1/2 Jahr Info als Grundkurs auf nem Gymnasium und jetzt sollen wir ein Spiel programieren aber ich komm nicht weiter...

Also ich bin fast fertig suche nurnoch nach einer möglichkeit 2 Variablen durch Tastendruck zu verändern. Halt den Bumper von Pingpong rauf und runter bewegen.

Hier der Quelltext (die Zeilen mit den Variablen sind 123 / 124 ;-) ) :

```
package PingPong;
import java.awt.*;

public class fenster extends Frame
{
   int ende=0;
   int x=0;
   int a1=120;
   int a2=140;
   int c1;
   int c2;
   void umkehr()
   {
     if(x==0)
     {
       a1++;
       a2++;
       c1=a1-1;
       c2=a2-1;
     }
     if(x==1)
     {
       a1++;
       a2--;
       c1=a1-1;
       c2=a2+1;
     }
     if(x==2)
     {
       a1--;
       a2++;
       c1=a1+1;
       c2=a2-1;
     }
     if(x==3)
     {
       a1--;
       a2--;
       c1=a1+1;
       c2=a2+1;
     }
   }
   void check()
   {
     if(x==0 && a2==579)
     {
       x=1;
     }
     if(x==1 && a2==40)
     {
       x=0;
     }
     if(x==2 && a2==579)
     {
       x=3;
     }
     if(x==3 && a2==40)
     {
       x=2;
     }
     if(x==0 && a1==789)
     {
       x=2;
     }
     if(x==1 && a1==789)
     {
       x=3;
     }
     if(x==2 && a1==11)
     {
       x=0;
     }
     if(x==3 && a1==11)
     {
       x=1;
     }
   }
   public fenster()
   {
     super("Ping Pong");
     this.setSize(800,600);
     this.setBackground(Color.BLACK);
     this.show();

   }
   public void paint (Graphics g)
   {
     int b1=31;
     while(b1<=35)
     {
       b1++;
       g.setColor(Color.GREEN);
       g.drawLine(0,b1,800,b1);
       g.drawLine(0,626-b1,800,626-b1);
     }
     g.setColor(Color.GREEN);
     g.drawString("3 !!!", 375, 300);
     try {Thread.sleep(1000);}
     catch(InterruptedException e) {}
     g.setColor(Color.BLACK);
     g.drawString("3 !!!", 375, 300);
     g.setColor(Color.GREEN);
     g.drawString("2 !!!", 375, 300);
     try {Thread.sleep(1000);}
     catch(InterruptedException e) {}
     g.setColor(Color.BLACK);
     g.drawString("2 !!!", 375, 300);
     g.setColor(Color.GREEN);
     g.drawString("1 !!!", 375, 300);
     try {Thread.sleep(1000);}
     catch(InterruptedException e) {}
     g.setColor(Color.BLACK);
     g.drawString("1 !!!", 375, 300);
     g.setColor(Color.GREEN);
     g.drawString("Los !!!", 375, 300);
     try {Thread.sleep(500);}
     catch(InterruptedException e) {}
     g.setColor(Color.BLACK);
     g.drawString("Los !!!", 375, 300);
     while(ende == 0)
     {
       int b2=10;
       int b3=275;
       int b4=275;
       while(b2<=16)
       {
       b2++;
       g.setColor(Color.GREEN);
       g.drawLine(b2,b3,b2,b3+50);
       g.drawLine(800-b2,b4,800-b2,b4+50);
       }
       if(a1==789 || a1==11)
       {
         if ( ( (x == 1 || x == 0) && (b4 <= a2 && a2 <= (b4 + 50))) ||
             ( (x == 2 || x == 3) && (b3 <= a2 && a2 <= (b3 + 50)))) {
           check();
         }
         else {
           ende = 1;
           g.setColor(Color.GREEN);
           if(x==0 || x==1)
           {
           g.drawString("Spieler 1 Gewinnt !!!", 375, 300);
           }
           if(x==2 || x==3)
           {
           g.drawString("Spieler 2 Gewinnt !!!", 375, 300);
           }
         }
       }
       if(a2==40 || a2==579)
         {check();}
       g.setColor(Color.BLACK);
       g.drawOval(c1,c2,10,10);
       g.setColor(Color.GREEN);
       g.drawOval(a1,a2,10,10);
       try {Thread.sleep(2,5);}
       catch(InterruptedException e) {}
       umkehr();
     }
   }

public static void main(String args[])
   {
     fenster f = new fenster();
   }
}
```


Vielen dank für jede Hilfe :toll:
PS: ich weiß der Code sieht furchtbar aus


----------



## Marco13 (24. Jun 2009)

Das wird nicht möglich sein, solange du den Code nicht weniger furchtbar machst. Die ganze Logik in der paint bewirkt, dass alles blockiert ist. Ich würde gerne sagen: "Selten habe ich größeren Unfug gesehen", aber das stimmt leider nicht. Such nach Tutorials zu Swing. Dein spezielles Problem würde man bei einem richtige(re)n Programm mit einem KeyListener lösen. Mehr kann man dazu kaum sagen.


----------



## Hax0r (24. Jun 2009)

Also es würde mir sehr helfen wenn da einfach nur jemand kurz erklärt, wie ich da einen KeyListener reinbaue und dass der wenn ich :
"q" drücke b3=b3-3;
"a" -> b3=b3+3;
"8" -> b4=b4-3;
"5" -> b4=b4+3;


----------



## Schandro (24. Jun 2009)

> Also es würde mir sehr helfen wenn da einfach nur jemand kurz erklärt, wie ich da einen KeyListener reinbaue


Es geht nicht. Du *MUSST* das ganze Programm umstrukturieren.

Mann darf in der paint-Methode NUR malen, nichts anderes! Und auf gar keinen Fall ne Unendlichschleife oder Thread.sleep. Die paint-Methode muss so schnell wie möglich abgehandelt werden können.

Les dir mal ein Tutorial über Malen mit Swing/AWT durch (z.b. Malen in AWT und Swing - Byte-Welt Wiki) und guck dir mal den Beispielcode an:

```
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class XXX{

    public static void main(String[] args){
        new XXX();}


    private JFrame window = new JFrame();
    private int cnt; // wird zur Kommunikation ziwschen dem animationThread und paintComponent benutzt

    public XXX(){
        window.setBounds(100,100,400,200);
        window.add(panel);

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                window.setVisible(true);
            }
        });

        Thread animationThread = new Thread(new Runnable(){
            public void run(){
                while(cnt < 300){
                    ++cnt;
                    panel.repaint();

                    try{
                        Thread.sleep(10);
                    }catch(InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }
        });
        animationThread.start();
    }


    private JPanel panel = new JPanel(){
        public void paintComponent(Graphics g){
            super.paintComponent(g);

            g.setColor(Color.BLACK);
            g.fillRect(cnt,50,50,50);
        }
    };

}
```

Achso, noch ein paar andere Sachen zu deinen Code:
1.
Die Methode show() von Frame ist Deprecated. Das heisst sie ist zwar noch in der API drinnen wegen der Abwärtskompatibilität, man sollte sie aber nicht mehr benutzen.
schreib stattdessen:
setVisible(true);

2.
Schreibweise von Namen:
Klassennamen: CamelCase
Variablen; camelCase
packages: camelcase

Bei dir müsste die Klasse also "Fenster" und das package "pingpong" heissen.


----------

