# Schiffe versenken funktioniert nicht



## FreshlyChicken (6. Oktober 2018)

Moin, 

hier erstmal der Code 

//Die 5 ausgewählten Zahlen
int[] randomZahl = {3,6,8,9,4};

void setup(){  

  size(500,500);

}

void draw(){

  line(100,0,100,500);
  line(200,0,200,500);
  line(300,0,300,500);
  line(400,0,400,500);
  line(500,100,0,100);
  line(500,200,0,200);
  line(500,300,0,300);
  line(500,400,0,400);

}

void mouseClicked(){

  int a = 0;

  //Zeile 1

if(mouseX<=100 && mouseY<=100){
   rect(0,0,100,100);
   a = 1;
  }

else if(mouseX<=200 && mouseX>=100 && mouseY<=100 && mouseY>=0){
   rect(100,0,100,100);
   a = 2;
  }

else if(mouseX<=300 && mouseX>=200 && mouseY<=100 && mouseY>=0){
   rect(200,0,100,100);
   a = 3;
  }

else if(mouseX<=400 && mouseX>=300 && mouseY<=100 && mouseY>=0){
   rect(300,0,100,100);
   a = 4;
  }

else if(mouseX<=500 && mouseX>=400 && mouseY<=100 && mouseY>=0){
   rect(400,0,100,100);
   a = 5;
  }   

 //Zeile 2

else if(mouseX<=100 && mouseX>=0 && mouseY<=200 && mouseY>=100){
   rect(0,100,100,100);
   a = 6;
  }

else if(mouseX<=200 && mouseX>=100 && mouseY<=200 && mouseY>=100){
   rect(100,100,100,100);
   a = 7;
  }

else if(mouseX<=300 && mouseX>=200 && mouseY<=200 && mouseY>=100){
   rect(200,100,100,100);
   a = 8;
  }

else if(mouseX<=400 && mouseX>=300 && mouseY<=200 && mouseY>=100){
   rect(300,100,100,100);
   a = 9;
  }

else if(mouseX<=500 && mouseX>=400 && mouseY<=200 && mouseY>=100){
   rect(400,100,100,100);
   a = 10;
  }

  //Zeile 3

else if(mouseX<=100 && mouseX>=0 && mouseY<=300 && mouseY>=200){
   rect(0,200,100,100);
   a = 11;
  }

else if(mouseX<=200 && mouseX>=100 && mouseY<=300 && mouseY>=200){
   rect(100,200,100,100);
   a = 12;
  }

else if(mouseX<=300 && mouseX>=200 && mouseY<=300 && mouseY>=200){
   rect(200,200,100,100);
   a = 13;
  }

else if(mouseX<=400 && mouseX>=300 && mouseY<=300 && mouseY>=200){
    fill(0);
   rect(300,200,100,100);
   a = 14;
  }

else if(mouseX<=500 && mouseX>=400 && mouseY<=300 && mouseY>=200){
   rect(400,200,100,100);
   a =  15;
  } 

  //Zeile 4

else if(mouseX<=100 && mouseX>=0 && mouseY<=400 && mouseY>=300){
   rect(0,300,100,100);
   a = 16;
  } 

else if(mouseX<=200 && mouseX>=100 && mouseY<=400 && mouseY>=300){
   rect(100,300,100,100);
   a = 17;
  } 

else if(mouseX<=300 && mouseX>=200 && mouseY<=400 && mouseY>=300){
   rect(200,300,100,100);
   a = 18;
  } 

else if(mouseX<=400 && mouseX>=300 && mouseY<=400 && mouseY>=300){
   rect(300,300,100,100);
   a = 19;
  }   

else if(mouseX<=500 && mouseX>=400 && mouseY<=400 && mouseY>=300){
   rect(400,300,100,100);
   a = 20;
  }   

  //Zeile 5

else if(mouseX<=100 && mouseX>=0 && mouseY<=500 && mouseY>=400){
   rect(0,400,100,100);
   a = 21;
  }  

else if(mouseX<=200 && mouseX>=100 && mouseY<=500 && mouseY>=400){
   rect(100,400,100,100);
   a = 22;
  } 

else if(mouseX<=300 && mouseX>=200 && mouseY<=500 && mouseY>=400){
   rect(200,400,100,100);
   a = 23;
  }  

else if(mouseX<=400 && mouseX>=300 && mouseY<=500 && mouseY>=400){
   rect(300,400,100,100);
   a = 24;
  }

else if(mouseX<=500 && mouseX>=400 && mouseY<=500 && mouseY>=400){
   rect(400,400,100,100);
   a = 25;
  } 

for(int i = 0; i <= 25;++i){

if(randomZahl_ == a){
 fill(0);
  }

else{
fill(255);
}
}   

}_


----------



## Olstyle (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Du hast ein Array mit Länge 5 und greifst darauf mit einem Index bis zu 25 zu.


----------



## Malkolm (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

randomZahl[] hat 5 Elemente laut Zeile 1.
Deine for Schleife itteriert von 0 bis 25. Bei Schritt i==5 sollte also der Vergleich randomZahl_ den Fehler hervorrufen, da es kein solches Element gibt.

Wenn du uns sagst, was der Code tun soll (soll geprüft werden ob die Zahl a in randomZahl enthalten ist?) kann man dir weiterhelfen._


----------



## FreshlyChicken (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Also das Problem wurde schon gelöst. statt 25 wurde randomZahl.length eingebaut in die for- Schleife. Funktioniert. Ja randomZahl soll prüfen ob a in dem array enthalten ist und soll dann das entsprechende Kästchen schwarz färben. Das funktioniert nicht so ganz.


----------



## Olstyle (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Vielleicht solltest du Mal am Stück aufschreiben was du vor hast und was nun geht und was nicht.
Eventuell merkst du dabei schon selbst deinen Fehler.


----------



## FreshlyChicken (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

@Olstyle Ich muss für eine Hausaufgabe ein einfaches Schiffe versenken Spiel programmieren. Dabei sollen vorher 5 Quadrate von 25 ausgewählt werden die die Schiffe symbolisieren. Bei einem Klick auf ein Feld soll dieses entweder Rot werden wenn es nicht das "Schiff" ist und Blau (Oder irgendetwas anderes) wenn das Schiff getroffen wurde. 

Also habe ich ein Array erstellt und darin die 5 zufällig gewählten Werte eingetragen. Dann habe ich die 25 Kästchen gemacht die einzeln angeklickt und eingefärbt werden können. Dann habe ich jedem Kästchen eine nummer von 1-25 gegeben. Nun soll eine Schleife den Array immer wieder abfragen ob dieser Wert, hier a, in dem Array enthalten ist und wenn ja soll er dieses einfärben in dieser Farbe und wenn nicht dann soll er es in dieser Farbe einfärben. Der Wert wird bei jedem Durchlauf um 1 erhöht.

Das Problem ist nun das ich nicht weiß wo mein Fehler liegt.


----------



## Olstyle (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Offensichtlich ist ja nicht die Überschrift das Problem und der Code vorne nicht der aktuelle Originalcode.
Also nochmal die Frage: Was geht(passiert überhaupt was beim Mausklick?) und was nicht?


----------



## FreshlyChicken (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

http://extreme.pcgameshardware.de/p...ert-nicht-so-wie-ich-moechte.html#post9534368


----------



## Olstyle (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Du kannst den Startpost hier editieren. 
Und du hast immer noch nicht geschrieben WAS nicht passiert.
Also läuft die Schleife garnicht an, findet sie A nicht, oder wird die nicht eingefärbt wie gewünscht?


----------



## FreshlyChicken (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Es soll ja die angegebenen 5 Felder eingefärbt werden wenn man darauf klickt die im Array stehen. a = beschreibt welches Feld welches ist. Wenn es nicht das im Array festgelegte Feld ist soll es Weiß bekommen. Aber es ist egal welches ich anklicke es wird weiß und die im Array angegeben Felder eben auch und ich weiß nicht wieso


----------



## Olstyle (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Na dann halt doch Mal mit dem Debugger an der For-Schleife an und schau dir an was für ein A dort steht und step anschließend durch die Schleife und schau ob der Branch für A==Zufallszahl erreicht wird.
Edit: So Wie der Code jetzt aussieht indexiert du dein Array garnicht mehr sondern vergleichst das gesamte Array mit der Zahl, das ist natürlich niemals "true".


----------



## Malkolm (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Welche Sprache ist das denn? Oder ist das PseudoCode?
Was mir spontan auffällt ist, dass fill() keinen bezug zu einem rect hat (oder setzt du damit eine art brush?). Ausserdem ist deine if- Verkettung nicht eindeutig.


----------



## FreshlyChicken (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Das ist eine Schulaufgabe, Sprache Java und nein kein PseudoCode leider.  Ich weiß nicht was ein Brush, Branch oder so ist. Ich will einfach nur Schiffe versenken . Die Aufgabe war es ein einfaches Schiffe versenken zu programmieren, 25 Quadrate zu haben, vorher festzulegen welches Quadrat ein "Schiff" sogesagt ist und wenn man auf das richtige Feld klickt soll es eingefärbt werden. Wenn es falsch ist eine andere Farbe wo man erkennt das es falsch ist. Der Spieler hat dabei nur 5 Versuche danach wird in der Konsole ausgegeben das er verloren hat und es fängt von vorne an.


----------



## FreshlyChicken (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

Wie könnte ich es also nach dieser Aufgabe hin programmieren weiter?


----------



## Malkolm (6. Oktober 2018)

Ein paar grundlegende Tipps zur Herangehensweise:
- Zerlege das Problem in kleinere Probleme. Bedeutet hier: Baue dir kleinere Funktionen mit nur einer konkreten Aufgabe. Z.B: drawLines(), drawBattlefield(), changeStateOnClick()
  -> Teste jedes Unterproblem einzeln. Z.B. mit nur einem Rechteck und schaue ob das erkennen des Klicks und das Einfärben funktioniert. Erweitere das Problemauf zwei Rechtecke.Klappt das,  gehen auch 25.

Konkret:
- Deine Schleife führt derzeit mehrmals einen fill() aus. Damit werden potentiell korrekte fill()s später wieder überschrieben, z.B. wenn a nicht der letzte richtige Eintrag in randomZahl ist.


----------



## Malkolm (6. Oktober 2018)

*AW: ArrayIndexoutOfBoundsException*

So in der Art würde ich es lösen (nicht getestet, einfach runtergeschrieben):


```
void mouseClicked() {
    if(mouseX >= 500 || mouseY >= 500) return;

    int col = mouseX / 100; //0-99 -> 0, 100 - 199 -> 1, ...
    int row = mouseY / 100;
    int currentField = (row * 5) + col + 1; // Dein "a"

    bool hit = false;
    for(int iNumber = 0; iNumber < randomZahl.size(); ++iNumber) {
        if(randomZahl[iNumber] == currentField) {
            hit = true;
        }
    }

    rect(col * 100, row * 100, 100, 100) // draw rect
    if(hit){
        fill(0);
    } else {
        fill(255);
    }

}
```


----------



## FreshlyChicken (6. Oktober 2018)

unexpected token für "if(hit)"


----------



## Malkolm (6. Oktober 2018)

Da fehlt ein ; in der Zeile vorher. Wie gesagt, nicht getestet. Ging ja auch nur um einen Denkanstoss


----------



## FreshlyChicken (6. Oktober 2018)

Edit: Funktioniert super, Vielen Dank


----------



## Malkolm (6. Oktober 2018)

Dann taste dich doch schritt für schritt vor. Versuche z.B. überhaupt erstmal ein weißes rechteck zu zeichnen. Muss evtl. fill() vor rect() stehen?


----------



## SimonG (6. Oktober 2018)

Müsst ihr unbedingt das Rad neu erfinden? Mit einem GUI-Framework (z.B. Swing) kann man sich das ganze Gefrickel mit Linien, Rechtecken und Mauspositionen sparen.

Meine Lösung hat (inklusive imports usw.) 65 Zeilen. Meine "Rects" sind erweiterte JButtons in einem 5x5 GridLayout. Im ActionListener (also bei Klick) wird geschaut ob es ein Treffer ist und die Farbe entsprechend geändert. Den Rest kann man sich denken: Versuche und Treffer zählen usw.


----------



## Malkolm (6. Oktober 2018)

SimonG schrieb:


> Müsst ihr unbedingt das Rad neu erfinden?



Wenn man etwas lernen möchte, oder es sogar um Hausaufgaben geht: Ja, das ist Ziel der Übung.




> Meine Lösung hat (inklusive imports usw.) 65 Zeilen


Wir sollten dir einen Schrein errichten und deinen Namen huldigen.


----------



## FreshlyChicken (6. Oktober 2018)

Meine Lösung hat 55 Zeilen. Musst du immer das Rad neu erfinden?


----------



## SimonG (6. Oktober 2018)

FreshlyChicken schrieb:


> Meine Lösung hat 55 Zeilen. Musst du immer das Rad neu erfinden?


Ich wollte nur in Erfahrung bringen ob mein Lösungssatz erlaubt wäre, weil mir das Gerechne mit Pixel-Positionen umständlich vorkam.

Update: da du die Aufgabe ja scheinbar gelöst hast, kann ich bedenkenlos meine Lösung hier verlinken. Vielleicht hilft es ja mal jemandem.

Mit Swing: [Java] package battelships;    import java.awt.Color;  import java.awt.GridLayout;  imp - Pastebin.com
Ohne Swing: [Java] package battelships;    import java.awt.Canvas;  import java.awt.Color;  import  - Pastebin.com


----------

