# PingPong-the Game by Developer-X



## Developer_X (11. Aug 2009)

Hi, ich habe jetzt das Ping Pong Spiel fertig.
Bitte schauts euch an, und sagt mir eure meinung,
Developer_X


----------



## diggaa1984 (11. Aug 2009)

ne Möglichkeit das Spiel zu beenden wär gut .. hab aus Verzweiflung Alt+F4 genommen.
Dann eine sinvolle Eingrenzung des Radius vom Ball vornehmen. Ich wusste nich was die Zahl bedeuten würde .. und ich denke das man schon einen gewissen Bereich wahren sollte. Wird dieser unterschritte bei der Eingabe einfach aufs Minimum setzen, analog beim Maximum. Nen 1 Pixel grosser Ball macht kein Sinn. Die Linien sind eher irritierend.

Bei der Geschwindigkeitsangabe fehlt auch eine Art Hinweis oder ne Art Vorstellung wie schnell irgendwas ist .. ich habe 4 gewählt .. was passiert bei 40? 

aso ist das 2-spieler oder Mensch vs. CPU?


----------



## Developer_X (12. Aug 2009)

diggaa1984 hat gesagt.:


> ne Möglichkeit das Spiel zu beenden wär gut .. hab aus Verzweiflung Alt+F4 genommen.
> Dann eine sinvolle Eingrenzung des Radius vom Ball vornehmen. Ich wusste nich was die Zahl bedeuten würde .. und ich denke das man schon einen gewissen Bereich wahren sollte. Wird dieser unterschritte bei der Eingabe einfach aufs Minimum setzen, analog beim Maximum. Nen 1 Pixel grosser Ball macht kein Sinn. Die Linien sind eher irritierend.
> 
> Bei der Geschwindigkeitsangabe fehlt auch eine Art Hinweis oder ne Art Vorstellung wie schnell irgendwas ist .. ich habe 4 gewählt .. was passiert bei 40?
> ...



das spiel endet mit der aufschrift "X hat gewonen."
dann nach 5 sekunden schließt sich das fenster.

hast du eigentlich schon bemerkt dass man das Spiel pausieren kann?

Ja Mensch vs KI

Aber ich finde die Linien sind nicht iritierend, ist ja halt ansichtssache.

Devloper_X

und was sagen die anderen so dazu?


----------



## ARadauer (12. Aug 2009)

Willst du jetzt Lorberen für ein Spiel das 75% aller Programmierer in der Schule schon mal geschrieben haben?


----------



## Spacerat (12. Aug 2009)

... Was bitte ist an dem "Game" fertig? Ich würde das kaum als Spiel bezeichnen, sondern eher als Übung. Und doch, die Linien sind nicht nur irritierend, sie können auch ganz schön Aua tun. Da fehlt eindeutig 'ne Epilepsie-Warnung! Und auch wenn die Linien nicht da wären, die Warnung ist afaik bei kontrastreichen Spielen mit schnell bewegten Bildern immerhin Pflicht.


----------



## experto2000 (12. Aug 2009)

Geht bei mir nicht


----------



## Developer_X (12. Aug 2009)

ich habe eine modifiziertere Version geschrieben, 
inder ihr mehr informationen bez. ges Spiel angeben müsst, viel Spaß,
Developer_X


----------



## Developer_X (12. Aug 2009)

experto2000 hat gesagt.:


> Geht bei mir nicht



entschuldige, aber weißt du wie man das startet?
Also:
1.Schritt: Extrahiere alle dateien im zip
2.Schritt: Wenn du die Umgebunsvariablen gesetzt hast, 
dann gehe mit der eingabeaufforderung in den ordner ( mit cd und so)
3.Schritt: starte die klassdatei Ping.class mit der eingabe:
java Ping.class


so viel dazu developer_X


----------



## Opnox (12. Aug 2009)

Also das Spiel ist ja ziemlich unspielbar.

Die "KI" bewegt sich zu langsam und die Kollisionsabfragen funktionieren nicht richtig. Selbst wenn der Ball direkt an meinen Schläger kommt und abprallt, bekommt der Gegner häufig Punkte dafür. Ich bekomm hingegen manchmal keine Punkte, obwohl ich Punkte bekommen sollte.

Dann hat der Ball ein größeres Spielfeld indem er sich befinden kann, als der Schläger. Wenn der Ball ganz unten ist, komm ich mit dem Schläger ums verrecken nicht hin. Aber zum Glück gibts dafür auch keine Punkte...

Je nach Spielgeschwindigkeit macht die KI entweder nichts oder bewegt sich einfach leicht hoch und runter, ohne wirklich erkennbarem System.

Die Linien halte ich für extrem störend.

Edit:
Auch das Spielfeld ist immer verschieden groß und je nach Werten kann ich meinen Schläger sogar aus dem Bildschirm hinausbewegen.


----------



## SlaterB (12. Aug 2009)

wenn überhaupt, dann
java Ping
statt
java Ping.class


----------



## Schandro (12. Aug 2009)

> 1.Schritt: Extrahiere alle dateien im zip
> 2.Schritt: Wenn du die Umgebunsvariablen gesetzt hast,
> dann gehe mit der eingabeaufforderung in den ordner ( mit cd und so)
> 3.Schritt: starte die klassdatei Ping.class mit der eingabe:
> java Ping.class


Hast du keine .jar gemacht? :autsch:

Was für ne IDE/Editor benutzt du eigentlich?


----------



## Noctarius (12. Aug 2009)

Angeblich Eclipse


----------



## Developer_X (12. Aug 2009)

Opnox hat gesagt.:


> Also das Spiel ist ja ziemlich unspielbar.
> 
> Die "KI" bewegt sich zu langsam und die Kollisionsabfragen funktionieren nicht richtig. Selbst wenn der Ball direkt an meinen Schläger kommt und abprallt, bekommt der Gegner häufig Punkte dafür. Ich bekomm hingegen manchmal keine Punkte, obwohl ich Punkte bekommen sollte.
> 
> ...




teste die neuere Version, die ist im zweiten Anhang hier


----------



## Opnox (12. Aug 2009)

Developer_X hat gesagt.:


> teste die neuere Version, die ist im zweiten Anhang hier


Die ist genauso verbugged.
Warum bekommt man Punkte, wenn der Ball an den Schläger kommt? Normal macht man Punkte, wenn der Gegner eben NICHT hinkommt. Oder kennst du Ping Pong anders als ich es kenne?


----------



## Developer_X (12. Aug 2009)

ist grad noch in arbeit.


----------



## experto2000 (12. Aug 2009)

Developer_X hat gesagt.:


> entschuldige, aber weißt du wie man das startet?
> Also:
> 1.Schritt: Extrahiere alle dateien im zip
> 2.Schritt: Wenn du die Umgebunsvariablen gesetzt hast,
> ...


Ja weiß ich aber geht immer noch nicht Fehler:

```
Exception in thread "main" java.lang.NoClassDefFoundError: Ping (wrong name: Pong/Ping)
        at java.lang.ClassLoader.defineClass1(Native Method)                           
        at java.lang.ClassLoader.defineClass(ClassLoader.java:637)                     
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)     
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)                
        at java.net.URLClassLoader.access$000(URLClassLoader.java:73)                  
        at java.net.URLClassLoader$1.run(URLClassLoader.java:212)                      
        at java.security.AccessController.doPrivileged(Native Method)                  
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
Could not find the main class: Ping. Program will exit.
```


----------



## Developer_X (12. Aug 2009)

experto2000 hat gesagt.:


> Ja weiß ich aber geht immer noch nicht Fehler:
> 
> ```
> Exception in thread "main" java.lang.NoClassDefFoundError: Ping (wrong name: Pong/Ping)
> ...




hey, warst du mit der cmd auch in dem ordner und allem drumund dran, ?
dann kann ich mris auch nicht erklären, bei den anderen hats funktioniert,
ich geb dir folgenden tipp:
geh in den ordner source
und tiefen, bis zur klasse "Ping.java"
die kompilirst du dann mit
javac Ping.java
und starte sie dann mit
java Ping

Developer-X


----------



## experto2000 (12. Aug 2009)

Developer_X hat gesagt.:


> hey, warst du mit der cmd auch in dem ordner und allem drumund dran, ?
> dann kann ich mris auch nicht erklären, bei den anderen hats funktioniert,
> ich geb dir folgenden tipp:
> geh in den ordner source
> ...



mach ich doch
Vllt. haben die nicht Version 1.6.0


----------



## Zipp (12. Aug 2009)

Das liegt daran, dass er die Datei Ping im Package Pong nicht findet.
Alternativ kannst du die erste Zeile "package Pong;" aus der Datei Ping.java löschen. Dann kompilieren und starten.


----------



## Opnox (12. Aug 2009)

experto2000 hat gesagt.:


> Vllt. haben die nicht Version 1.6.0


Doch.


----------



## Developer_X (12. Aug 2009)

Zipp hat gesagt.:


> Das liegt daran, dass er die Datei Ping im Package Pong nicht findet.
> Alternativ kannst du die erste Zeile "package Pong;" aus der Datei Ping.java löschen. Dann kompilieren und starten.



genau, versuch das mal


----------



## Opnox (12. Aug 2009)

Zipp hat gesagt.:


> Das liegt daran, dass er die Datei Ping im Package Pong nicht findet.
> Alternativ kannst du die erste Zeile "package Pong;" aus der Datei Ping.java löschen. Dann kompilieren und starten.


Oder man geht in das bin Verzeichnis und startet über:
java Pong/Ping


----------



## experto2000 (12. Aug 2009)

Hallo,

Ich komme bei:
To continue enter 'ENTER'                                     
!Attention!: To break the Game, press Space
nicht mehr weiter


----------



## Developer_X (12. Aug 2009)

du musst irgendetwas eingeben und enter drücken


----------



## experto2000 (12. Aug 2009)

ok geht


----------



## Developer_X (12. Aug 2009)

hey, ich habe das spiel weiter modifiziert, mit der kollisions erkennung, hier:

das einzige restliche Problem :
der KI kriegt ganz selten bis nie einen Punkt, das werde ich noch beheben,


----------



## Developer_X (12. Aug 2009)

ich kriege die letzt kleine lösung nicht hin, das Problem liegt hier:

```
if(left)
		{
			ball_x=ball_x+(move)/3;

			if((ball_x>=d.width-d.width/5-20)&&(ball_y<=player_height&&ball_y>=player_height+(d.height/5))==false)
			{
				Player_lost();
			}
			
			if((ball_x>=d.width-d.width/5-20))
			{				
				righ = true;
				left = false;
			}	
		}
```
oder genauer hier:

```
if((ball_x>=d.width-d.width/5-20)&&(ball_y<=player_height&&ball_y>=player_height+(d.height/5))==false)
			{
				Player_lost();
			}
```
kann mir einer helfen sie zu korrigieren??
Nur Tipps, vorerst bitte.

Danke für eure Hilfe Developer_X


----------



## Developer_X (12. Aug 2009)

hat denn keiner zumindest eine Idee?


----------



## mr-gurke (12. Aug 2009)

Benutze doch mal ein paar Leerzeichen und bau ein paar Zeilenumbrüche ein.
Oft hilft es auch mehrere If Bedinungen zu schachteln um das Ganze übersichtlicher zu halten.
Wenn du dann deine Variablen, wie in Java üblich, nicht mit Unterstrichen benennst, sondern ballX, playerHeight schreibst, wird das Ganze viel übersichtlicher.
Aber das scheint dir ja zu einfach zu sein, ich bin ja nicht der Erste, der dir das sagt.


```
if((ballX >= d.width - d.width / 5-20)){
   if(!(ballY<= playerHeight && ballY >= playerHeight + (d.height/5)))
      {
         PlayerLost();
      }
}
```
Wo genau dein Fehler liegt keine Ahnung, aber
schau mal Zeile 1 an: Java beherrscht Punkt vor Strich, es wird also gerechnet:
d.width / 5
davon wird 20 abgezogen
das wird von d.width abgezogen
Willst du das so?

Den Vergleich auf == false, den du drin hattest kannst du dir auch sparen, ! ist ein Operator, der eine Bedingung verneint.

```
if(devXsollteMehrAPILesen == false)
```
ist das selbe wie:

```
if(!devXSollteMehrAPILesen)
```
nur dass das 2. besser lesbar ist.


----------



## SlaterB (12. Aug 2009)

if(!devXSollteMehrAPILesen)
?

devXSollteMehrAPILesen!


----------



## Developer_X (12. Aug 2009)

SlaterB hat gesagt.:


> if(!devXSollteMehrAPILesen)
> ?
> 
> devXSollteMehrAPILesen!



lol!
ok
:rtfm:


----------



## Developer_X (12. Aug 2009)

mr-gurke hat gesagt.:


> Benutze doch mal ein paar Leerzeichen und bau ein paar Zeilenumbrüche ein.
> Oft hilft es auch mehrere If Bedinungen zu schachteln um das Ganze übersichtlicher zu halten.
> Wenn du dann deine Variablen, wie in Java üblich, nicht mit Unterstrichen benennst, sondern ballX, playerHeight schreibst, wird das Ganze viel übersichtlicher.
> Aber das scheint dir ja zu einfach zu sein, ich bin ja nicht der Erste, der dir das sagt.
> ...



danke, ich probiers mal so, und ja das wollte ich so rechnen, danke ich meld mich später noch mal, Devleoper-X


----------



## mr-gurke (12. Aug 2009)

Stimmt, in diesem Fall macht das ! hinten dran mehr Sinn, vermutlich würde der Complier von DevX das inzwischen auch nicht mehr anmäkeln


----------



## Developer_X (12. Aug 2009)

also schaut mal alle her, hier noch mal der knackpunkt mit seinem unter ihm liegenden, funktionierenden Nachbarn:

```
if(left)
		{
			ball_x=ball_x+(move)/3;
			
			if((ball_x>=d.width-d.width/5-20))
			{				
				if(ball_y>=player_height&&ball_y<=player_height+(d.height/5))
				{
					Player_lost();
				}
				
				righ = true;
				left = false;
			}	
		}
		if(righ)
		{
			ball_x=ball_x-(move)/3;

			if(ball_x<=d.width/5+20)
			{				
				if(ball_y>=ki_height&&ball_y<=ki_height+(d.height/5))
				{
					KI_lost();
				}
				
				left = true;
				righ = false;		
			}
		}
```

Seht ihr?
oben und unten sind genau gleich es geht nur einmal um die höhe des KIs und einmal um die höhe des Players, ich sehe keinen erkenntlichen grund, was hierdran falsch läuft, trotzdem klappt es nicht, wieso?

Es geht darum:

man hat ja den balken der wird so gemalt:


```
ki_height/player_height
|
|
|
|
" " / " " + d.height/5
```

ich frage also folgendes ab:

```
ball_y>=ki_height&&ball_y<=ki_height+(d.height/5)
```

wenn die *Y_Position *des balles größer ist als die *Y_Position * des KI_s aber kleiner als die des KI_endpunktes
dann soll KI_verlieren, 
funktioniert auch beim KI

aber beim player nicht, warum?


Developer_X


----------



## Developer_X (12. Aug 2009)

okay also:

```
if(ball_y<=player_height&&ball_y>=player_height+(d.height/5))
```

würde niemals eintreffen.
Warum?:
Weil : der der Ball gleichzeitig über und unter dem Balken liegen müsste.


Ich hatte mal in der ganzen Zeit verschiedene Sachen ausprobiert, hat aber nie geklappt:

```
if(ball_y<=player_height||ball_y>=player_height+(d.height/5))
```

Da ist es nicht mehr *und * sondern *oder*.
Warum habe ich das gemacht: ganz einfach weil ein ball ja, wenn er unter dem balken ist, oder über dem balken niemals auf dem balken sein kann, die Technik wandte ich auch beim KI an.

Mal wieder wurden nur mir Punkte zugewiesen, wenn der KI Fehler machte, aber wenn ich Fehler machte, wurden dem KI nie Punkte gegebn.

Also, ich stehe am selben punkt wie über diesem Thread.

Ich weiß nicht mehr weiter, das ergibt alles keinen Sinn, kann mir bitte einer helfen?

Developer_X


----------



## Noctarius (12. Aug 2009)

Wie wäre es an dieser Stelle abzubrechen und erstmal bei den Grundlagen weiterzumachen. Immerhin siehst du ja selbst, dass dir grad die Grundlagen fehlen.


----------



## diggaa1984 (12. Aug 2009)

wenn du schonmal dabei bist divese Fehler zu sucen und dergleichen würde ich dir gleich empfehlen konstrukte wie:

```
d.width-d.width/5-20
```

welche ständig in den Bedingungen auftauchen vorher einmal zu berechnen, ich nehme stark an das sich d über die zeit nie ändert, das heisst einmal berechnen sobald d feststeht und dann nur auf den berechneten wert verweisen. Klar ist das der CPU scheinbar egal, weil schnell genug, dennoch sollte man sowas immer berücksichtigen, spart massig CPU-Arbeit ein, die bei komplexen programmen mal schnell zu viel sein könnte!


----------



## Developer_X (12. Aug 2009)

diggaa1984 hat gesagt.:


> wenn du schonmal dabei bist divese Fehler zu sucen und dergleichen würde ich dir gleich empfehlen konstrukte wie:
> 
> ```
> d.width-d.width/5-20
> ...



okay werd ich ändern, aber was ist jetzt mit dem problem, was ist da falsch, ich sehe keinen fehler, nur beim spielen,


----------



## Der Müde Joe (12. Aug 2009)

so als kleiner ansporn...(lang ists her und nie über Alpha gekommen)
(unter 100KB gekürzt und Du kannst nicht gewinnen!)

EDIT:
grad rausgefunden..mit recht links kann man ans Netz angreifen


----------



## Developer_X (12. Aug 2009)

hey ich hab die lösung auch allein bekommen, hier der Code:

```
package Pong;

import java.awt.*;
import java.awt.event.*;
import java.util.Scanner;

import javax.swing.*;

@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
	//Attribute
		//Dimension
		  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		  
	//Ping Pong Attribute
		  //Player
		  int player_points = 0;
		  int player_height = d.height/3;
		 
		  //KI
		  int ki_height     = d.height/3;
		  int ki_points     = 0;
		  static int ki_goodness = 0;
		 
		  //Ball
		  static int ball_radius   = 20;	  
		  int ball_x        = d.height/2;
		  int ball_y        = d.height/2;	  
		  
		  //max
		  static int max_y  = 50;
		  static int max_points = 20;
		 
		  //move
		  static int move = 10;
		  int count_move = 0;
		 
		  //info
		  String infoString = "";	 
		  
		  //player
		  static String player = "";
		
		  //boolean
		  boolean left = false;
		  boolean righ = true;
		  boolean up = false;
		  boolean down = true;
		  boolean able = true;
		  static boolean lines = false;

		  //thread
		  Thread thread;
		  
	//Constructor	  
	public Ping()
	{
		super("Ping Pong");
		setUndecorated(true);
		setSize(d);
		addKeyListener(this);
	
		thread = new Thread(this);
		thread.start();
		
		JPanel mainpanel = new JPanel()
		{
		public void paintComponent(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+"/"+max_points,d.width/5,d.height-d.height/45);
			g.drawString("KI     : "+ki_points+"/"+max_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.fillRoundRect(d.width/5,player_height,d.width/72,d.height/5,90,90);
			
			g.fillRoundRect(d.width-d.width/5,ki_height-50,d.width/72,d.height/5,90,90);

			if(lines)
			{
			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.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);
			
			if(lines)
			{
			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);
			}
			
			g.drawString(infoString,d.width/5,d.height/2);
		}
		};
		setLayout(null);
		mainpanel.setBounds(0,0,d.width,d.height);
		add(mainpanel);
		
		setVisible(true);
	}

	//Implemented Methods	
	//KeyListener
	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++;
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_SPACE)
		{
			if(able)
			{
				able = false;
				infoString = "Please Press Space to continue.";
			}
			else
			{
				able = true;
				infoString = "";
			}
		}
		invalidate();
		repaint();
	}
	public void keyReleased(KeyEvent arg0) 
	{		
	}
	public void keyTyped(KeyEvent arg0)
	{		
	}
	
	//Runnable	
	@Override
	public void run() 
	{	
		try 
		{
			Thread.sleep(2000);
		}
		catch (InterruptedException e1) 
		{
			e1.printStackTrace();
		}
		while(true)
		{	
		if(able)
		{
		if(player_points==max_points)
		{
			infoString = player+" hat das Spiel gewonnen.";
			able = false;
			try 
			{
				Thread.sleep(3000);
			}
			catch (InterruptedException e1) 
			{
				e1.printStackTrace();
			}
			setVisible(false);
			System.exit(0);
		}
		if(ki_points==max_points)
		{
			infoString = "KI hat das Spiel gewonnen.";
			able = false;
			try 
			{
				Thread.sleep(3000);
			}
			catch (InterruptedException e1) 
			{
				e1.printStackTrace();
			}
			setVisible(false);
			System.exit(0);
		}
		if(left)
		{
			ball_x=ball_x+(move)/3;
			
			if((ball_x>=d.width-d.width/5-20)&&(ball_y>=player_height&&ball_y<=player_height+(d.height/5)))
			{		
				righ = true;
				left = false;
			}
			
			if(ball_x>=d.width)
			{
				KI_lost();				
				righ = true;
				left = false;
			}
			
		}
		if(righ)
		{
			ball_x=ball_x-(move)/3;

			if(ball_x<=d.width/5+20&&(ball_y>=ki_height&&ball_y<=ki_height+(d.height/5)))
			{				
				left = true;
				righ = false;	
			}
			
			if(ball_x<=0)
			{				
				Player_lost();
				left = true;
				righ = false;	
			}
		}
		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();
		}
		else
		{
		}
		}
	}
	
	//Methods	
	//lost Methods
	
	@SuppressWarnings("static-access")
	public void Player_lost()
	{
		ki_points++;		
		Toolkit.getDefaultToolkit().beep();	
		
		ball_x = d.width/2;
		try 
		{
			thread.sleep(2000);
		} 
		catch (InterruptedException e) 
		{
			e.printStackTrace();
		}
	}
	@SuppressWarnings("static-access")
	public void KI_lost()
	{
		player_points++;	
		Toolkit.getDefaultToolkit().beep();	
	
		ball_x = d.width/2;
		try 
		{
			thread.sleep(2000);
		} 
		catch (InterruptedException e) 
		{
			e.printStackTrace();
		}
	}
	
	//move Method
	public void Move_KI()
	{
		if(ball_y<=ki_height)
		{
			ki_height = ki_height-move/ki_goodness;
		}
		else if(ball_y>=ki_height)
		{
			ki_height = ki_height+move/ki_goodness;
		}
	}
	
	//start Method
	public static void start()
	{
		Scanner sc = new Scanner(System.in);
		// First Step
			System.out.println("Ping Pong");
			System.out.println(" Please Enter your name : ");
			player = sc.next();
		// Second Step	
			do
			{
				System.out.println(" Please Enter Radius of ball : ");
				sc = new Scanner(System.in);
			}
			while(!sc.hasNextInt());
			ball_radius = sc.nextInt();
		// Third Step
			do
			{
				System.out.println(" Please Enter Speed of the game : ");
				sc = new Scanner(System.in);
			}
			while(!sc.hasNextInt());
			move = sc.nextInt();
			max_y = move*5;
		// Fourth Step
			do
			{
				System.out.println(" Please Enter Max. Point of the game : ");
				sc = new Scanner(System.in);
			}
			while(!sc.hasNextInt());
			max_points = sc.nextInt();
		// Fourth Step
			do
			{
				System.out.println(" Please Enter the KI_Hardness (scala 1 is best) : ");
				sc = new Scanner(System.in);
			}
			while(!sc.hasNextInt());
			ki_goodness = sc.nextInt();
		// Fourth Step
			do
			{
				System.out.println(" Please Enter 'true' for stripes or 'false' against stripes : ");
				sc = new Scanner(System.in);
			}
			while(!sc.hasNextBoolean());
			lines = sc.nextBoolean();
		// Last Step
			System.out.println("To continue enter 'ENTER'");
			System.out.println("!Attention!: To break the Game, press Space");
			
			sc.next();
		//Fifth Step
			Ping p = new Ping();
			p.setVisible(true);
	}

	//main
	public static void main(String[]args)
	{
		start();
	}

}
```


----------



## Developer_X (12. Aug 2009)

Der Müde Joe hat gesagt.:


> so als kleiner ansporn...(lang ists her und nie über Alpha gekommen)
> (unter 100KB gekürzt und *Du kannst nicht gewinnen*!)
> 
> EDIT:
> grad rausgefunden..mit recht links kann man ans Netz angreifen



heye Joe du musst mal überlegen, will der SPieler einen unbesiegbaren KI oder will er einen KI dessen schwierigkeits grad er einstellen kann?
das zweite will er bestimmt mehr, und das habe ich auch ohne Hilfe, 
trotzdem danke für eure Beihilfen, und den Tipps,

Developer_X

PS: 
YES! ich habs endlich geschafft ein PingPong Spiel zu programmiern-


----------



## Der Müde Joe (12. Aug 2009)

wohl nie auf C64 gespielt :bae:


----------



## Spacerat (12. Aug 2009)

@Der müde Joe: ... na da bin ich ja mal auf 'ne reaktion gespannt. Glaub' kaum das DX den noch kennt.


----------



## eRaaaa (12. Aug 2009)

also ich finde ja deine menüführung geil =) ich musste das spiel ca. 3-4 mal neustarten bis ich einstellungen gefunden habe, die einigemraßen spielbar sind  (solltest mal min, max-werte vereinbaren und diese vllt dme user anzeigen ^^)

und wieso MUSS ich wenn da steht: to continue ENTER vorher noch was anderes eingeben? 
hat mich auch verwirrt, hätte ich direkt danach nicht hier im forum gelesne dass ich vorher noch nen anderes zeichen eintippsern muss, hätte ich direkt eclipse wieder geschloßen


----------



## Developer_X (13. Aug 2009)

eRaaaa hat gesagt.:


> also ich finde ja deine menüführung geil =) ich musste das spiel ca. 3-4 mal neustarten bis ich einstellungen gefunden habe, die einigemraßen spielbar sind  (solltest mal min, max-werte vereinbaren und diese vllt dme user anzeigen ^^)
> 
> und wieso MUSS ich wenn da steht: to continue ENTER vorher noch was anderes eingeben?
> hat mich auch verwirrt, hätte ich direkt danach nicht hier im forum gelesne dass ich vorher noch nen anderes zeichen eintippsern muss, hätte ich direkt eclipse wieder geschloßen



gut, ich werde dem Benutzter dann immer die empfohlenen Max und Min Werte geben, okay,

GUI kommt auch noch rein,


----------



## andre111 (13. Aug 2009)

Naja, es stand dran

```
to continue enter ENTER
```
also man soll ENTER eingeben :autsch:


----------



## Developer_X (13. Aug 2009)

hört sich vielleicht seltsam an, aber funktioniert der KI noch bei euch, und das mit der Kollisionserkennung, gestern abend funktionierte alles perfekt,
heut morgen will ichs spielen, und die Kollisionserkennung funktioniert nicht mehr,
dann hab ich den Code den ich hier präsentierte genau angesehen, und mit meinem verglichen,

geht der bei euch noch?

Warum klappt er denn heute morgen nicht mehr bei mir?!":autsch:


----------



## Vayu (13. Aug 2009)

Developer_X hat gesagt.:


> ... gestern abend funktionierte alles perfekt, ...



wieso kann ich das nicht glauben?


----------



## Developer_X (13. Aug 2009)

Vayu hat gesagt.:


> wieso kann ich das nicht glauben?



ich verstehe es ja auch nicht, funktioniert es bei dir?


----------



## Developer_X (13. Aug 2009)

bei wem funktioniert denn die Kollisisonserkennung?
und bei wem nicht?


----------



## Developer_X (13. Aug 2009)

ich habe es, ich habe die Lösung, jetzt funktioniert das Spiel einwandfrei

Sie ist im Anhang als Jar Datei erhältlich

Sagt mir jetzt eure meinung dazu, Developer_X


----------



## max40 (13. Aug 2009)

JSpinner kan man min und max werte setzten und ein Name ist nicht so lang das man den halben Bildschirm für das Eingabefeld braucht!

EDIT: das du mit dem Spiel zufrieden sein kannst?! Da funktioniert ja fast gar nichts! Also da hast du noch etwas Arbeit vor dir!


----------



## Opnox (13. Aug 2009)

Developer_X hat gesagt.:


> ich habe es, ich habe die Lösung, jetzt funktioniert das Spiel einwandfrei


Also als einwandfrei würde ich das nicht bezeichnen. Es hat immer noch einen haufen Bugs.


----------



## Developer_X (13. Aug 2009)

nennt sie mir bitte, damit ich sie korrigieren kann.


----------



## Opnox (13. Aug 2009)

Schläger kann aus dem Feld bewegt werden.

Ball fliegt halb in den Schläger rein.

Ball prallt immer absolut gleich ab, egal wo er auftritt und mit welcher Bewegung meines Schlägers. Macht das Spiel sehr langweilig, wenn der Ball immer auf die selbe Art hin und herfliegt.

Ball fliegt desöfteren hinter den KI gesteuerten Schläger. Man erhält allerdings keinen Punkt. Der Ball prallt an der hinteren Wand ab und fliegt durch den Schläger von hinten durch.

usw.


----------



## Vayu (13. Aug 2009)

zu de was opnox geschrieben hat kommt noch, dass der schläger sehr träge reagiert. wenn ich hoch oder runter drücke dauert 1-2 sekunden bevor er sich überhaupt bewegt ...


----------



## ice-breaker (13. Aug 2009)

all dem kann ich mich nur anschließen, von einwandfrei ist es noch Jahre weg, ziemlich geringe Erwartungen irgendwie ....

Ich würde gerne noch das Spiel beenden ohne das ich den TaskManager nutzen muss und mein Schläger war eben an dieser Position (Screenshot) partout nicht mehr dazu zu bewegen, nach oben geschoben zu werden.
Viel Spaß beim debuggen ^^

Wenn es mal so funktioniert wie vom müden joe, *dann* funktioneirt es einwandfrei


----------



## Developer_X (13. Aug 2009)

gut ich fasse dann zusammen, in einer liste, das werde ich dann bearbeiten, also modifizieren:

der Ball muss direkt am Schläger abprallen
der Schläger darf nicht aus dem Feld bewegt werden
 der Ball soll mal so, mal so vom Schläger abprallen, je nachdem wie er an den Schläger fällt

zu dem was Ice Breaker sagte:
das Spiel wird beendet, nach dem einer der beiden Spieler volle Punktzahl erreicht hat,
nebeninfo: man kann programme auch mit ALT+F4 lösen
des weiteren konntest du den schläger vielleicht nicht bewegen, weil der listener nciht aktiv war, ein klick auf das Fenster, sollte das problem beheben, 

ich melde mich dann wieder ,

Developer_X


----------



## babuschka (13. Aug 2009)

> das Spiel wird beendet, nach dem einer der beiden Spieler volle Punktzahl erreicht hat



Das klingt irgendwie nach "Du darfst so lange nicht hier raus, bis das Spiel vorbei ist" - so etwas gefällt mir nicht sonderlich...

Du solltest dem Benutzer die Möglichkeit geben, das Spiel vorher zu beenden - und das auch dann, wenn er von Tastenkombinationen wie Alt+F4 noch nie etwas gehört hat (und diese auf anderen Betriebssystemen eventuell sogar ganz anders zugewiesen sind).
Du könntest das Spiel z.B. dann beenden, wenn der Benutzer Escape drückt.



> des weiteren konntest du den schläger vielleicht nicht bewegen, weil der listener nciht aktiv war, ein klick auf das Fenster, sollte das problem beheben



Das Problem hatte ich auch. Allerdings ist es dem Benutzer wahrscheinlich egal, woran es liegt, denn auf große Fehlerbehebungen legt der Normalbenutzer eher keinen Wert 
So etwas sollte vermieden werden.

Auch wenn es in der Spieleindustrie zur Zeit ein übliches Vorgehen ist, verbuggte Software auf den Markt zu werfen, solltest Du dir lieber etwas mehr Zeit nehmen und Deine Spiele ausgiebig testen, bevor Du sie irgendwo vorstellst. Alles andere macht keinen Spaß, wie Du hier sicherlich schon feststellen konntest.


