# schiffe versenken applet



## MissHalliwell (22. Apr 2006)

hallo, 

ich habe seit letzten sommer informatik in der schule und muss bis dienstag ein java-applet erstellt haben. ist ein projekt was wie eine arbeit zählt. hab mir jetzt was gesucht aber ich weiß nicht, ob die kommentare dazu richtig sind oder ob ihr verbesserungen habt. außerdem hab ich überlegt, ob man die 2. datei auch in die erste mit reinschreiben kann, weil wir eig noch nie mit 2 verschiedenen dateien gearbeitet haben.. mit diesem GridBagLayout zwar auch nicht aber ich weiß nicht ob es ohne auch geht.

hier mal der inhalt meiner beiden dateien:


```
import java.applet.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Dimension;

/**  Battleship class definiert ein Applet, das das Spielbrett mit
     100 Buttons enthält, einen Button, der ein neues Spiel startet
     und eine Anzeige über die aktuelle Situation im Spiel.
   */
public class Schiffeversenken extends Applet implements ActionListener
{
  // Anfang Variablen
  
  private Datei buttons[][];
  private int buttonStatus[][];
  private int Schifftabelle[][];
  private int zerstörteSchiffe;
  private Button Neustart;
  private TextField status;
  
  private static final int EMPTY=0, NO_SHIP=1, SHIP=2;
  private static final int Schiffanzahl = 15;
    // Ende Variablen

  /** Schiffeversenken contructor */
  public Schiffeversenken() {
    super();
    buttons = new Datei[10][10];
    buttonStatus = new int[10][10];
    Schifftabelle = new int[10][10];
  }
                       // Anfang Komponenten

  /** Überprüft den Spielstatus und updated ihn     */
  void Status(int x, int y) {
    buttonStatus[x][y] = Schifftabelle[x][y];
    if (buttonStatus[x][y] == SHIP)
      zerstörteSchiffe++;
    showStatus();
  }
  
  /** Überprüft, ob ein Schiff getroffen wurde  */
  String Bom(int x, int y) {
    Status(x, y);
    if (Schifftabelle[x][y] == SHIP)
      return new String("X");
    else
      return new String("O");
  }
 
  /** Zeigt den Spielstatus in der Anzeige an */
  private void showStatus() {
    if (zerstörteSchiffe == Schiffanzahl)
      status.setText("Gewonnen!");
    else
      status.setText(Schiffanzahl-zerstörteSchiffe + " Schiffe noch.");
  }
  

  public void init() {

    GridBagConstraints c = new GridBagConstraints();


    c.fill = GridBagConstraints.BOTH;  // Höhe u. Breite werden so verändert,
                                       // dass sie den Anzeigebereich ganz ausfüllen
    c.weightx = 1.0;                  // Breite,1.0:Komponente erhält den gesamten
                                      //zusätzlichen Platz u. das Gitter seine Breite.
    c.weighty = 1.0;                 //  Höhe, 1.0: ""


    GridBagLayout g = new GridBagLayout(); //GridBagLayout erstellen (Gitter zur Anordnung)

    setLayout(g);
    g.setConstraints(this, c);

    // Fügt Main panel hinzu
    Panel MainPanel = new Panel(g);
    g.setConstraints(MainPanel, c);
    add(MainPanel);

    // Fügt Button panel für den Start Button und die Anzeige hinzu
    c.fill = GridBagConstraints.VERTICAL;
    Panel ButtonPanel = new Panel(g);
    g.setConstraints(ButtonPanel, c);
    MainPanel.add(ButtonPanel);

    // Fügt Grid panel für die 100 Spielbuttons hinzu
    c.fill = GridBagConstraints.BOTH;      //Höhe u. Breite der Komponente füllen
                                           //Anzeigeberech immer aus
    Panel GridPanel = new Panel(g);
    g.setConstraints(GridPanel, c);
    MainPanel.add(GridPanel);
    

     // Ende Komponenten
    // erstellt die 100 Buttons
    for (int y = 0; y < 10; y++) {
      c.gridwidth = 1;         //definiert Anzahl der Gitterzellen,
                               // über die sich der Anzeigebereich in der Breite erstreckt
      for (int x = 0; x < 10; x++) {
      buttonStatus[x][y] = EMPTY;
      buttons[x][y] = new Datei(this, x, y);
      if (x == 9)
        c.gridwidth = GridBagConstraints.REMAINDER; //Vergibt den Rest der aktuellen
                                                    // Zeile
      g.setConstraints(buttons[x][y], c);
      GridPanel.add(buttons[x][y]);
      }
    }

    /** Erstellt Schiffe für das Spielfeld */
    int z = 0;
    int x, y;
    while (z < Schiffanzahl) {
      x = (int)Math.round(Math.random() * 9.0);
      y = (int)Math.round(Math.random() * 9.0);
      if (Schifftabelle[x][y] == EMPTY) {
      Schifftabelle[x][y] = SHIP;
      z++;
      }
    }

    c.fill = GridBagConstraints.NONE;      // unverändert
    c.anchor = GridBagConstraints.CENTER; //Ausrichtung im Fenster zentriert

    // Fügt die Anzeige zum Button panel hinzu
    status = new TextField();
    showStatus();
    status.setEditable(false);
    g.setConstraints(status, c);
    ButtonPanel.add(status);

    c.gridwidth = GridBagConstraints.REMAINDER; //weist der Komponente den Rest
                                                // der aktuellen Zeile zu                                                        // Spalte/Zeile zu

    // Fügt den Start Button zum Button panel hinzu
    Neustart = new Button("Spiel starten");
    Neustart.addActionListener(this);
    Neustart.setActionCommand("Neustart");
    g.setConstraints(Neustart, c);
    ButtonPanel.add(Neustart);

  }
  
  public void start()
  {
  }


  public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();
    String command = e.getActionCommand();
    
    if (source instanceof Button) { 
      
      if (command == "Neustart") {
      for (int y = 0; y < 10; y++)
      for (int x = 0; x < 10; x++) {
      buttonStatus[x][y] = EMPTY;
      buttons[x][y].setLabel("");
      }
      zerstörteSchiffe = 0;
      showStatus();
      }
    }
  }
  
  /** Unterbricht die Ausführung */
  public void stop()
  {
  }
  

  public void destroy()
  {
  }
  
  /** gibt die Infos zum Applet zurück */
  public String getAppletInfo()
  {
    return new String("Schiffe versenken");
  }


  public void paint(Graphics g) {
    for (int y = 0; y < 10; y++)
      for (int x = 0; x < 10; x++) {
      buttons[x][y].paint(g);
      }
    status.paint(g);
    Neustart.paint(g);
  }
}
```

