"Schöner" Code?

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo, ich habe mein erstes Programm in Java geschrieben.
Es handelt sich dabei um eine Vorstufe eines Spiels, wo nur Schüsse als bewegende Punkte dargestellt werden.

Um möglichst viele Fehler von vornherein zu verhindern bitte ich Euch mal einen Blick auf das zu werfen.
Wo sind Stilbrüche bzw. was würdet ihr besser machen?

Danke für die Hilfe!

Ball.class


game.class
Code:
import java.awt.*;
import java.util.*;
import java.applet.*;
import java.net.*;
import java.awt.event.*;


public class game extends Applet implements Runnable
{

	int shooted;					// Anzahl Schüsse abgefeuert
	
	// Deklaration der Objektreferenzen
	private Ball shoot[];			// Refferenz auf den Schuss

	// Thread
	Thread th;						// Thread in dem das Spiel läuft

    // Variablen für die Doppelpufferung
	private Image dbImage;
	private Graphics dbg;

	// Init - Methode
	public void init ()
	{
		// Neue Hintergrundfarbe
        Color superblue = new Color (50, 100, 150);
		// Setzen der Hintergrundfarbe
		setBackground (superblue);
		
		shoot = new Ball[1000];
		
		// Initialisierung der Spielobjekte
		shoot[0] = new Ball ();
	}


	// Start - Methode, hier beginnt das Applet zu laufen
	public void start ()
	{
		// Schaffen eines neuen Threads, in dem das Spiel läuft
		th = new Thread (this);
		th.start ();
	}
	
	public boolean keyDown (Event e, int key)
   { 

      // Spacetaste gedrückt
      if (key == 32)
      {
			shooted++;	//Anzahl abgefeuerter Schüsse +1
			int inta = (int)((Math.random()*3)+1);
			int sped = (int)((Math.random()*5)+5);
			shoot[shooted] = new Ball(1,40,sped,inta);
      }
	  return true;
   }
	


	// Stop - Methode, hier wird das Applet gestopt
	public void stop ()
	{
		th.stop();
	}

	// Implementierung der Runmethode
	public void run ()
	{
		// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

		while (true)
		{
			for(int i=0;i<=shooted;i++)
			{

				if(!shoot[i].isOut())		// Wenn Schuss nicht außerhalb von Fenster --> move
				{
				shoot[i].move();
			    }
			  
			}
			repaint();

			try
			{
				// Stoppen des Threads für 10 Millisekunden
				Thread.sleep (10);
			}
			catch (InterruptedException ex)
			{
				// do nothing
			}

			// Zurücksetzen der ThreadPriority auf Maximalwert
			Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
		}
	}

	// Paint - Methode
	public void paint (Graphics g)
	{

		for(int i=0;i<=shooted;i++)
			{
			 shoot[i].DrawBall(g);
			}
	}

	// Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns
	public void update (Graphics g)
	{
		// Initialisierung des DoubleBuffers
		if (dbImage == null)
		{
			dbImage = createImage (this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics ();
		}

		// Bildschirm im Hintergrund lÀÜschen
		dbg.setColor (getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

		// Auf gelÀÜschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		paint (dbg);

		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
	}
}
import java.applet.*;
import java.awt.*;
import java.util.*;
import java.net.*;


public class Ball
{

// Initialisierung der Variablen
private int x_pos; // x - Position des Balles
private int y_pos; // y - Position des Balles
private int speed;
private int radius; // Radius des Balles
Color shotcol = new Color (250, 250, 250);

public Ball()
{
// initialisieren ohne Parameter
}

public Ball(int x, int y, int sp, int r) // Konstruktor
{
x_pos = x;
y_pos = y;
speed = sp;
radius = r;
}

public void move()
{
this.x_pos = this.x_pos + this.speed;
isOut();
}

public boolean isOut()
{
if(this.x_pos >= 500)
{
return true;
}
else
{
return false;
}
}

public boolean collision(Ball ball)
{

if(this.x_pos == ball.x_pos)
{
stop();
return true;
}
else
{
return false;
}
}

public void init()
{

}

public void start ()
{

}

public void stop()
{

}

public void destroy()
{

}

public void DrawBall (Graphics g)
{
g.setColor (shotcol);
g.fillOval (this.x_pos - this.radius, this.y_pos - this.radius, 2 * this.radius, 2 * this.radius);
}

}


PS:// Das Skript läuft bei mir ohne weitere Probleme...Es kommt aber der Hinweis "uses or oberwrites a depricated API" ...
 
mal grob...

Code:
public class game extends Applet implements Runnable
klassen schreibt man immer groß -> Game

Code:
shoot = new Ball[1000];
ich würde eine ArrayList nehmen...

Code:
if (key == 32)

vielleicht die static variable von KeyEvent verwenden (KeyEvent.VK_SPACE)
 
Statt
Code:
private Ball shoot[];
lieber
Code:
private Ball[] shoot;

Ersteres ist von Java leider unterstützter C++-Pseudokompatibilitätsschwachsinn.

Und das ist ein Programm und kein Skript.
 
Worauf gründest du so eine drastische Aussage?
(Bisher war alles begründet oder begründbar, aber ob int[] a oder int a[] ist wohl NUR Ansichtssache - und - ich verwende immer letzteres ... :wink: )
 
Marco13 hat gesagt.:
Worauf gründest du so eine drastische Aussage?
(Bisher war alles begründet oder begründbar, aber ob int[] a oder int a[] ist wohl NUR Ansichtssache - und - ich verwende immer letzteres ... :wink: )
Warum die "echte" Java-Syntax logischer ist als die C++-Schreibweise, hat eine für mich sehr einfache und einleuchtende Erklärung: Es handelt sich bei a um ein int-Array, deswegen
Code:
int[] a; // gelesen: int-Array a
während die andere Schreibweise
Code:
int a[];
suggeriert, es handle sich um ein Array von a-ints, aber das ist (für meine Begriffe) Unsinn.

Die Klammern gehören mit zur Angabe des Typs, deswegen sollten sie auch beim Typ notiert werden.

Ark
 
Hatte Scott Meyer das nicht in Effectiv C++ behandelt?
Glaube mich erinnern zu können dass Arks Begründung richtig ist(klingt auch sinnvoll), speziell wenn man mehrere Variablen auf einmal deklariert.
 
So ich hatte gerade mal Langeweile 🙂 Einiges wurde schon gesagt, aber ich mach jetzt einfach mal ein komplettes Review.

Zeile 0:
Keine Package angegeben, das Default Package sollte man nicht umbedingt verwenden.

Code:
public class game
Game wird großgeschrieben.

Code:
int shooted;
- Private fehlt
- Besserer Name numberOfshots

Code:
private Ball shoot[];
Besserer Name: shots
Besser als ein Array ist eine dynamische Liste. Im späteren Code findet sich keine Stelle, die sicherstellt, das die Arraygrenzen nicht überschritten werden.

Code:
Thread th;
- Private fehlt.
- Variablennamen ruhig ausschreiben (thread)

Code:
if (key == 32)
Magic-Numbers sind böse, insbesondere wenn es von Java vorgebene Konstanten gibt.

Code:
         shooted++;   //Anzahl abgefeuerter Schüsse +1
         int inta = (int)((Math.random()*3)+1);
         int sped = (int)((Math.random()*5)+5);
         shoot[shooted] = new Ball(1,40,sped,inta);
Und
Code:
         for(int i=0;i<=shooted;i++)
         {

            if(!shoot[i].isOut())      // Wenn Schuss nicht außerhalb von Fenster --> move
ermöglichen eine NullPointerException.
Grund: Die beiden CodeBlöcke laufen in unterschiedlichen Threads. Es kann sein, das im oberen Block shooted um eins erhöht wird und dann im unteren Block die Schläfe versucht auf auf shoot[shooted] zuzugreifen. Dann knallts. Der Fall ist unwahrscheinlich, aber kann aber auftreten.
Lösung wäre im ersten Block erst das neue Ball-Objekt zu erzeugen und dann die Variable hochzuzählen.

Code:
public void stop ()
   {
      th.stop();
   }
Thread.stop ist deprecated.


Code:
public void move()
{
this.x_pos = this.x_pos + this.speed;
isOut();
}
Was soll der isOut-Aufruf da?

Code:
public boolean collision(Ball ball)
{

if(this.x_pos == ball.x_pos)
Teilweise Überlappungen und y-Koordinate werden nicht geprüft.

Allgemeine Anmerkungen:
Wenn du schon Kommentare dranschreibst, kannst du die Methoden und Klassen auch direkt mit Java-Doc kompatiblen Kommentaren versehen.
 
Marco13 hat gesagt.:
Worauf gründest du so eine drastische Aussage?
(Bisher war alles begründet oder begründbar, aber ob int[] a oder int a[] ist wohl NUR Ansichtssache - und - ich verwende immer letzteres ... :wink: )
Wie oben schon jemand geschrieben hat gehören die Klammern zum Typ und nicht zum Variablennamen, denn dann gilt für die Variablendefinition immer
Code:
modifier typ variablenname;

Andernfalls kann schnell verwirrend werden, wenn man mehrere Variablen in einer Zeile definiert (was man sowie nicht tun sollte):

Code:
int a, b[], c, d;
 
Einerseits ist die Argumentation klar, aber das andere deswegen so zu verteufeln...(n.b: Im Code von Sun ist beides bunt gemischt) ... naja.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben