# How to : Update?



## Developer_X (11. Aug 2009)

Hi, ich bin grad am programmieren eines Ping Pong spiels, ich weiß aber leider nicht wie ich das mit dem update hinbekommen soll, ich las im internet mehrere artikel, versuchte das ganze einzubauen, hat nie geklappt, kann mir einer von euch helfen?

```
package Pong;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	//Ping Pong Attribute
		  int player_points = 0;
		  int ki_points     = 0;
		  
		  int player_height = d.height/2;
		  int ball_height   = d.height/2;
		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
	}

	public void paint(final Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,d.width,d.height);
		
		g.setColor(Color.green);
		g.setFont(new Font("Times New Roman",3,40));
		g.drawString("Player : "+player_points,d.width/5,d.height-20);
		g.drawString("KI     : "+ki_points,    d.width/2,d.height-20);

		g.fillRect(d.width/5,player_height,20,d.height/5);
		
		g.fillRect(d.width-d.width/5,ball_height,20,d.height/5);
	}

	public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);
	}

	
	public void run() 
	{		
		repaint();
	}
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			player_height++;
		}
		if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			player_height--;
		}
	}
	public void keyReleased(KeyEvent arg0) 
	{		
	}
	public void keyTyped(KeyEvent arg0)
	{		
	}
}
```
Danke für jede Antwort
Developer_X


----------



## The_S (11. Aug 2009)

Was willste denn updaten?


----------



## Landei (11. Aug 2009)

Versuch mal am Ende von keyPressed()

```
invalidate();
repaint();
```


----------



## Developer_X (11. Aug 2009)

es klappt! danke!


----------



## Painii (11. Aug 2009)

Falls das ganze mal als Thread läuft kannst du ja auch run() benutzen:


```
public void run(){
 while(spielt){
  invalidate();
  repaint();
 }
}
```
Wenn du nur im KeyListener repaint() machst dann verändert sich ja nix wenn man keine Taste drückt.


----------



## Developer_X (11. Aug 2009)

Painii hat gesagt.:


> Falls das ganze mal als Thread läuft kannst du ja auch run() benutzen:
> 
> 
> ```
> ...



logisch


----------



## diggaa1984 (11. Aug 2009)

DevX warum fixt du nicht erstma dein 4Gewinnt .. den Bug den ich gemeldet hab und den sparrow bestätigen konnte ist ein Fehler in der Spiellogik und hat nix mit der KI zu tun, daher ist das Programm ja noch unfertig.

ich kanns nur nochmal sagen: Konzentrier dich auf einige wenige aktuelle Programme, und nicht 10 auf einmal!! Erst richtig zu Ende bringen dann was neues anfangen


----------



## The_S (11. Aug 2009)

Könnt ihr alle hellsehen, oder was :shock: ???


----------



## Developer_X (11. Aug 2009)

diggaa1984 hat gesagt.:


> DevX warum fixt du nicht erstma dein 4Gewinnt .. den Bug den ich gemeldet hab und den sparrow bestätigen konnte ist ein Fehler in der Spiellogik und hat nix mit der KI zu tun, daher ist das Programm ja noch unfertig.
> 
> ich kanns nur nochmal sagen: Konzentrier dich auf einige wenige aktuelle Programme, und nicht 10 auf einmal!! Erst richtig zu Ende bringen dann was neues anfangen



also, ich hab das jetzt gelöst, den BUg, hab ich wohl vergessen zu sagen, der erkennt jetzt wirklich rechtzeitig, wenn jemand gewonnen hat.
Wirklich, schaus dir mal an, ich hoffe du hast den link noch


----------



## Developer_X (11. Aug 2009)

ich habe noch ein problem in der methode "run()" warum passiert nichts?

```
package Pong;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	//Ping Pong Attribute
		  int player_points = 0;
		  int player_height = d.height/3;

		  int ki_points     = 0;
		  
		  int ball_radius   = 20;	  
		  int ball_x        = d.height/3;
		  int ball_y        = d.height/3;
	  
		  int max_y  = 50;
		  int max_x  = 50;

		  int move = 5;
		  int count_move = 0;
		  
		  boolean left = false;
		  boolean righ = true;
		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
	}

	public void paint(final Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,d.width,d.height);
		
		//Draw Information
		g.setColor(Color.green);
		g.setFont(new Font("Times New Roman",3,40));
		g.drawString("Player : "+player_points,d.width/5,d.height-d.height/45);
		g.drawString("KI     : "+ki_points,    d.width/2,d.height-d.height/45);

		//Draw Arena
		g.drawRect(d.width/5-d.width/36,(int) (d.height/22.5),d.width/3+d.width/3,d.height/3+d.height/3+max_y+d.height/18);
		
		//Draw Enemys
		g.fillRect(d.width/5,player_height,d.width/72,d.height/5);
		g.fillRect(d.width-d.width/5,ball_y,d.width/72,d.height/5);
		
		//Draw Ball
		g.setColor(Color.white);
		g.fillOval(ball_x,ball_y,ball_radius,ball_radius);
	}

	public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);
	}

	
	public void run() 
	{	
		if(left)
		{
			ball_x++;
			if(ball_x>=d.width-d.width/5)
			{
				righ = true;
				left = false;
			}
		}
		else
		{
			ball_x--;
			if(ball_x<=d.width/5)
			{
				left = true;
				righ = false;
			}
		}
		try
		{
			Thread.sleep(500);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		invalidate();
		repaint();	
	}
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			if(count_move>=-max_y)
			{
				player_height=player_height-move;
				count_move--;
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			if(count_move<=max_y)
			{
				player_height=player_height+move;
				count_move++;
			}
		}
		invalidate();
		repaint();
	}
	public void keyReleased(KeyEvent arg0) 
	{		
	}
	public void keyTyped(KeyEvent arg0)
	{		
	}
}
```


----------



## sparrow (11. Aug 2009)

Ich sehe keinen Start des Threads.


----------



## Developer_X (11. Aug 2009)

genau das ist es ja, wie soll ich ihn starten?
soll ich die Methode:
start()
überschreiben?


----------



## Developer_X (11. Aug 2009)

ich habe hier mal was aus meinen alten Zeiten:

```
//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		  Thread thread;

		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
		
	thread = new Thread (this);
		thread.start();
	}