und


```
import java.applet.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


/* Datei definiert jeweils einen der kleinen Buttons
 */
class Datei extends Button implements ActionListener
{
  private Schiffeversenken Spielfeld;
  private int x,y;  // um Spielfeld zu sagen, um welche Button es sich handelt


  public Datei(Schiffeversenken b, int xkoordinate, int ykoordinate) {
    super();
    addActionListener(this);
    Spielfeld = b;
    x = xkoordinate;
    y = ykoordinate;
  }

  /** Geräusch, wenn Button schon gedrückt wurde */
  public void actionPerformed(ActionEvent e) {
    if (getLabel() == "") {
      setLabel(Spielfeld.Bom(x,y));
    } else {
      Toolkit.getDefaultToolkit().beep();
    }   
  }
}
```

danke schon mal


----------



## MissHalliwell (24. Apr 2006)

warum hilft mir keiner?


----------



## Noar (24. Apr 2006)

Hi,

naja, ist etwas schwer dir zu helfen, dazu sind deine Fragen recht unpräzise.

Zuerst mal, das Programm schaut doch ganz gut aus. Ich kann es an dem Rechner leider nicht testen,
auf dem ersten Blick passt alles.

Um deine Fragen beantworten zu können, müsstest du halt sagen, was genau die Anforderungen sind. 
Also DÜRFT ihr nur eine Datei nutzen, oder gab es da keine Einschränkungen?
Wenn du das auf mehrere Dateien verteilst, solltest du halt idealerweise dafür einen Grund haben (Trennen von GUI und Logic z.B.). Wenn du das begründen kannst, sollte dein Lehrer doch zufrieden sein. 


In Bezug auf WAS sollen wir dir sagen, ob die Kommentare so OK sind? Sind soweit schon ok, und (meiner Meinung nach) auch ausreichend, aber wenn ihr z.B. die Kommentare als Dokumentation nutzen sollt (javadoc) dann ist das natürlich nicht OK.


----------



## MissHalliwell (25. Apr 2006)

Hallo,

