Hilfe bei Schiffe versenken

kevkev

Mitglied
Weiß jemand was er Fehler sein könnte?
Fehler wird in z. 30 bei myGUI.setzeSchiff(2,4,3,true); angezeigt...
Danke im vorrraus!


Java:
import javakara.JavaKaraProgram;
import java.awt.*;
import javax.swing.*;



public class Oberflaeche extends JavaKaraProgram {

  public void myProgram() {
      
  
  

   JFrame myFrame = new JFrame();
   myFrame.setSize(400,400);
  
 
   MeineGUI myGUI = new MeineGUI(10,10);
   myGUI.setVisible(true);

   myFrame.setContentPane(myGUI); //Setzt eine neue
                                //Zeichenflaeche (ContentPane)
            
  
   myFrame.setVisible(true);
  
   myFrame.setBackground(new Color(0x000000));
  
  
   myGUI.setzeSchiff(2, 4, 3, true);
  
  
  

    

}
} 





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


public class MeineGUI extends JPanel{ 

int kx;
int ky;
int [][] spieldaten = new int [12][12];


public MeineGUI(int x, int y){
  System.out.println("GUI Breite "+getWidth()+" hoehe "+getHeight());
kx=x; 
ky=y;

}


public setzeSchiff (int x, int y, int length, boolean senkrecht){

if (senkrecht == true){

for (int y; y < length; y++;) {
System.out.println(spieldaten[x][y]);
spieldaten[x][y].setBackground(new Color (0x00FF00); 

}


} else {

for (int x; x < length; x++;) {

System.out.println(spieldaten[x][y]);
spieldaten[x][y].setBackground(new Color (0x00FF00);

}
}
}

public void paintComponent(Graphics g){
int kBreite = getWidth()/ kx;
int kHoehe = getHeight()/ ky;
System.out.println("breite "+getWidth()+" hoehe "+getHeight());
g.setColor(Color.red); 



      for (int i = 0; i<kx;i++){
      g.drawLine(i * kBreite, 0, i * kBreite, getHeight());
      }

    for (int i = 0; i<ky;i++){
    g.drawLine(0, i * kHoehe, getWidth(), i* kHoehe);

    }
}
}
 
Also ein Problem, welches ich direkt sehe:

Java:
public setzeSchiff (int x, int y, int length, boolean senkrecht){
    for (int y; y < length; y++)

Hier hast Du einen Parameter y und in der for schleife deklarierst Du eine lokale Variable y, die Du auch nicht initialisierst..

Was Wu willst, ist doch ein Zähler von 0 so lange hoch, wie es kleiner laenge ist um dann entweder auf [x+zähler][y] oder [x][y+zaehler] zuzugreifen.
 
Also ein Problem, welches ich direkt sehe:

Java:
public setzeSchiff (int x, int y, int length, boolean senkrecht){
    for (int y; y < length; y++)

Hier hast Du einen Parameter y und in der for schleife deklarierst Du eine lokale Variable y, die Du auch nicht initialisierst..

Was Wu willst, ist doch ein Zähler von 0 so lange hoch, wie es kleiner laenge ist um dann entweder auf [x+zähler][y] oder [x][y+zaehler] zuzugreifen.
Erstmal danke! Ich will den start x und start y wert der Schiffe in der Methode setzeSchiff übergeben und diese dann solang hochzählen lassen, wie die Länge der Schiffe ist. Danach will ich, dass sich die Werte im Array verändern und sie direkt einfärben, sodass man die farbigen Schiffe in der GUI sieht.
 
Also die x/y Werte sind ja der Startpunkt des Schiffes. Die würde ich nicht verändern. (Ich bin auch ein Befürworter, Parameter generell final zu machen!)

Aber die Koordinate geht doch vom Startwert bis hin zu Startert+length-1, also hast Du damit doch schon eine Beschreibung einer Schleife.
Und da ist dann auch immer gut, wenn man da aussagekräftige Namen bei Variablen und Parametern nimmt. denn sonst kommt man durcheinander, weil plötzlich mehrere x und y Werte vorhanden sind.

xStart / yStart wären da z.B. die Koordinaten.
In der Schleife wären es dann xCurrent/yCurrent oder so.

Vielleicht fallen dir auch noch bessere Namen ein - das ist jetzt ein Ansatz ohne viel Nachdenken. (Beim Entwickeln nimmt man einfach das erst Beste, das einem einfällt. Aber dafür ist der wichtigstes Shortcut in der IDE immer das Refactoring->Rename - also bei mir in IntelliJ Shift F6.
Denn wenn man beim betrachten des Codes einen besseren Namen findet, dann wird der schnell gesetzt.
 
Also die x/y Werte sind ja der Startpunkt des Schiffes. Die würde ich nicht verändern. (Ich bin auch ein Befürworter, Parameter generell final zu machen!)

Aber die Koordinate geht doch vom Startwert bis hin zu Startert+length-1, also hast Du damit doch schon eine Beschreibung einer Schleife.
Und da ist dann auch immer gut, wenn man da aussagekräftige Namen bei Variablen und Parametern nimmt. denn sonst kommt man durcheinander, weil plötzlich mehrere x und y Werte vorhanden sind.

xStart / yStart wären da z.B. die Koordinaten.
In der Schleife wären es dann xCurrent/yCurrent oder so.

Vielleicht fallen dir auch noch bessere Namen ein - das ist jetzt ein Ansatz ohne viel Nachdenken. (Beim Entwickeln nimmt man einfach das erst Beste, das einem einfällt. Aber dafür ist der wichtigstes Shortcut in der IDE immer das Refactoring->Rename - also bei mir in IntelliJ Shift F6.
Denn wenn man beim betrachten des Codes einen besseren Namen findet, dann wird der schnell gesetzt.
Ok danke, ja ich dachte mir, dass die startX und startY Koordinaten die Zeilen und Spalten angeben indem das Schiff startet, danach will ich entweder (wenn es senkrecht ist oder nicht) die startY oder die startY Koordinate bis zur Schifflänge hochzählen, damit dass Schiff in der GUI und im Array sichtbar wird...Hoffe, dass ist jetzt verständlicher...Hab ich etwas vergessen, danke im vorraus!
 
@kevkev Ist Deine Frage mit der Antwort von @kneitzel jetzt beantwortet? Dann solltest Du das auch markieren. Ich frage auch, weil Dein letzter Kommentar etwas geheimnisvoll bleibt: stecken da weitere Fragen drin oder soll das nur eine Zusammenfassung der Antwort sein?
 

Zurück
Oben