```
So klappts aber leider auch nicht.


----------



## sparrow (11. Aug 2009)

Developer_X hat gesagt.:


> ich habe hier mal was aus meinen alten Zeiten:



Der Spruch war gut 


Threads sind eine schöne Sache.
Wie man die anlegt und startet erfährt man hier: Galileo Computing :: Java ist auch eine Insel – 10 Threads und nebenläufige Programmierung


----------



## Developer_X (11. Aug 2009)

JavaInsel hat gesagt.:


> 10.2.2 Thread mit Runnable starten
> Nun reicht es nicht aus, einfach die run()-Methode einer Klasse direkt aufzurufen. Würden wir dies tun, dann wäre nichts nebenläufig, sondern wir würden einfach eine Methode sequenziell ausführen. Damit der Programmcode parallel zur Applikation läuft, müssen wir ein Thread-Objekt mit dem Runnable verbinden und dann den Thread explizit starten. Dazu übergeben wir dem Konstruktor der Klasse Thread eine Referenz auf das Runnable-Objekt und rufen start() auf. Nachdem start() für den Thread eine Ablaufumgebung geschaffen hat, ruft es intern selbstständig die Methode run() genau einmal auf. Läuft der Thread schon, so löst ein zweiter Aufruf der start()-Methode eine IllegalThreadStateException aus.
> 
> Listing 10.3 com/tutego/insel/thread/FirstThread.java, main()
> ...



Ich hab das mal so umgeändert, aber nichts passiert, warum?

```
public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);

		Thread t = new Thread(p); 
		t.start();
	}