hmm ja, es passt schon alles. Meine Frage ist einmal, ob ich den Inhalt der 2. Datei nicht auch in die 1. Datei einbauen kann, damit ich nur eine Datei habe, weil wir in der Schule noch nie mit zwei verschiedenen Dateien gearbeitet haben. 

Genaue Anforderungen habe ich nicht bekommen, nur, ein kleines Spiel zu machen. Ich habe das Spiel nicht allein erstellt und kann leider nicht mehr nachfragen. jetzt bin ich unsicher, weil zum Beispiel dieses GridBagLayout hatten wir im Unterricht noch nicht, und ich weiß nicht, ob ich den Sinn etc richtig verstanden habe, um meinem Lehrer evt zu erklären, warum ich dieses layout benutzt habe.

Außerdem klappt das mit dem Neustart irgendwie nicht. Wenn ich das Spiel durchgespielt habe, dachte ich, dass sich die Aufschrift auf meinem Button in "Neustart" ändert, aber das tut sie nicht? Wie bekomme ich das hin?

Danke und Gruß, MH


----------



## L-ectron-X (26. Apr 2006)

Den Aufruf

```
status.paint(g);
Neustart.paint(g);
```
entfernen!

Und dafür

```
/** Zeigt den Spielstatus in der Anzeige an */
  private void showStatus() {
    if (zerstörteSchiffe == Schiffanzahl) {
      status.setText("Gewonnen!");
      Neustart.setText("Neustart");
    }
    else
      status.setText(Schiffanzahl-zerstörteSchiffe + " Schiffe noch.");
  }
```


----------



## MissHalliwell (26. Apr 2006)

Oh danke! 


