# Viergewinnt Gewinner ermitteln



## lorenzoo (20. Jan 2016)

Hallo

Ich habe ein kleines Viergewinnt Programmiert mein Problem ist das er nicht erkennt wer gewonnen hat.. Das Spielfeld hat 7x6 Felder.
hier ist mein Code abschnitt.
Ich habe Stunden Probiert das zu lösen doch meine Java Kentnisse reichen dafür nicht aus.
Ich hoffe Ihr könnt mir helfen
MFG


----------



## Joose (21. Jan 2016)

lorenzoo hat gesagt.:


> hier ist mein Code abschnitt.


Du kannst deinen Code auch direkt im Forum posten mittels
[JAVA] /* dein code hier */ [/JAVA]



lorenzoo hat gesagt.:


> Ich habe Stunden Probiert das zu lösen doch meine Java Kentnisse reichen dafür nicht aus.


Das Problem hat nichts mit fehlenden Java Kenntnissen zu tun 



lorenzoo hat gesagt.:


> Ich hoffe Ihr könnt mir helfen



Ich deinen Methoden überprüfst du ob ein Feld & das nachfolgende Feld mit einer Münze vom gleichen Spieler belegt ist. Addierst dann etwas zusammen und hoffst das es passt.
Vorschlag: Du gehst Zeile für Zeile, Spalte für Spalte durch. Sobald du eine Münze gefunden hast wird ein Zähler (beginnend bei 0) um 1 erhöht. Dann schaust du dir das nächste Feld an, Münze vorhanden? Gleiche Farbe wie voherige? Wenn ja Zähler wieder um 1 erhöhen, wenn nein Zähler auf 1 zurücksetzen.
Sobald der Zähler auf 4 erhöht wurde hast du einen Gewinner gefunden.

Bei deiner jetztigen Kontrolle gibt es ein paar Fehler.
gewinnzeile: Du gehst zwar 6 Zeilen durch, aber nur 4 Spalten? Die Summe beginnt bei 1 zu zählen, wird aber nur erhöht wenn die summe >= 4 ist?
gewinnspalte: Hier auch wieder 4 Spalten statt 7 , du gibst jedesmal wenn 2 gleichen Steine gefunden wurde "gewinnt in der Spalte!" aus anstatt das nur zu machen wenn 4 gleiche gefunden wurde.


Anmerkungen zu deinem Code:
Die Wahl deiner Methodennamen ist nicht die Beste. Methoden beschreiben Tätigkeiten und sollten auch entsprechend benannt werden, außerdem sollte man anhand des Namens erkennen was die Methode macht.
Bei "gewinnzeile" weiß ich nicht was die Methode machen soll, wenn du sie stattdessen "pruefeObVierInEinerZeile" nennst (Achtung: auf lowerCamelCase achten!) wird das schon klarer. Der Name ist zwar länger aber dafür eindeutiger.
Gleiches gilt auch bei "gewinnspalte" (pruefeObVierInSpalte) und "muenzensetzenfeld" (setzeMuenzFeld).

In "gewinnzeile" und "gewinnspalte" erstellst du jeweils ein 2d Mueze Array mit den Namen "konsole". Es ist unnötig hier extra eine neue Variable zu deklarieren, arbeite doch einfach mit Muenze[][] weiter welches du als Parameter übergibst.
Benenne den Parameter statt "s" halt sprechend 

Deine Kommentare beschreiben nur was dein Code macht, das ist nicht zielführend. Schon anhand des Methodennamens sollte erkennbar sein was in der Methode gemacht wird.
Den genauen Ablauf kann man sich dann selbst durchlesen indem man sich den Code anschaut.

Man sollte immer zuerst pruefen ob etwas != null ist und erst dann damit arbeiten. Wenn du erst danach pruefst ob etwas vorhanden ist, kann davor schon eine NullPointerException geflogen sein.

Und ein großer Kritikpunkt ist die Formatierung deines Codes!

```
if((konsole[zeile][spalte])==(konsole[zeile][spalte+1])
&& konsole[zeile][spalte] != null
&& konsole[zeile][spalte+1] != null)
   if(summe>=4)
   {summe=summe+1;
   if(summe>=4)
   {return true;}}
   else {summe=1;}
```

Dieses Stück ist einfach nur schwer zu lesen.
1) Auch wenn der Inhalt von einer Schleife oder einer if-Bedingung nur ein Block/Statement ist verwende am besten immer Klammern.
2) Achte auf die korrekte Einrückung von Code, das 3.if innerhalb des 2.if laut deiner Einrückung aber nach dem 2.if
3) Quetsche nicht alles ohne Leerzeichen in eine Zeile, man soll zwar Code kurz und knackig halten, aber dabei soll der Code eben lesbar und verständlich bleiben!

Hier mal ein Vorschlag für eine schönere Formatierung (und die anderen Kritikpunkte sind auch beachtet):

```
public boolean pruefeObVierInZeile(Muenze[][] spielfeld) {
   for (int zeile = 0; zeile < 6; zeile++) {
     int summe = 1;
     for (int spalte = 0; spalte < 6; spalte++) { // nur bis zur 6.Spalte pruefen, da die nachfolgende Spalte immer mitkontrolliert wird
       if(spielfeld[zeile][spalte + 1] != null
         && spielfeld[zeile][spalte] != null
         && spielfeld[zeile][spalte] == spielfeld[zeile][spalte + 1]) {
         if(summe >= 4) {
           summe = summe + 1;
           if(summe >= 4) {
             return true;
           }
         } else {
           summe = 1;
         }
       }
     }     
   }
   return false;
}
```


----------



## lorenzoo (21. Jan 2016)

Guten Abend 
Ich bedanke mich bei dir Joose. Mein Problem ist das er jetzt ein(java.lang.ArrayIndexOutOfBoundsException 6) Fehler meldet. Ich weis dases ein Array Problem ist, doch leider find ichs nicht  kann ja auch sein das ich zu müde vom Arbeiten bin... Ich habe so weit ich gekommen bin mal alles abgeändert. Du hasst Recht meine Methoden sollte ich au noch ändern. Die Kommentare sollte ich drin lassen da es mein Dozent von mir verlangt. Den Fehler habe ich in die Kommetare markiert.
Hoffentlich Nerve ich euch nicht ich habe vor lauter Code den Kopf nicht bei der Sache. 
Mfg


----------



## Joose (21. Jan 2016)

Ja du greifst mit einem zu hohen Index auf das Array zu.
Gehe deine Schleife 
a) mit dem Debugger deiner IDE 
b) per Schreibtischtest
c) mit Hilfe von Konsolenausgaben
durch um zu sehen was genau passiert und warum der Fehler auftaucht.


----------