```


----------



## sparrow (11. Aug 2009)

Ich werde mal so frei sein und die Antwort nicht einfach sagen.

Wir machen stattdessen mal Fehleranalyse: Was genau geht denn nicht? Woran hängt es?
Wie wäre es mal mit einer Ausgabe um zu schauen ob dein Programm eine bestimmte Stelle im Code überhaupt erreicht? Wie willst du sonst jemals auf Fehlersuche gehen und Fehler selbst finden?


----------



## Developer_X (11. Aug 2009)

das Problem ist, dass alles funktioniert, nur nicht in der main ab den worten:
Thread t = new Thread(p); 
        t.start();

Problem:
Thread wird nciht gestartet#


----------



## sparrow (11. Aug 2009)

Developer_X hat gesagt.:


> das Problem ist, dass alles funktioniert, nur nicht in der main ab den worten:
> Thread t = new Thread(p);
> t.start();
> 
> ...



Bist du dir da sicher oder glaubst du das nur?
Bist du dir ganz sicher, dass der Code deines Threads nicht ausgeführt wird?
Woran machst du das fest? Vielleicht aktualisiert sich nur die Bildschirmausgabe nicht? Oder deine Bedingungen sind versehentlich so gesetzt, dass nicht neu gezeichnet wird?


----------



## max40 (11. Aug 2009)

ich Wette es ist keine schleife in der run-Methode!


----------



## sparrow (11. Aug 2009)

Männo... so lernt man das debuggen nie.


----------



## Developer_X (11. Aug 2009)

max40 hat gesagt.:


> ich Wette es ist keine schleife in der run-Methode!



oh, danke, das wars, danke euch allen!


----------



## max40 (11. Aug 2009)

Developer_X hat gesagt.:


> oh, danke, das wars, danke euch allen!



Willst du uns nicht die in Code umgesetzte Lösung zeigen?!


----------



## sparrow (11. Aug 2009)

Developer_X hat gesagt.:


> oh, danke, das wars, danke euch allen!



Ich wollte darauf hinaus, dass du nicht einmal geprüft hast ob dir run-Methode überhaupt ausgeführt wird.
Wurde sie nämlich: genau 1 Mal.

Ein einfaches System.out.println("run Methode startet") am Beginn der Methode hätte dir das gezeigt.
An markanten Stellen im Programm einfach eine Nachricht auszugeben hilft beim Debuggen unheimlich.


----------



## Developer_X (11. Aug 2009)

sparrow hat gesagt.:


> Ich wollte darauf hinaus, dass du nicht einmal geprüft hast ob dir run-Methode überhaupt ausgeführt wird.
> Wurde sie nämlich: genau 1 Mal.
> 
> Ein einfaches System.out.println("run Methode startet") am Beginn der Methode hätte dir das gezeigt.
> An markanten Stellen im Programm einfach eine Nachricht auszugeben hilft beim Debuggen unheimlich.



du hast recht, 

@ALL: willst du uns nicht mal die Code umsetztung zeigen?

Naja, ist noch nicht ganz perfekt:
        Was es schon kann:

es kann von den wänden abprallen

ProbleM:
Er erkennt noch nciht so richtig, wann einer gewonnen hat,
die methode lost, habe ich mal rausgenommen, aber später baue ich sie wo ein.
Bisjetzt solltet ihr einen KI sehen der mit sich selbstspielt, auch wenn ihr gar ncihts.

Was ich aber gut finde, und deshalb auch tat, damit ihr, wenn ihr mein Spiel änder wollt, gar keine Arbeit habt, hatte ich mir gedacht, alles, alle variablen gebe ich oben als Attribute an, dort könnt ihr alles einstellen.

So jetzt genug, hier der Code, nicht vergessen, noch nicht fertig:

```
package Pong;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	//Ping Pong Attribute
		  int player_points = 0;
		  int player_height = d.height/3;

		  int ki_points     = 0;
		  
		  int ball_radius   = 20;	  
		  int ball_x        = d.height/2;
		  int ball_y        = d.height/2;
	  
		  int max_y  = 25;
		  int max_x  = 50;

		  int move = 10;
		  int count_move = 0;
		  
		  boolean left = false;
		  boolean righ = true;
		  boolean up = false;
		  boolean down = true;
		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
	}

	public void paint(final Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,d.width,d.height);
		
		//Draw Information
		g.setColor(Color.green);
		g.setFont(new Font("Times New Roman",3,40));
		g.drawString("Player : "+player_points,d.width/5,d.height-d.height/45);
		g.drawString("KI     : "+ki_points,    d.width/2,d.height-d.height/45);

		//Draw Arena
		g.drawRect(d.width/5-d.width/36,(int) (d.height/22.5),d.width/3+d.width/3,d.height/3+d.height/3+max_y+d.height/18);
		
		//Draw Enemys
		g.fillRect(d.width/5,player_height,d.width/72,d.height/5);
		g.fillRect(d.width-d.width/5,ball_y-50,d.width/72,d.height/5);
		
		//Draw Ball
		g.setColor(Color.white);
		g.fillOval(ball_x,ball_y,ball_radius,ball_radius);
	}

	public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);

		Thread t = new Thread(p); 
		t.start();
	}

	@Override
	public void run() 
	{	
		try 
		{
			Thread.sleep(2000);
		}
		catch (InterruptedException e1) 
		{
			e1.printStackTrace();
		}
		while(true)
		{		
		if(left)
		{
			ball_x=ball_x+(move/2);
			if((ball_x>=d.width-d.width/5-20))
			{				
				righ = true;
				left = false;
			}
		}
		if(righ)
		{
			ball_x=ball_x-(move/2);
			if(ball_x<=d.width/5+20)
			{				
				left = true;
				righ = false;		
			}
		}
		
		if(up)
		{
			ball_y=ball_y-(move/2);
			if(ball_y<=(int) (d.height/22.5))
			{
				up = false;
				down = true;
			}
		}
		if(down)
		{
			ball_y=ball_y+(move/2);
			if(ball_y>=(int) (d.height/22.5)+(d.height/3+d.height/3+max_y+d.height/18))
			{
				down = false;
				up = true;
			}
		}
		try
		{
			Thread.sleep(10);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		invalidate();
		repaint();	
		
		lost();
		}
	}
	
	public void lost()
	{
		ki_points++;
		Toolkit.getDefaultToolkit().beep();
	}
	
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			if(count_move>=-max_y)
			{
				player_height=player_height-move;
				count_move--;
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			if(count_move<=max_y)
			{
				player_height=player_height+move;
				count_move++;
			}
		}
		invalidate();
		repaint();
	}
	public void keyReleased(KeyEvent arg0) 
	{		
	}
	public void keyTyped(KeyEvent arg0)
	{		
	}
}
```


----------



## Landei (11. Aug 2009)

Links/rechts und unten/oben repräsentiert man jeweils am besten mit einer Variablen xRichtung bzw. yRichtung, die -1 oder 1 ist. 

Dann kann man eine Bewegung ganz einfach ohne Fallunterscheidung mit 
neueXPosition = alteXPosition + schrittweite * xRichtung; 
berechnen und das Abprallen ist einfach 
if (abprallenInXRichtungFestgestellt()) xRichtung = -xRichtung;

Viel bequemer, als mit booleschen Variablem herumzuhantieren.


----------



## Developer_X (11. Aug 2009)

Landei hat gesagt.:


> Links/rechts und unten/oben repräsentiert man jeweils am besten mit einer Variablen xRichtung bzw. yRichtung, die -1 oder 1 ist.
> 
> Dann kann man eine Bewegung ganz einfach ohne Fallunterscheidung mit
> neueXPosition = alteXPosition + schrittweite * xRichtung;
> ...



ich finde es nun mal so bequemer, ich melde  mich wenn ich weiter gekommen bin.

Developer_X


----------



## Developer_X (11. Aug 2009)

also so weit ist es schon mal:

```
package Pong;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	//Ping Pong Attribute
		  int player_points = 0;
		  int player_height = d.height/3;
		  int ki_height     = d.height/3;

		  int ki_points     = 0;
		  
		  int ball_radius   = 20;	  
		  int ball_x        = d.height/2;
		  int ball_y        = d.height/2;
	  
		  int max_y  = 25;
		  int max_x  = 50;

		  int move = 20;
		  int count_move = 0;
		  
		  boolean left = false;
		  boolean righ = true;
		  boolean up = false;
		  boolean down = true;
		  
	public Ping()
	{
		setTitle("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
	}

	public void paint(final Graphics g)
	{
		g.setColor(Color.black);
		g.fillRect(0,0,d.width,d.height);
		
		//Draw Information
		g.setColor(Color.green);
		g.setFont(new Font("Times New Roman",3,40));
		g.drawString("Player : "+player_points,d.width/5,d.height-d.height/45);
		g.drawString("KI     : "+ki_points,    d.width/2,d.height-d.height/45);

		//Draw Arena
		g.drawRect(d.width/5-d.width/36,(int) (d.height/22.5),d.width/3+d.width/3,d.height/3+d.height/3+max_y+d.height/18);
		
		//Draw Enemys
		g.fillRect(d.width/5,player_height,d.width/72,d.height/5);
		g.drawLine(0,player_height,d.width,player_height);
		g.drawLine(0,player_height+d.height/5,d.width,player_height+d.height/5);

		g.fillRect(d.width-d.width/5,ki_height-50,d.width/72,d.height/5);
		g.drawLine(0,ki_height-50,d.width,ki_height-50);
		g.drawLine(0,ki_height-50+d.height/5,d.width,ki_height-50+d.height/5);

		//Draw Ball
		g.setColor(Color.white);
		g.fillOval(ball_x,ball_y,ball_radius,ball_radius);
		
		g.drawLine(ball_x-ball_radius/2,0,ball_x-ball_radius/2,d.height);
		g.drawLine(ball_x+ball_radius,0,ball_x+ball_radius,d.height);
		g.drawLine(0,ball_y-ball_radius/2,d.width,ball_y-ball_radius/2);
		g.drawLine(0,ball_y+ball_radius,d.width,ball_y+ball_radius);
	}

	public static void main(String[]args)
	{
		Ping p = new Ping();
		p.setVisible(true);

		Thread t = new Thread(p); 
		t.start();
	}

	@Override
	public void run() 
	{	
		try 
		{
			Thread.sleep(2000);
		}
		catch (InterruptedException e1) 
		{
			e1.printStackTrace();
		}
		while(true)
		{		
		if(left)
		{
			ball_x=ball_x+(move)/3;
			if((ball_x>=d.width-d.width/5-20))
			{				
				righ = true;
				left = false;
			}
			
			if((ball_x>=d.width-d.width/5-20)&&(ball_y<=player_height-d.width/5||ball_y>=player_height+d.width/5))
			{
				Player_lost();
			}

		}
		if(righ)
		{
			ball_x=ball_x-(move)/3;
			if(ball_x<=d.width/5+20)
			{				
				left = true;
				righ = false;		
			}
			if((ball_x>=d.width-d.width/5-20)&&(ball_y<=ki_height-d.width/5||ball_y>=ki_height+d.width/5))
			{
				KI_lost();
			}
		}
		
		if(up)
		{
			ball_y=ball_y-(move)/3;
			if(ball_y<=(int) (d.height/22.5))
			{
				up = false;
				down = true;
			}
		}
		if(down)
		{
			ball_y=ball_y+(move)/3;
			if(ball_y>=(int) (d.height/22.5)+(d.height/3+d.height/3+max_y+d.height/18))
			{
				down = false;
				up = true;
			}
		}
		try
		{
			Thread.sleep(10);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		invalidate();
		repaint();	
		Move_KI();
		}
	}
	
	public void Player_lost()
	{
		ki_points++;
		Toolkit.getDefaultToolkit().beep();
	}
	public void KI_lost()
	{
		player_points++;
		Toolkit.getDefaultToolkit().beep();
	}
	
	public void Move_KI()
	{
		if(ball_y<=ki_height)
		{
			ki_height = ki_height-move/8;
		}
		else if(ball_y>=ki_height)
		{
			ki_height = ki_height+move/8;
		}
	}
	
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			if(count_move>=-max_y)
			{
				player_height=player_height-move;
				count_move--;
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			if(count_move<=max_y)
			{
				player_height=player_height+move;
				count_move++;
			}
		}
		invalidate();
		repaint();
	}
	public void keyReleased(KeyEvent arg0) 
	{		
	}
	public void keyTyped(KeyEvent arg0)
	{		
	}
}
```
Wir ihr sicher bemerkt, zieht er euch die Punkte nicht rechtzeitig ab,
außerdem wenn ihr einmal die Punkte abgezogen bekommt, dann ewig, 

bitte kann mir einer helfen?
PS:
Ich will keine Lösung nur einen Tipp

ich bin so traurig dass ich nicht mal das hinbekomme, ich habe mir meine größte Mühe gegeben, warum klappt das immer noch nicht?


----------