```
import java.applet.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Dimension;

/**  Applet, das das Spielbrett mit 100 Buttons enthält, einen Button,
     der ein neues Spiel startet u. eine Anzeige über die aktuelle Spielstandsituation.
   */
public class Schiffeversenken extends Applet implements ActionListener
{
  // Anfang Variablen
  
  private static final int leer=0, Kein_Schiff=1, Schiff=2;
  private static final int Schiffanzahl = 15;
  
  private Datei buttons[][];
  private int buttonStatus[][];
  private int Schifftabelle[][];
  private int zerstörteSchiffe;
  private Button Neustart = new Button();
  private TextField status = new TextField();
  private Label lb = new Label();
    // Ende Variablen

  public Schiffeversenken() {
    super();
    buttons = new Datei[10][10];
    buttonStatus = new int[10][10];
    Schifftabelle = new int[10][10];
    setLayout(null);
    setBackground(new Color(50, 20, 50));
  }
                       // Anfang Komponenten

  /** Überprüft den Spielstatus und updated ihn     */
  void Status(int x, int y) {
    buttonStatus[x][y] = Schifftabelle[x][y];
    if (buttonStatus[x][y] == Schiff)
      zerstörteSchiffe++;
    showStatus();
  }
  
  /** Überprüft, ob ein Schiff getroffen wurde  */
  String Bom(int x, int y) {
    Status(x, y);
    if (Schifftabelle[x][y] == Schiff)
    return new String("X");
    else
      return new String("O");
  }
 
/** Zeigt den Spielstatus in der Anzeige an */
  private void showStatus() {
    if (zerstörteSchiffe == Schiffanzahl) {
      status.setText("Gewonnen!");
      status.setText("Neu starten!");
    }
    else
      status.setText(Schiffanzahl-zerstörteSchiffe + " Schiffe noch.");
  }


  public void init() {

    GridBagConstraints c = new GridBagConstraints();

    c.fill = GridBagConstraints.BOTH;  // Höhe u. Breite werden so verändert,
                                       // dass sie den Anzeigebereich ganz ausfüllen
    c.weightx = 1.0;                  // Breite, 1.0:Komponente erhält den gesamten
                                      //zusätzlichen Platz u. das Gitter seine Breite.
    c.weighty = 1.0;                 //  Höhe, 1.0: ""

    GridBagLayout g = new GridBagLayout(); //GridBagLayout erstellen (Gitter zur Anordnung)
    setLayout(g);
    g.setConstraints(this, c);

    // Fügt Main panel hinzu
    Panel MainPanel = new Panel(g);
    g.setConstraints(MainPanel, c);
    add(MainPanel);

    // Fügt Button panel für den Start-Button und die Anzeige hinzu
    c.fill = GridBagConstraints.VERTICAL;
    Panel ButtonPanel = new Panel(g);
    g.setConstraints(ButtonPanel, c);
    MainPanel.add(ButtonPanel);

    // Fügt Grid panel für die 100 Spielbuttons hinzu
    c.fill = GridBagConstraints.BOTH;      //Höhe u. Breite der Komponente füllen
                                           //Anzeigeberech immer aus
    Panel GridPanel = new Panel(g);
    g.setConstraints(GridPanel, c);
    MainPanel.add(GridPanel);
    

     // Ende Komponenten
    // erstellt die 100 Buttons
    for (int y = 0; y < 10; y++) {
      c.gridwidth = 1;         //definiert Anzahl der Gitterzellen,
                               // über die sich der Anzeigebereich in der Breite erstreckt
      for (int x = 0; x < 10; x++) {
      buttonStatus[x][y] = leer;
      buttons[x][y] = new Datei(this, x, y);
      if (x == 9)
      c.gridwidth = GridBagConstraints.REMAINDER; //Vergibt den Rest der aktuellen
                                                    // Zeile
      g.setConstraints(buttons[x][y], c);
      GridPanel.add(buttons[x][y]);
      }
    }

    /** Erstellt Schiffe für das Spielfeld */
    int z = 0;
    int x, y;
    while (z < Schiffanzahl) {
      x = (int)Math.round(Math.random() * 9.0);
      y = (int)Math.round(Math.random() * 9.0);
      if (Schifftabelle[x][y] == leer) {
      Schifftabelle[x][y] = Schiff;
      z++;
      }
    }

    c.fill = GridBagConstraints.NONE;      // unverändert
    c.anchor = GridBagConstraints.CENTER; //Ausrichtung im Fenster zentriert

    // Fügt die Anzeige zum Button panel hinzu
    status = new TextField();
    showStatus();
    status.setEditable(false);
    g.setConstraints(status, c);
    ButtonPanel.add(status);

    c.gridwidth = GridBagConstraints.REMAINDER; //weist der Komponente den Rest
                                                // der aktuellen Zeile zu                                                        // Spalte/Zeile zu

    // Fügt den Start Button zum Button panel hinzu
    Neustart = new Button("Spiel starten");
    Neustart.setFont(new Font("Arial", 1, 16));
    Neustart.addActionListener(this);
    Neustart.setActionCommand("Neustart");
    g.setConstraints(Neustart, c);
    ButtonPanel.add(Neustart);

  }
  
  public void start()
  {
  }


  public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();
    String command = e.getActionCommand();
    
    if (source instanceof Button) { 
      
      if (command == "Neustart") {
      for (int y = 0; y < 10; y++)
      for (int x = 0; x < 10; x++) {
      buttonStatus[x][y] = leer;
      buttons[x][y].setLabel("");
      }
      zerstörteSchiffe = 0;
      showStatus();
      }
    }
  }
  

  public void stop()
  {
  }
  

  public void destroy()
  {
  }
  

  public String getAppletInfo()
  {
  return new String("Schiffe versenken");
  }


  public void paint(Graphics g) {
  for (int y = 0; y < 10; y++)
  for (int x = 0; x < 10; x++) {
  buttons[x][y].paint(g);
  }

  }
}
```

und 


```
import java.applet.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


/* Datei definiert jeweils einen der kleinen Buttons
 */
class Datei extends Button implements ActionListener
{
  private Schiffeversenken Spielfeld;
  private int x,y;  // um Spielfeld zu sagen, um welche Buttons es sich handelt


  public Datei(Schiffeversenken b, int xkoordinate, int ykoordinate) {
    super();
    addActionListener(this);
    Spielfeld = b;
    x = xkoordinate;
    y = ykoordinate;
  }

  /** Geräusch, wenn Button schon gedrückt wurde */
  public void actionPerformed(ActionEvent e) {
    if (getLabel() == "") {
      setLabel(Spielfeld.Bom(x,y));
    } else {
      Toolkit.getDefaultToolkit().beep();
    }   
  }
}
```

So sieht es jetzt aus.. Ich habe den Hintergrund noch farbig gemacht und die Aufschrift des Buttons geändert bekommen. Wo kann ich die Schrift etc des Textfeldes ändern? Finde das irgendwie nicht. Und meine 100 Buttons, da würde ich auch gerne die Schrift bzw evt sogar die Farbe der Buttons ändern. 

Habt ihr sonst noch Tipps damit das Ganze ein wenig "schöner" wirkt?
(Ich bin froh, nächstes Jahr kein Informatik mehr zu haben   )
Liebe Grüße, MH[/code]


----------