----------



## ice-breaker (13. Aug 2009)

Developer_X hat gesagt.:


> des weiteren konntest du den schläger vielleicht nicht bewegen, weil der listener nciht aktiv war, ein klick auf das Fenster, sollte das problem beheben



nein, der war aktiv, ich konnte den schläger nach unten und oben bewegen, nach oben aber nur bis zu dem einen Punkt und nicht weiter.


----------



## diggaa1984 (13. Aug 2009)

> der Ball soll mal so, mal so vom Schläger abprallen, je nachdem wie er an den Schläger fällt



ich bin mir nicht sicher aber wird es in artverwandten spielen nicht so gelöst, dass der ball abhängig von der Position auf dem Schläger den Abschusswinkel bekommt?

also ball landet genau mittig auf schläger => fliegt senkrecht zum schläger weg (90°) .. je weiter aussen am schläger desto flacher der winkel (90° +/- Abweichung .. je nachdem ob links oder rechts vom Zentrum des Schlägers)


----------



## Developer_X (13. Aug 2009)

diggaa1984 hat gesagt.:


> ich bin mir nicht sicher aber wird es in artverwandten spielen nicht so gelöst, dass der ball abhängig von der Position auf dem Schläger den Abschusswinkel bekommt?
> 
> also ball landet genau mittig auf schläger => fliegt senkrecht zum schläger weg (90°) .. je weiter aussen am schläger desto flacher der winkel (90° +/- Abweichung .. je nachdem ob links oder rechts vom Zentrum des Schlägers)



ich hab mir da was ausgedacht, was matematisch nicht korrekt ist, aber fürs auge schon,  wenn der ball am oberen oder unteren drittel des schlägers kommt
dann wird die geschwindigkeit verstärkt, dann sieht das so aus als ob 
^^


----------



## Developer_X (13. Aug 2009)

JohnMcLane hat gesagt.:


> Auch wenn es in der Spieleindustrie zur Zeit ein übliches Vorgehen ist, verbuggte Software auf den Markt zu werfen, .



Der Methode möchte ich mich gerne anschließen
nein war spaß :lol:
Ich weiß was du meinst, ich habe oft früher 60€ ausgegebn für ein Spiel
dass dann nciht funktioniert hat, obwohl mein PC dazu alles hatte, und die HotLine hat 1€ die Minute gekostet

*das sind echte Schweine*



JohnMcLane hat gesagt.:


> solltest Du dir lieber etwas mehr Zeit nehmen und Deine Spiele ausgiebig testen, bevor Du sie irgendwo vorstellst. Alles andere macht keinen Spaß, wie Du hier sicherlich schon feststellen konntest.



Ok, ich war wohl oben sehr voreilig, muss ich selber zugeben.


----------



## Illuvatar (13. Aug 2009)

diggaa1984 hat gesagt.:


> ich bin mir nicht sicher aber wird es in artverwandten spielen nicht so gelöst, dass der ball abhängig von der Position auf dem Schläger den Abschusswinkel bekommt?
> 
> also ball landet genau mittig auf schläger => fliegt senkrecht zum schläger weg (90°) .. je weiter aussen am schläger desto flacher der winkel (90° +/- Abweichung .. je nachdem ob links oder rechts vom Zentrum des Schlägers)



Als ich mal sowas geschrieben hab, war der Winkel abhängig von der Geschwindigkeit des Schlägers,


----------



## Der Müde Joe (13. Aug 2009)

>dann wird die geschwindigkeit verstärkt, dann sieht das so aus als ob 

Wohl kaum.

Das Problem, das auftritt, wenn du den Winkel nie veränderst ist wie folgt:
Nehmen wir an das Spielfeld ist ein Qudrat. Der Startwinkle beträgt 45 Grad und du startest in der Mitte des Feldes. Somit trifft er genau in der Mitte des Spilfeldes auf (oben oder unten), prallt wieder ab (45 Grad) und kommt wieder in der Mitte an (rechts), prallt nun ab (45 Grad) kommt wieder mit 45 Grad....naja den Rest kannst du dir ja denken.

Du die veränderten Grösse des Spielfeldes (rechteck) kommt es da zwar zu einer gewissen Variabilität (und wahscheinlich auch Rechenfehler), welche sich aber auf die Qulität des Spieles negativ auswirkt.

>dass der ball abhängig von der Position auf dem Schläger den Abschusswinkel bekommt?

jop...oder einfach eine gewisse Random Reflektion. (natürlich nur auf dem Schläger und nicht an den Seiten)


----------



## sparrow (13. Aug 2009)

diggaa1984 hat gesagt.:


> ich bin mir nicht sicher aber wird es in artverwandten spielen nicht so gelöst, dass der ball abhängig von der Position auf dem Schläger den Abschusswinkel bekommt?
> 
> also ball landet genau mittig auf schläger => fliegt senkrecht zum schläger weg (90°) .. je weiter aussen am schläger desto flacher der winkel (90° +/- Abweichung .. je nachdem ob links oder rechts vom Zentrum des Schlägers)



Das ist zumindest das Verhalten bei Breakout.


----------



## Developer_X (13. Aug 2009)

also ich habe jetzt die neueste Version geschrieben sie enthält folgende Features:

der Ball prallt am schläger, nicht in der mitte des schlägers ab
der Schläger kommt nicht außerhalb des Feldes
der Ball vergrößert seine geschwindigkeit, immer mehr, da, wenn der ball an die roten punkte kommt sich die geschwindigkeit erhöht, und der ball beim KI meistens auf einen Roten fleck trift >D, damit es nicht zu fieß wird, habe ich mir gedacht, wenn jemand einen Punkt gemacht hat, ist die geschwindigkeit wieder langsam, und wird im laufe immer schneller
wenn man Escape drückt sollte sich das Spiel verabschieden(System.exit(0);
es sind außerderm noch Standardwerte angegeben, sodass man, wenn man keinen "Bock" hat, das ganze einzustellen, einfach auf Accept klicken kann


es tut mir leid, wenn ich noch nicht allen modifikationen in der weiße nach gegangen bin, wie ihr sie vielleicht erhofft hattet, oder ich einige übersehen habe ( einige konnte ich leider nicht realisieren ) trotzdem hoffe ich auf weitere Tipps und vorschläge für verbesserungen von euch,

ich verdanke euch.

Developer_X


----------



## diggaa1984 (13. Aug 2009)

man und das knapp 2h nach veröfentlichung der todo-liste .. wenn ich so schnell wär würde meine studienarbeit schon fertig sein und vor features nur so wimmeln ^^


----------



## ice-breaker (13. Aug 2009)

hmm:

der Ball kann noch immer aus dem Feld
wenn der Ball aus dem Feld fliegt und wieder reinkommt, zählt das noch immer nicht als Punkt
der Schläger kann oben minimal raus
der Schläger kann unten bis zum grünen Berech des Schlägers raus
der Ball wird viel zu schnell
der Schläger bewegt sich bei weiten Strecken irgendwie sprunghaft


----------



## Developer_X (13. Aug 2009)

ice-breaker hat gesagt.:


> hmm:
> 
> der Ball kann noch immer aus dem Feld
> der Schläger bewegt sich bei weiten Strecken irgendwie sprunghaft



also ich habe alle punkte außer diesen beiden ausgebessert bzw. ausbessern können.

1. Punkt konnte ich nicht ausbessern, er soll ja außerhalb des feldes, wenn man abloost, verstehst du, 
beim tennis ist es in der realen welt doch auch so oder nicht?
wenn man den ball schlägt und der spieler den nicht trifft, gibts ja auch keine laser shields, die den ball dann noch abfangen, oder?
2. vielleicht "lagts" bei dir und wirkt deshalb sprunghaft

Developer_X


----------



## Spacerat (13. Aug 2009)

Was macht denn der Ball nun in der Mitte des Schlägers? Kleben bleiben?
Beim Original Pong wurde der Schläger im übrigen in nur 7 Bereiche eingeteilt. Und je nachdem im Welchen Bereich der Ball dort aufprallte wurde er um +/-75° (aussen), +/-45° (weiter innen), +/-25° (ausserhalb Mitte) und 0° (Mitte) zurück geworfen. Einfallswinkel = Ausfallswinkel war damals wohl noch zu kompliziert für diese alten Phillips-Konsolen mit Squash, Pelota usw...


----------



## Developer_X (13. Aug 2009)

ice-breaker hat gesagt.:


> hmm:
> 
> der Ball kann noch immer aus dem Feld
> der Schläger bewegt sich bei weiten Strecken irgendwie sprunghaft



also ich habe alle punkte außer diesen beiden ausgebessert bzw. ausbessern können.

1. Punkt konnte ich nicht ausbessern, er soll ja außerhalb des feldes, wenn man abloost, verstehst du, 
beim tennis ist es in der realen welt doch auch so oder nicht?
wenn man den ball schlägt und der spieler den nicht trifft, gibts ja auch keine laser shields, die den ball dann noch abfangen, oder?
2. vielleicht "lagts" bei dir und wirkt deshalb sprunghaft

Developer_X


----------



## TheChemist (13. Aug 2009)

hab mal die letzt Version gestartet...

-Der Ball kommt immer noch aus dem Feld und prallt manchmal am Bildschirmrand ab
-Man kann den Schläger unten aus dem Feld bewegen
-Der "KI-Schläger" bewegt sich oben und unten aus dem Spielfeld
-Die Steuerung reagiert unglaublich spät und "hakelig"


----------



## Der Müde Joe (13. Aug 2009)

>2. vielleicht "lagts" bei dir und wirkt deshalb sprunghaft

Mein C2D läuft heiss...brauch wohl ne Gamer Maschine.

Der Ball reflektiert unten links ausserhalb des Spielfeldes (Bonus wenn man den Ball nicht erreicht)


----------



## Developer_X (13. Aug 2009)

TheChemist hat gesagt.:


> hab mal die letzt Version gestartet...
> 
> -Der Ball kommt immer noch aus dem Feld und prallt manchmal am Bildschirmrand ab
> 
> ...


----------



## Developer_X (13. Aug 2009)

okay hier ist modifizierteste Modifikation bis jetzt.


----------



## TheChemist (13. Aug 2009)

Developer_X hat gesagt.:


> ... modifizierteste Modifikation ...


 haha 

Und was hat sich jetzt geändert? Habe die selben Fehler immer noch, das einzige was mir aufgefallen ist, ist dass der Schläger nicht mehr oben das Feld verlässt, sondern nur noch unten...
Und dass der Ball jetzt manchmal durch den Schläger durchfliegen kann...


----------



## Developer_X (13. Aug 2009)

machst du bitte ein foto davon, wie genau der Schläger "unten " raus kann.


----------



## TheChemist (13. Aug 2009)

Hier bitte, beide Schäger hängen unten raus.


----------



## Developer_X (13. Aug 2009)

aber warum?
alle rechnungen beruhen auf die größe des Bildschirmes:
tut mir leid, aber ich habe keine ahnung wie ich dieses Problem lösen soll, verräts du mir bitte mal deine bildschirmauflösung, ich werde mein fenster dementsprechend verändern und will sehen ob das immer noch so ist, Developer_X


----------



## diggaa1984 (13. Aug 2009)

zeig doch mal den teil wo er prüft wo sich der schläger befindet


----------



## Developer_X (13. Aug 2009)

da gibt es 2 stellen, einmal für den KI und einmal für den Player:

```
//KeyListener
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			if(player_height>=(int) (d.height/22.5)+d.height/90)
			{
				player_height=player_height-move;
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			if(player_height+d.height/5<=d.height-(int) (d.height/22.5)*3)
			{
				player_height=player_height+move;
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_SPACE)
		{
			if(able)
			{
				able = false;
				infoString = "Please Press Space to continue.";
			}
			else
			{
				able = true;
				infoString = "";
			}
		}
		if(arg0.getKeyCode()==KeyEvent.VK_ESCAPE)
		{
			System.exit(0);
		}
		invalidate();
		repaint();
	}
```


```
//move Method
	public void Move_KI()
	{
		if(ball_y<=ki_height)
		{
			if(ki_height>=(int) (d.height/22.5)+d.height/18)
			{
				ki_height = ki_height-move/ki_goodness;
			}
		}
		else if(ball_y>=ki_height)
		{
			if(ki_height+d.height/5<=d.height-(int) (d.height/22.5)*2 +d.height/60)
			{
				ki_height = ki_height+move/ki_goodness;
			}
		}
	}
```

Hier bitte schön


----------



## sparrow (13. Aug 2009)

Das mit dem schneller werdenden Ball finde ich nicht gut. Dadurch wird jeder 3. Ball unhaltbar, denn:

der Balken lässt sich viel zu langsam bewegen. Außerdem hüpft er nur einmal und kommt erst eine Sekunde später auf touren.

Bei mir hängen die Balken ebenfalls unten heraus. Außerdem ist das Ergebnis nicht zu lesen.

Der Ball prallt hinter dem Spieler von der Wand (Bildschirmrand) ab wenn sich der Spieler auf der gleichen Höhe befindet.

Ab einer bestimmten Geschwindigkeit des Balls durchschlägt er einfach den Balken des Computers.


----------



## Developer_X (13. Aug 2009)

sparrow hat gesagt.:


> Das mit dem schneller werdenden Ball finde ich nicht gut. Dadurch wird jeder 3. Ball unhaltbar, denn:
> 
> der Balken lässt sich viel zu langsam bewegen. Außerdem hüpft er nur einmal und kommt erst eine Sekunde später auf touren.
> 
> ...




du hast recht
aber wie soll ich das denn ändern, ich geb euch hier mal den Code.

Ich verstehe aber wirklích nicht was ich falsch mache, das macht mich in gewisser masen auch etwas wütend, wütend darauf, dass ich das nicht kann.


----------



## diggaa1984 (13. Aug 2009)

```
d.height/22.5)+d.height/90
```

für was sind diese zahlen? d ist die komplette Größe deines Spielfeldes oder?!


----------



## TheChemist (13. Aug 2009)

Naja die ganzen Berechnungen anhand der Bildschirmgröße zu machen ist schonmal der falsche Ansatz. Besser wäre es eine Klasse Feld zu schreiben, die ihre Größe kennt und mit Hilfe dieser Angaben werden die Berechnungen durchgeführt. So kannst du dann später eventuell sogar noch die Größe des Feldes variabel gestalten, um etwas pepp reinzubringen. Allerdings erst wenn der Rest richtig funktioniert^^


----------



## Developer_X (13. Aug 2009)

diggaa1984 hat gesagt.:


> ```
> d.height/22.5)+d.height/90
> ```
> 
> für was sind diese zahlen? d ist die komplette Größe deines Spielfeldes oder?!



nein, es ist die größe des Fensters, die Spielfeld größe ist anders


----------



## sparrow (13. Aug 2009)

Wie wärs mit einer Version des Spiels das mal die Werte einiger Variablen ausgibt damit man sieht was eigentlich wo drin steht?


----------



## diggaa1984 (13. Aug 2009)

welche du mit den brüchen errechnest?  ich empfehle dir auch dazu lieber eine Spielfeldklasse zu bauen .. das sollte nich so schwer sein das nachträglich reinzubaun, dann kann man damit vieleicht auch leichter fehler finden .. und wie schon gesagt .. diese statischen ergebnisse lieber nur 1x berechnen

einfach mal drüber grübel was du alles an teilelementen im spiel hast:

 - 1 Spielfeld
 - 2 Spieler
 - Objekte zum Spielen (Schläger und Ball) .. würde ich auch je eine Klasse machen
 - nen Rahmen wo alles rein soll
 - und irgendwo gibts ne logik die die Einhaltung von Regeln überwacht oder sonst was

wäre mein erster grober ansatz .. und gäbe summa sumarum 5 und mehr klassen .. das mit den Spielern lässt sich ja auf versch. Arten lösen

Jede Klasse macht und kennt nur das wofür sie gedacht is, dem Spielfeld isses egal wer auf ihm spielt und mit was ..  und so hast immer nen Überblick wo welche Probleme herrühren könnten. In deinem Fall wäre diese Umstrukturierung gleich dem Neuanfang des Spiels, aber vielleicht probierst es mal.


----------



## TheChemist (13. Aug 2009)

Generell wäre es zu empfehlen ein paar mehr Klassen zu schreiben. Ich hab mal in deinen Sourcecode geschaut, da seh ich nur eine Klasse. Wenn du zb eine Spielfeldklasse, eine Ballklasse und vielleicht noch eine Spielerklasse bastelst kannst du erstens das umsetzen was du in deinem anderen Thread gelernt hast(oder dabei bist zu lernen) und zweitens für deutlich mehr Übersichtlichkeit sorgen.


----------



## diggaa1984 (13. Aug 2009)

TheChemist hat gesagt.:


> Generell wäre es zu empfehlen ein paar mehr Klassen zu schreiben. Ich hab mal in deinen Sourcecode geschaut, da seh ich nur eine Klasse. Wenn du zb eine Spielfeldklasse, eine Ballklasse und vielleicht noch eine Spielerklasse bastelst kannst du erstens das umsetzen was du in deinem anderen Thread gelernt hast(oder dabei bist zu lernen) und zweitens für deutlich mehr Übersichtlichkeit sorgen.



high 5 :lol:


----------



## Spacerat (13. Aug 2009)

TheChemist hat gesagt.:


> Generell wäre es zu empfehlen ein paar mehr Klassen zu schreiben. Ich hab mal in deinen Sourcecode geschaut, da seh ich nur eine Klasse. Wenn du zb eine Spielfeldklasse, eine Ballklasse und vielleicht noch eine Spielerklasse bastelst kannst du erstens das umsetzen was du in deinem anderen Thread gelernt hast(oder dabei bist zu lernen) und zweitens für deutlich mehr Übersichtlichkeit sorgen.


Klassenstruktur für Pong? Ist das nicht ein bissl' überzogen? Immerhin lässt sich so etwas ja in den simpelsten Scriptsprachen mit Steuercodes usw. realisieren. Aber Gut. Selbst wenn jede der oben genannten Klassen nur eine einzige Methode haben würde wäre es im jeden Fall 'ne Übung für DX.


----------



## diggaa1984 (13. Aug 2009)

> Klassenstruktur für Pong?


ich würde das aus prinzip schon machen  Pong is dafür allemal komplex genug


----------



## Developer_X (14. Aug 2009)

The Chemist, hängen die nur ein bisschen raus, oder kann man wirklich den schläger ganz weg?

Naja, ich hab hier einen "Bubblegum" Mode eingebaut, wie ich ihn nenne, ^^,
da gibt es zwei schnüre jeweil von einem schläger zum anderen, dann wird da wenn der ball hinterden schläger kommt, aber derball sich auf der höhe des schlägers befindet, wieder zurück gezogen durch die "Bubblegums".

Viel Spaß,
Developer_X


----------



## sparrow (14. Aug 2009)

Developer_X hat gesagt.:


> Naja, ich hab hier einen "Bubblegum" Mode eingebaut, wie ich ihn nenne, ^^,
> da gibt es zwei schnüre jeweil von einem schläger zum anderen, dann wird da wenn der ball hinterden schläger kommt, aber derball sich auf der höhe des schlägers befindet, wieder zurück gezogen durch die "Bubblegums"



Verwirrend... ist der Sinn des Spiels nicht eigentlich, dass der Gegner einen Punkt bekommt wenn der Ball erstmal am Schläger vorbei ist?


----------



## Developer_X (14. Aug 2009)

sparrow hat gesagt.:


> Verwirrend... ist der Sinn des Spiels nicht eigentlich, dass der Gegner einen Punkt bekommt wenn der Ball erstmal am Schläger vorbei ist?



ja aber ich hab mir überlegt, wieso alles nachmachen, ??
ich finde es so schöner, das ist ja dann meine Spiele Idee, die es vorher noch nicht so gab, also eine Varität des Spieles.


----------



## sparrow (14. Aug 2009)

Developer_X hat gesagt.:


> ja aber ich hab mir überlegt, wieso alles nachmachen, ??
> ich finde es so schöner, das ist ja dann meine Spiele Idee, die es vorher noch nicht so gab, also eine Varität des Spieles.



Nun ja, zur Softwareentwicklung gehört es aber auch vorher Ziele zu definieren, bzw. grundlegend festzulegen was genau ein Programm eigentlich machen soll. Eigentlich ist das sogar viel wichtiger als das tatsächliche Schreiben von Code.
Die 'Regeln' des Spiels jetzt zu verändern weil sich das Programm nicht wie gewünscht verhält ist nicht wirklich fördernd.


----------



## Developer_X (14. Aug 2009)

du hast zwar recht aber schön sieht es ja trotzdem aus, nicht wahr?


----------



## Opnox (14. Aug 2009)

Das Problem mit der Schlägersteuerung besteht auch noch. Er zuckt erst kurz und dann dauert es ne kurze Zeit bis er sich wirklich in die Richtung bewegt.


----------



## sparrow (14. Aug 2009)

Opnox hat gesagt.:


> Das Problem mit der Schlägersteuerung besteht auch noch. Er zuckt erst kurz und dann dauert es ne kurze Zeit bis er sich wirklich in die Richtung bewegt.



Hier kommt noch etwas anderes im Spiel: in der aktuellen Version braucht man auf meinem System gut 2 Sekunden um das Spielfeld von oben nach unten zu durchfahren. Da ist es natürlich Glück wenn man den Ball noch bekommt wenn die Breite des Bildschirms in weniger als einer halben Sekunde überquert.

Übrigens hatte mein alter Herr früher tatsächlich ein PONG-Telespiel, also so ein Ding das man den Fernseher anschließt. Ich weiß noch, man konnte zu 2. gegeinander spielen, gegen einen nicht menschlichen Gegner oder gegen eine Wand... quasi als Training.
Allerdings war das vom Spielgefühl her viel spannender, denn die Balken wurden ja nicht durch Tasten sondern durch _Drehknöpfe_ bewegt. Da finde ich eine Maussteuerung viel intuitiever


----------



## Opnox (14. Aug 2009)

Das ist richtig. Teilweise wirklich unmöglich den Ball noch zu erwischen, vorallem da er immer schneller wird.

Eine Maussteuerung würde ich bei Pong auch vorziehen.


----------



## Developer_X (14. Aug 2009)

Opnox hat gesagt.:


> Das ist richtig. Teilweise wirklich unmöglich den Ball noch zu erwischen, vorallem da er immer schneller wird.
> 
> Eine Maussteuerung würde ich bei Pong auch vorziehen.



gut, dann werd ich das wohl machen,


----------



## Developer_X (14. Aug 2009)

okay hier die Version mit einem integrierten KeyListener und einem MouseMotionListener
man kann auswählen welche Steuerung man bevorzugt
bitte um erweiterte Kritik developer-X


----------



## M4x0r (14. Aug 2009)

hast du das komplett selber geschrieben?


----------



## Developer_X (14. Aug 2009)

na klar, alles selbst, eine zeile habe ich aber nciht geschrieben:
ich wusste nicht dass man in der run methode 

while(true)

schreiben muss, sonst habe ich den kram selber geschrieben, warum?


----------



## ice-breaker (14. Aug 2009)

Die Escape-Taste zum Beenden ist wieder kaputt, ich kann unten immernoch nen halben Zentimeter raus, die Schläger bewegen sich immernoch komisch.

Ach ja und der Ball kann noch immer hinter dem Schläger an der Wand abprallen ohne einen Punkt zu geben, ich weiß nun auch wie.
Wenn der Schläger vor dem Ball ist und der Ball an die Wand stößt, prüfst du wahrscheinlich ob die y-Koordinate des Balles innerhalb von ymin bis ymax des Schlägers ist?


----------



## Developer_X (14. Aug 2009)

ice breaker, die grund idee des spieles hat sich im laufe des tages geändert, wenn du die neueste version hast, und bei der 2. Checkbox ein true gibts, wirst du sehen, dass es "bubblegumm" seile gibt, die den ball ziehen, aber nur wenn man auch mit dem schläger auf der selben höhe ist,

@ICE BREAKER
also im anhang habe ich mal die source und die jar.
Wenn man mti der mausspielt, kann man jetzt auch das spiel stoppen, indem man entweder auf ein anderes Frame wechselt, oder daraufklickt, um fortzufahren noch einmal klicken,

Developer_X


----------



## TheChemist (14. Aug 2009)

Naja, die Steuerung mit der Maus funktioniert auf jeden Fall besser. Aber was ist der Sinn von diesen "Seilen"? Haben die irgendwelche Auswirkungen auf den Ball?? Hab auch nochmal in deinen Sourcecode geschaut, da hat sich ja nicht allzuviel getan..


----------



## Apo (14. Aug 2009)

Also die Steuerung gefällt mir persönlich nicht. Selbst die Maus ist so böse träge ... das macht keinen Spaß zu spielen. Ich habe es auf meinem Laptop gespielt und da ist es dann nahezu unspielbar.

Optisch ist es ganz gelungen. Ansprechender könnte man es durch einzelne kleine Partikel gestalten.

Ein Fehler gab es bei mir. Ab und zu ist der Ball irgendwo hinter mir abgeprallt, obwohl der Gegner hätte einen Punkt bekommen müssen.

Und ein Verbesserungsvorschlag noch: Wenn man ESC oder so drückt, sollte man wieder zm AUswahlbildschrim kommen. Ich weiß das ich Alt F4 drücken kann, aber das ist userunfreundlich.


----------



## Developer_X (14. Aug 2009)

so hier


----------



## Vayu (14. Aug 2009)

mit rechtsklick kommt man zurück zum auswahlbildschirm ... esc tut sich gar nix.
und irgendwie n punkt gegen den PC zu machen ist unmöglich, also eigentlich kann man unendlich lange spielen. das macht null spass


----------



## Apo (14. Aug 2009)

Ok mit der rechten Maustaste kommt man nun wieder zurück. Das finde ich eine gute Besserung. Auch die Idee mit den Linien ist optisch ganz witzig.
Nur würde ich halt die Steuerung direkter machen. Das sich der Schläger erst nach gefühlten 10 Sekunden bewegt macht keinen Spaß. Und der Computer ist wirklich nahezu unschlagbar. Das macht nicht so viel Spaß.
Lass dem User ruhig mal ein Erfolgserlebnis, ansonsten geben sie zu schnell auf (was ich gut verstehen kann)

Wenn du die Sache mit der Steuerung und dem Schwierigkeitsgrad hinbekommst, dann ist es aber schon ein gutes kleines Spiel!


----------



## M4x0r (14. Aug 2009)

lol,
habe gerade das spiel gestartet, einen linksklick ins spiefeld gemacht und schon verbrauchte javaw.exe 99% meiner systemleistung :lol:


----------



## Developer_X (14. Aug 2009)

hey, jetzt muss ich euch mal kritisieren, ich habe euch ein Bild gemalt, auf dem deutlich zusehen ist, wo man die einstellung des KI_Gute_Grades einstellen kann, extra für euch, stellt das da mal auf 8.

noch was:
gute Nachrichten!:
ich habe herausgefunden warum das nicht bei allen Bildschirmgrößen geht!
ich werde das ändern, wenn ich fertig bin sende ich euch noch das neueste.


----------



## sparrow (14. Aug 2009)

M4x0r hat gesagt.:


> lol,
> habe gerade das spiel gestartet, einen linksklick ins spiefeld gemacht und schon verbrauchte javaw.exe 99% meiner systemleistung :lol:



Motte den 386er wieder ein


----------



## M4x0r (14. Aug 2009)

gute idee


----------



## Developer_X (14. Aug 2009)

antworten, so das sollte gehen,


----------



## Apo (14. Aug 2009)

Es ist richtig man kann den Schwierigkeitsgrad umstellen. Aber dann nimm doch gleich Schwierigkeitsgrad 5. Die User sind faul und haben nicht Lust sich durch die GUI so stark durchzuarbeiten.

Mit der Steuerung bin ich immernoch unzufrieden und werde erst wieder was positives sagen, wenn die angepasst wird. Es ist fraglich, dass ich den Ball ab den 2 bzw 3 Ballwechsel nicht mehr bekommen kann, weil die Schläger sowas von träge ist ... Verbesser das und ich werde es noch einmal testen. =)


