Schiffe versenken funktioniert nicht

FreshlyChicken

PC-Selbstbauer(in)
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);
}
}

}
 
Zuletzt bearbeitet:
AW: ArrayIndexoutOfBoundsException

Du hast ein Array mit Länge 5 und greifst darauf mit einem Index bis zu 25 zu.
 
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.
 
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.
 
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.
 
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.
 
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?
 
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?
 
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
 
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".
 
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.
 
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 :D. 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.
 
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.
 
AW: ArrayIndexoutOfBoundsException

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

Code:
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);
    }

}
 
Zuletzt bearbeitet:
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?
 
Zurück