----------



## TheChemist (14. Aug 2009)

Steuerung funktioniert bei mir jetzt ohne Ruckler. Bisschen verwirrt bin ich allerdings immer noch den "Linienfeatures", wenn beide gleichzeitig aktiviert sind, wirds ziemlich anstrengend^^


----------



## Developer_X (14. Aug 2009)

TheChemist hat gesagt.:


> Steuerung funktioniert bei mir jetzt ohne Ruckler. Bisschen verwirrt bin ich allerdings immer noch den "Linienfeatures", wenn beide gleichzeitig aktiviert sind, wirds ziemlich anstrengend^^



default einstellung ist ja, das es keine streifen gibt,

@APO:
Weißt du was APO?
Ich werde die geschwindigkeit bei den schlägern einfach etwas verschnellern, dann bist du bestimmt zu frieden


----------



## Developer_X (14. Aug 2009)

hier mal wieder eine neuere Version, die wie viele ist das jetzt?
die v1_25 ?! lol :lol:

was sagt ihr dazu?


----------



## diggaa1984 (14. Aug 2009)

du musst unbedingt versch abprallwinkel realisieren, konnte grad ewig super schnell mit dem pc spielen, weil immer das gleiche passiert is ^^ gott sei dank wird der ball nich unendlich schneller

aso noch schlimmer .. ich hab das game beendet, fenster war weg und immer noch ne knapp 90%ige auslastung einer java-anwendung .. und tja war keine andere offen ^^


----------



## Noctarius (14. Aug 2009)

Developer_X hat gesagt.:


> na klar, alles selbst, eine zeile habe ich aber nciht geschrieben:
> ich wusste nicht dass man in der run methode
> 
> while(true)
> ...



Darf ich dann mal fragen wie ab und an Variablen / Methoden mit Bezeichnern nach CodeConvention und meistens nicht auftauchen?

Aber vermutlich ignorierst du diese Frage wieder gekonnt wie immer.


----------



## Developer_X (14. Aug 2009)

diggaa1984 hat gesagt.:


> du musst unbedingt versch abprallwinkel realisieren, konnte grad ewig super schnell mit dem pc spielen, weil immer das gleiche passiert is ^^ gott sei dank wird der ball nich unendlich schneller
> 
> aso noch schlimmer .. ich hab das game beendet, fenster war weg und immer noch ne knapp 90%ige auslastung einer java-anwendung .. und tja war keine andere offen ^^



hast du auch folgende regeln befolgt:

wenn du die steuerung mit der mausgemacht hast, wie hast du es  beendet?
du hättest rechtklick machen müssen und dann beim fensterdas erscheint, unten auf exit klicken, dann passiert >>System.exit(0);<<

wenn du die steuerung mit den Tasten gemacht hast, wie hast du es  beendet?
du hättest ESC drücken müssen und dann beim fensterdas erscheint, unten auf exit klicken, dann passiert >>System.exit(0);<<


Developer_X


----------



## Developer_X (14. Aug 2009)

Noctarius hat gesagt.:


> Darf ich dann mal fragen wie ab und an Variablen / Methoden mit Bezeichnern nach CodeConvention und meistens nicht auftauchen?
> 
> Aber vermutlich ignorierst du diese Frage wieder gekonnt wie immer.



meinst du ich soll die Methoden so umbennen damit sie nach codeconvention geschrieben sind?


----------



## Noctarius (14. Aug 2009)

Von mir aus mach was du willst, ich hab eh lang aufgegeben. Ich wundere mich nur, dass, wenn du alles selbst geschrieben hast, mal Bezeichner nach CodeConvention und meistens nicht nach dieser dabei sind.

Verarschen können wir uns hier irgendwie alleine. Das schaffen wir gerade noch.


----------



## Developer_X (14. Aug 2009)

du willst mir nicht mal glauben, dass ich das selbstgeschrieben habe?!


----------



## Developer_X (14. Aug 2009)

diggaa1984 hat gesagt.:


> du musst unbedingt versch abprallwinkel realisieren,



Das habe ich jetzt nicht ganz so realisiert, aber ähnlich, schau mal, es wird dir bestimmt gefallen, ich habe eine maxim. geschwindigkeit eingebaut, die auf dauer entweder du oder der KI net mehr aushalten.


----------



## Vayu (14. Aug 2009)

er will folgendes sagen:

du programmierst NIE nach code conventions. dennoch tauchen in deinem code abschnitte (methoden, variablen) auf die eben nach den code conventions benannt sind. Und DAS ist ein Anzeichen dafür, dass du auch in diesem Spiel wieder copy&paste benutzt hast, um _dein_ Spiel zu programmieren ...


----------



## Noctarius (14. Aug 2009)

Developer_X hat gesagt.:


> du willst mir nicht mal glauben, dass ich das selbstgeschrieben habe?!



Genau das sage ich!



Vayu hat gesagt.:


> er will folgendes sagen:
> 
> du programmierst NIE nach code conventions. dennoch tauchen in deinem code abschnitte (methoden, variablen) auf die eben nach den code conventions benannt sind. Und DAS ist ein Anzeichen dafür, dass du auch in diesem Spiel wieder copy&paste benutzt hast, um _dein_ Spiel zu programmieren ...



+1


----------



## diggaa1984 (14. Aug 2009)

Developer_X hat gesagt.:


> hast du auch folgende regeln befolgt:
> 
> wenn du die steuerung mit der mausgemacht hast, wie hast du es  beendet?
> du hättest rechtklick machen müssen und dann beim fensterdas erscheint, unten auf exit klicken, dann passiert >>System.exit(0);<<
> ...



weiss ich net mehr ^^ .. aber ich seh zB kein "setDefaultCloseOperation(Frame.DISPOSE_ON_CLOSE) .. oder Frame.EXIT_ON_CLOSE in deinem code .. das würde dem vielleicht schon Abhilfe schaffen


----------



## Developer_X (14. Aug 2009)

ich habe eine umfrage erstellt,
ich enthalte mich dieser Abstimmung,
ich habe wirklich keinen Code gecopyt und gepasted, aus diesen "Programmier"Alter bin ich schon längst raus, wenn ihr mir dennoch nicht glaubt, dann habe ich 3 Fragen an euch: 
1. Frage: Wie soll ich es euch beweisen?
2. Frage: Vielleicht habe ich ja ein bisschen Java Bücher gelesen und gelernt, und begriffen wie an manchen Stellen Code Convetion besser ist, 
3. Frage: Warum leugne ich diesesmal denn, dass ich den Code gecopied und gepasted habe, wenn ich doch eh immer, nach eurer Ansicht, Copy und Paste.???

mir ist es vollkommen gleichgültig ob ihr denkt dass ich den Code gecopied und gepasted habe, ich will nur sagen, dass mein Spiel komplett von mir geschrieben ist, 
und ich darauf Stolz bin.

Developer_X


----------



## Developer_X (14. Aug 2009)

auf Anregung, diggas, habe ich in dieser Version einen WindowListenr integriert, der es einem ermöglicht, ohne in das erste Menu zu gehen, das spiel sauber zu beenden mit
System.exit(0);


----------



## diggaa1984 (14. Aug 2009)

hast du son default-ding nun drin, mir gehts darum dass das auch alles beendet wird, wenn man auf das X oben drückt ^^ .. genau dann hab ich nämlich ne restauslastung, welche einen Kern komplett beansprucht.


----------



## max40 (14. Aug 2009)

min und max werte von jspinner sind immer noch nicht eingestellt!


----------



## Developer_X (15. Aug 2009)

Okay, hier sind min und max werte eingebracht außer bei den 2 letzten Spinner, ich finde da sollte der Spieler frei wählen können, wirklich.

Noch was wichtiges zur Nutzung dieser version!
Ihr müsst wenn ihr es spielen wollt eine Datei namens
 Main.wav
in dem File haben wo ihr auch die Jar Datei habt, 
die meisten Spiele, eigentlich jedes hat Sound dateien, ich lasse euch freie Auswahl bei eurer Sound auswahl, so könnt ihr eure "Lieblings"Wav loops im spiel hören.

Developer-X
Viel Spaß


----------



## max40 (15. Aug 2009)

Developer_X hat gesagt.:


> Okay, hier sind min und max werte eingebracht außer bei den 2 letzten Spinner, ich finde da sollte der Spieler frei wählen können, wirklich.



Nö, alles was kleine 1 ist beim Punktestand macht kein Sinn, außer man will ein endlos Spiel!
Denk doch einfach mal ein bisschen nach!


----------



## Developer_X (15. Aug 2009)

entschuldige aber,
denk *du *doch mal ein bisschen nach!
vielleicht will sich wer einfach bisschen seine Zeit vertreiben, und spielt das unendlich lange, wenn er keine Lust mehr hat, dann drückt er ESC, ALT+F4 oder Rechtsklick
und schon kann er es beenden.


----------



## andre111 (16. Aug 2009)

Also ich glaub dir das du es geschrieben hast... Funktioniert wie immer, also abgesehen davon dass man erkennen kann, dass es ein Ping Pong sein soll, fast gar nicht.


----------



## Spacerat (16. Aug 2009)

...Das muss jetzt mal Raus... Auch wenn's irgendwann wieder dort landet, wo es keinen mehr interessiert...
Ich möchte mich hier weder als Moderator aufspielen noch jemanden zurechtweisen.

1. Ich frage mich, wieso dieser Thread inzwischen eine Umfrage ist, wo doch im Titel eindeutig eine Feststellung steht bzw. stand.
@DX: Wärst du der zukünftige SPD-Kanzlerkandidat, käme die Vertrauensfrage um einiges verfrüht, findest du nicht? :lol: ...Ok. Du bist nicht der zukünftige SPD-Kanzlerkandidat. Was also soll die Umfrage? Es steht doch gar nicht zur Debatte, ob der Code von dir stammt oder nicht, solange da nichts entscheidendes bei ist, worauf man stolz sein könnte.

2. Warum um alles in der Welt, ignoriert man Verbesserungsvorschläge teilweise selbst mit einer Gegendarstellung, die obendrein manchmal auch noch recht herablassend klingen (Zitat: "...denk doch mal nach" verschiedener Parteien).
@DX: Sollten die Verbesserungsvorschläge nicht im allgemeinen von der Community angenommen bzw. abgelehnt werden? Da wo das mit dem Endlosspiel kam bin ich z.B. ganz deiner Meinung. Wenn es aber um Abbruch-Methodik geht... "Alt-F4" darf *nie* die Lösung sein.

3. Welche Version ist denn nun die aktuelle? Klar doofe Frage die letzte, auf den letzten Seiten (...mal suchen). Ist der Speicher für Uploads eigentlich nicht begrenzt? Egal... Die Häufung der diversen nachgereichten Versionen, ist ohnehin viel zu hoch, für ein Spiel, welches mal als "fertig" bezeichnet wurde.
@DX: Wäre ein Verteilen wie es z.B. bei "ApoWomenInvasion" funktioniert nicht um Einiges besser? Du hast doch deinen Webspace im JavaDevelopmentCenter oder nicht? Warum benutzt du den nicht?

4. Pong geht anders...  (Nur meine subjektive Meinung)


----------



## Steev (18. Aug 2009)

Bitte weise den JSpinnern min- und max- Werte, eine entsprechende Vorbelegung währe eigendlich auch nicht verkehrt. So das man nur noch den Namen eingeben muss und anfagen kann.
Irgendwie bewegt sich der Ball aber nicht flüssig. Das ganze Stockt irgendwie so. Liegt das vieleicht an Threads. Bau doch mal so eine Art Frame-Limiter oder so etwas ein...
Ich würe das Spiel vieleicht so aufbauen:
1. Klick auf Programm
2. Spiel startet (Press Enter to Start the Game, Press Escape to Close the Game, usw...)
3. Irgendwer hat gewonnen
4. Please enter your name...
5. Highscore


----------



## tuxedo (18. Aug 2009)

*Es erst jetzt registriert habe* -> Die Umfrage ist ja das "Hammer". Das Ergebnis bis dato noch viel besser 

*scnr*: "Glauben" kann man in der Kirche  Aber doch nicht im Java Forum?!


----------



## Developer_X (18. Aug 2009)

Steev hat gesagt.:


> 2. Spiel startet (Press Enter to Start the Game, Press Escape to Close the Game, usw...)




wenn du das so haben willst, geh auf die erste Seite des Threads, da hast du so eine Version


----------



## Steev (19. Aug 2009)

Du solltest den Java-Prozess wieder beenden, wenn das Spiel geschlossen wird. (System.exit(0))


----------



## tuxedo (19. Aug 2009)

Ich hab noch nie ein System.exit() gebraucht wenn ich alles "richtig" gemacht habe:

Alle Ressourcen aufräume, Threadpools runterfahren, alle Netzwerkverbindungen kappen, ....

Eben so, dass die main-Methode sauber terminiert, von alleine ...

Versuche System.exit() nur im Fehlerfall zu nutzen. Hab sonst immer das Gefühl dass irgendwas nicht stimmt/nicht richtig ist.

- Alex


----------



## Developer_X (19. Aug 2009)

ok


----------



## Steev (19. Aug 2009)

@tuxedo
Ich habe bis jetzt immer bei Programmen mit einem Fenster das System.exit(0) genommen. Zm Beispiel im Window-Closing adapter usw. Mal sehen was der Standard da so macht...


----------



## tuxedo (19. Aug 2009)

Ob's eine Art Richtlinie gibt das so zu machen weiß ich nicht. Ich weiß nur dass mans nicht zwingend braucht wenn man alles auber aufräumt.


----------



## Steev (19. Aug 2009)

Das stimmt allerdings, nur es ist manchmal ziemlich umständlich es so zu machen und daher einfacher System.exit zu benutzen.


----------



## Marco13 (19. Aug 2009)

Ein Swing/AWT-Programm beendet sich automatisch, wenn alle Fenster geschlossen werden. Ansonsten gibt's ja auch noch 
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Zur Umfrage: Hab' mal für "egal" gestimmt. Ist doch Definitonsgehangel. Wer hat schon sein erstes "Hello World" selbst per Hand geschrieben? Das wird irgendwo her kopiert (oder abgetippt), dann Compilieren, und wenn's geht ist gut. Was ich sagen will: Die Grenze zwischen "selbst schreiben" und "nicht selbst schreiben" ist fließend.....


----------



## cover1012 (19. Aug 2009)

Marco13 hat gesagt.:


> Zur Umfrage: Hab' mal für "egal" gestimmt. Ist doch Definitonsgehangel. Wer hat schon sein erstes "Hello World" selbst per Hand geschrieben? Das wird irgendwo her kopiert (oder abgetippt), dann Compilieren, und wenn's geht ist gut. Was ich sagen will: Die Grenze zwischen "selbst schreiben" und "nicht selbst schreiben" ist fließend.....



Da stimme ich dir zu. Ich bin davon überzeugt, dass copy'n'paste eine wesentliche Methode auch in der professionellen Softwareentwicklung ist (warum das Rad neu erfinden?). Wichtig ist halt nur, dass man versteht, was man kopiert.


----------



## Noctarius (19. Aug 2009)

cover1012 hat gesagt.:


> Da stimme ich dir zu. Ich bin davon überzeugt, dass copy'n'paste eine wesentliche Methode auch in der professionellen Softwareentwicklung ist (warum das Rad neu erfinden?). Wichtig ist halt nur, dass man versteht, was man kopiert.



Richtig und genau der letzte Satz ist der entscheidende Teil daran und das Ganze Copy&Paste (was ansich ja nichts schlimmes ist) abzustreiten ist peinlich. Zumal es absolut offensichlich ist.


----------



## diggaa1984 (20. Aug 2009)

selbst wenn man sich an Tutorials orientiert, so übernimmt man eh meist ein Teil davon .. is ja so gesehen auch kopiert, zumindest von der Idee her, wenn mans denn doch per Hand abtippt  Denke das sollte man nicht so wild sehen, kann mich dem genannten "letzten Satz" da auch nur anschliessen


----------



## FatFire (20. Aug 2009)

tuxedo hat gesagt.:
			
		

> Ich hab *noch nie ein System.exit() gebraucht* wenn ich alles "richtig" gemacht habe:
> 
> Alle Ressourcen aufräume, Threadpools runterfahren, alle Netzwerkverbindungen kappen, ....


Aha, wie beendest Du denn dann grafische Oberflächen? Was glaubst Du denn, was passiert, wenn Du bei einem JFrame EXIT_ON_CLOSE setzt und das Fenster dann schließt? Riiiichtiiiisch:

```
355:   protected void processWindowEvent(WindowEvent e)
 356:   {
 357:     super.processWindowEvent(e);
 358:     if (e.getID() == WindowEvent.WINDOW_CLOSING)
 359:       {
 360:         switch (closeAction)
 361:       {
 362:       case EXIT_ON_CLOSE:
 363:         System.exit(0);
 364:         break;
 365:       case DISPOSE_ON_CLOSE:
 366:         dispose();
 367:         break;
 368:       case HIDE_ON_CLOSE:
 369:         setVisible(false);
 370:         break;
 371:       case DO_NOTHING_ON_CLOSE:
 372:         break;
 373:       }
 374:       }
 375:   }
```
Man beachte Zeilennummer 9 bzw. 363.
Also kann man davon ausgehen, dass Du keine Programme mit grafischer Oberfläche schreibst? Natürlich sollte man vorher ein wenig aufräumen, aber das kann man auf Dinge beschränken, die die Integrität der Daten berühren (z.B. bearbeitet ein Thread im Hintergrund noch Daten, die dann auch auf die Platte geschrieben werden sollen). Der EDT beendet sich ja nicht selbst, nur weil die Main-Methode terminiert.

Gruß FatFire


----------



## max40 (20. Aug 2009)

Man sollte auch WindowConstants.DISPOSE_ON_CLOSE verwenden!


----------



## tuxedo (20. Aug 2009)

@FatFire

Was "intern" in den Bibliotheken passiert juckt mich nicht die Bohne. Meine Aussage war lediglich: Wenn man alles richtig macht muss man nicht selbst explizit System.exit() aufrufen. 

- Alex


----------



## FatFire (20. Aug 2009)

max40 hat gesagt.:
			
		

> Man sollte auch WindowConstants.DISPOSE_ON_CLOSE verwenden!


Ja, und dann hat man doch wieder irgendwas vergessen (einen herumlungernden Thread z.B.) und dann läuft das Ding einfach weiter...ja ich weiß, an sowas sollte man sowieso immer denken.


> Was "intern" in den Bibliotheken passiert juckt mich nicht die Bohne.


Ich finde sowas eigentlich ziemlich interessant. Immerhin ist das die Grundlage für unsere Programme.

Gruß FatFire


----------



## bygones (20. Aug 2009)

FatFire hat gesagt.:


> Ich finde sowas eigentlich ziemlich interessant. Immerhin ist das die Grundlage für unsere Programme.


interessant ja, aber just for fun ... mich interessiert eher obs das tut was es vorgibt ;-)
wie es das macht und was es da macht ist mir auch so ziemlich schnuppe...


----------



## FatFire (20. Aug 2009)

bygones hat gesagt.:
			
		

> interessant ja, aber just for fun


Also ich schaue mir die API gerne mal an, wenn ich selber mit irgendeinem Konstrukt, dass ich selber programmiert habe und zu dem es vielleicht eine ähnliche Entsprechung bereits gibt, an, wenn ich mit meiner Version eventuell Probleme habe oder mit der Performance unzufrieden bin. Da bin ich schon oft auf Hinweise gestoßen, wie man es besser machen kann (okay, die API ist vielleicht auch nicht immer das Optimum, aber es steckt halt doch einiges mehr an Erfahrung drin).

Gruß FatFire


----------



## Illuvatar (21. Aug 2009)

Bin grundsätzlich derselben Meinung wie tuxedo... und EXIT_ON_CLOSE zu setzen ist für mich ien Fall von explizit System.exit aufrufen. Auch mit dispose sollte das Programm korrekt terminieren.


----------



## FatFire (21. Aug 2009)

Hm, okay, auch wenn ich nicht so ganz den angeblich sehr faden Beigeschmack von System.exit verstehe (also wenn man die wichtigen Dinge die evtl. im Hintergrund ablaufen im Griff hat, dürfte das ja sowieso kein Problem sein), werde ich mich da jetzt einfach mal der erfahreneren Mehrheit beugen. Grundsätzlich ist beides kompliziert, sobald ich mehrere Threads nutze. Im einen Fall könnte ich was abwürgen, was noch nicht fertig ist (die Ressourcen gehen dank des VM-Shutdowns ja auch nicht flöten und werden wieder freigegeben), im anderen Fall besteht halt die Gefahr das irgendwelche Sachen weiterlaufen und die VM am Leben halten, die eigentlich überflüssig sind. Aber das Einsehen kommt, wenn man sich überlegt, dass diese weiterlaufenden VMs halt eher beim Aufspüren von Fehlern dienlich sind und damit eher erkannt werden, als "abgewürgte" Programme und Fehler die daraus entstehen.
Deswegen mal ++ an Alex, max40 und Illuvatar.

Gruß FatFire


----------



## Steev (21. Aug 2009)

Ich bin der Meinung, dass man alle Möglichen Problemfälle eliminieren sollte. Und dazu gehört nunmal auch, dass irgendlwelche Threads im Hintergrund weiterlaufen.
Wie man das tut, das bleibt jedem selbst überlassen. Ich persönlich nutze, wie schon gesagt, nachdem ich sicher gestellt habe, dass alle wichtigen Berechnungen usw. beendet wurden, zusätzlich System.exit.
Der Standard tuts auch und ich denke das es genauso richtig ist, als wenn man das System.exit vermeidet und die Selbstterminierung nutzt.

Gruß
Steev


----------



## tuxedo (21. Aug 2009)

Naja. Wenn man System.exit() nur nutzt um auf "Nummer sicher" zu gehen wäre das für mich auch okay. Aber zu sagen: "So, hier ist das Ende des Programms, um's "aufräumen" kümmert sich schon das Terminieren der JVM" ist halt IMHO der falsche Ansatz (nicht dass ich das hier irgendwem unterstellen möchte/wollte. Wollte es nur erwähnt haben).

- Alex


----------



## Steev (21. Aug 2009)

tuxedo hat gesagt.:


> Aber zu sagen: "So, hier ist das Ende des Programms, um's "aufräumen" kümmert sich schon das Terminieren der JVM" ist halt IMHO der falsche Ansatz



Das wollte ich auch nie so gemeint haben. Man sollte natürlich dafür sorgen, dass alle "wichtigen" Threads/Pools auslaufen. Manchmal, vor allem bei komplexeren Programmen oder wenn man Packages nutzt, von denen man nicht genau weis, wie sie intern aufgebaut sind, läuft dann noch irgendein Thread im Hintergrund weiter. Dafür würde ich dann System.exit nutzen, da man ja sonst X java-Tasks hat, die vieleicht noch Dateien blockieren usw.


----------



## tuxedo (21. Aug 2009)

> Das wollte ich auch nie so gemeint haben.



...



tuxedo hat gesagt.:


> (nicht dass ich das hier irgendwem unterstellen möchte/wollte. Wollte es nur erwähnt haben)


----------



## faetzminator (21. Aug 2009)

Ich bin eigentlich auch strikt gegen System.exit(), aber manchmal kommt man nicht drum herum. Da gebe ich Steev völlig recht. Z.B. hatte ich vor einiger Zeit mit irgendwelchen hängengebliebenen Threads von der Pirc Bot Lib, trotz disconnects.


----------



## Spacerat (22. Aug 2009)

Ist "System.exit()" nicht eigentlich ein Ansatz um verschiedene, in einer Doku definierte Exitcodes (Fehlercodes) statt Exceptions an einen Aufrufer (z.B. ein Batch-Process) zurückzugeben? Z.B. so:
	
	
	
	





```
class JavaApp
{
  public static void main(String[] args)
  {
    try {
      JavaApp.execute(args);
      System.exit(0); // Alles OK;
    } catch(Throwable e) {
      e.printStacktrace();
      System.exit(-1); // Fataler Fehler
    }
  }

  //...
}
```


----------



## Steev (22. Aug 2009)

Soweit ich weis ja. In C++ ist es auf jedem Fall auch so, dass Fehler über die Rückgabe der main erkannt, bzw. zurückgegeben werden.


----------



## Spacerat (22. Aug 2009)

Ja, neee, is Klar... Die Frage war rein rhetorisch gestellt. Wollte damit nur sagen, dass "System.exit()" durchaus Sinn macht. Wie wollen denn jene, die dessen Verwendung strikt ablehnen, ihre Exitcodes an die Batch zurückgeben? Etwa mittels Parsen der geworfenen Exception? Standardmässig wird halt 0 oder -1 zurückgegeben.


----------



## tuxedo (22. Aug 2009)

Also ich persönlich hab bei eigenen Programmen noch keine Exit-Codes benötigt. Aber klar, wenn man mit Exit-Codes arbeiten will macht System.exit() natürlich Sinn 

- Alex


----------



## FatFire (22. Aug 2009)

Zumindest für Programme, die leicht über Kommandozeile zu steuern sind, ist das natürlich besser, weil man da nie sicher sein kann, dass die nicht vielleicht doch einfach mal im Rahmen eines Scripts genutzt werden.

Andererseits hab ich da schon soviel Moppelkotze gesehen...hier mal ein Beispiel:

```
}catch(Exception Exception1){
	System.exit(0);
}
```
Über die Qualität dieses Programms lasse ich mich mal nicht weiter aus, der Quellcode ist eh die Hölle (man beachte nur den groß geschriebenen Variablennamen). Und dann der Sinn: wenn ein Fehler auftritt, beende das Programm und signalisiere, dass alles in Ordnung war...

Generell macht wohl alles Sinn, was Java so an Features, Optionen und Möglichkeiten zur Verfügung stellt. Aber dann muss man auch wissen, wie man es benutzen muss.

Gruß FatFire


----------

