actual and formal argument lists differ in length

Zakon

Bekanntes Mitglied
Hallo,
wie aus meinen vorherigen Fragen schon entnommen werden kann Programmiere ich gerade ein Viergewinnt Spiel, dass sich selbst zufällig befüllt.
Mein Problem ist allerdings jetzt das ich den Code mit Methoden sortiert habe mir aber die Methoden nicht ausgebenlassen kann weil es ein falscher Datentyp ist.
Ich weiß aber icht wie ich das beheben soll, da ich ja diesen Datentyp (char) beibehalten muss.
Sorryfür den Ganzen Code da unten aber ich denke so einzelne Ausschnitte davon bringen nicht viel :)


[CODE lang="java" title="actual and formal argument lists differ in length"]public class Spiel {
public static void main (String[] args) {
new Spiel().spiele();
}

public void spiele() {
spielfeldleer();
spielfelbefullen();

waagerechtGewonnen();
senkrechtGewonen();
diagonalGewonnen();

if(gewonnen > 0) {
System.out.println("Sie haben gewonnen!");
}
else{
System.out.println("Es gibt keinen Gewinner");
}

}

private int regel = 4;//Anzahl der Steine in einer Reihe zum gewinnen
private int dimension = 5;//Spielfeld größe
public static final char stein = 'X';
private int gewonnen = 0;//Counter für 4er Reihen

//Spielfeld erstellen
public char[][] spielfeldleer() {
char[][] spielfeld = new char[dimension][dimension];

for (int y = 0; y < spielfeld.length; y++) {
for (int x = 0; x < spielfeld.length; x++) {
spielfeld[y][x] = (' ');
System.out.print(spielfeld[y][x] + " | ");
}
System.out.println(" ");
}
return spielfeld;
}


//Spielfeld befüllen
public void spielfelbefullen(char spielfeld[][]) {
Random r = new Random();

for (int y = 0; y < spielfeld.length; y++) {
for (int x = 0; x < spielfeld.length; x++) {
spielfeld[y][x] = r.nextBoolean() ? ' ' : stein;
System.out.print(spielfeld[y][x] + " | ");
}
System.out.println(" ");
}
}


//Waagerecht überprüfen
public int waagerechtGewonnen(char spielfeld[][]) {

int anzahlwa = 0;

for (int spalte = 0; spalte < spielfeld.length; spalte++) {
for (int zeile = 0; zeile < spielfeld.length; zeile++) {
if (spielfeld[spalte][zeile] == stein) {
anzahlwa++;
if (anzahlwa > 4) {
anzahlwa = 0;
}

}
if (spielfeld[spalte][zeile] != stein) {
anzahlwa = 0;
}
if (anzahlwa == regel) {
System.out.println("4 in einer Reihe waagerecht");
gewonnen++;
}
}
anzahlwa = 0;
}
return gewonnen;
}

//Senkrechte überprüfen
public int senkrechtGewonen(char spielfeld[][], char stein, int n) {

int anzahlse = 0;

for (int zeile = 0; zeile < spielfeld.length; zeile++) {
for (int spalte = 0; spalte < spielfeld.length; spalte++) {
if (spielfeld[spalte][zeile] == stein) {
anzahlse++;
if (anzahlse > 4) {
anzahlse = 0;
}

}
if (spielfeld[spalte][zeile] != stein
&& zeile < spielfeld.length - 1) {
anzahlse = 0;
}
if (anzahlse == n) {
System.out.println("4 in einer Reihe senkrecht");
gewonnen++;
}
}
anzahlse = 0;
}
return gewonnen;
}

//Diagonal übeprüfen
public int diagonalGewonnen(char spielfeld[][], char stein, int n) {

int anzahldi = 0;

for (int spalte = 0; spalte < spielfeld.length - 1; spalte++) {
for (int zeile = 0; zeile < spielfeld.length - 1; zeile++) {
if (spielfeld[spalte][zeile] == stein) {
anzahldi++;// anzahldi vielleicht in der Schleife erst definieren

int y = spalte;
int x = zeile;

while (x < spielfeld.length - 1
&& y < spielfeld.length - 1
&& spielfeld[y + 1][x + 1] == stein) {//Letzte nicht weil kein stein mehr kommt
anzahldi++;
x++;
y++;
if (anzahldi == n) {
System.out.println("4 in einer Reihe diagonal");
gewonnen++;
}
}
}
anzahldi = 0;
}
}
return gewonnen;
}
}[/CODE]
 

temi

Top Contributor
Kannst du bitte auch die Zeilennummer zur Fehlermeldung angeben? Dann muss man nicht soviel lesen ;)

Vermutlich rufst du irgendwo eine Methode auf und hast die falsche Anzahl an Parametern.

EDIT: Bereits der Aufruf von spielfeldBefüllen() erfordert die Angabe eines Parameters.
 

temi

Top Contributor
Tipp: Der Aufruf von spielfeldLeer() liefert ein Array zurück. Das wird von dir ignoriert. Sinnvoll wäre es dieses Array einer Variablen zuzuweisen und dann z.B. als Parameter für den nächsten Aufruf zu verwenden.
 

temi

Top Contributor
[CODE lang="java" title="Beispiel"]int getValue() {
return 42;
}

void printValue(int value) {
System.out.println(value);
}

int value = getValue(); // Ergebnis von getValue() wird der Variablen value zugewiesen
printValue(value); // die Variable wird als Parameter für den Aufruf verwendet
[/CODE]
 

Zakon

Bekanntes Mitglied
Werde mir das ganze mal
[CODE lang="java" title="Beispiel"]int getValue() {
return 42;
}

void printValue(int value) {
System.out.println(value);
}

int value = getValue(); // Ergebnis von getValue() wird der Variablen value zugewiesen
printValue(value); // die Variable wird als Parameter für den Aufruf verwendet
[/CODE]

in Ruhe angucken danke erstmal das du so schnell geantwortet hast. :)
 

Zakon

Bekanntes Mitglied
Tipp: Der Aufruf von spielfeldLeer() liefert ein Array zurück. Das wird von dir ignoriert. Sinnvoll wäre es dieses Array einer Variablen zuzuweisen und dann z.B. als Parameter für den nächsten Aufruf zu verwenden.
Aber ändert spielfeldbefullen() das char spielfeld nicht einfach ab, sodass ich das spielfeld einfach weiter benutzen kann? 🤔
 

temi

Top Contributor
Aber ändert spielfeldbefullen() das char spielfeld nicht einfach ab, sodass ich das spielfeld einfach weiter benutzen kann? 🤔
Die Variable "spielfeld" in der Methode spielfeldBefuellen() ist erst mal nur ein Parameter und somit eine lokale Variable der Methode. Wenn du in der Methodendeklaration einen Parameter angibst, dann musst du diesen Parameter beim Aufruf der Methode auch verwenden.

Java:
void doSomething() { // Methode hat keinen Parameter
    // code
}

// Aufruf

doSomething(); // Hier darf kein Parameter angegeben werden

void doSomethingWithParameter(int parameter) { // Methode hat einen Parameter vom Typ int
    int result = parameter + 42; // damit kannst du innerhalb der Methode etwas machen
} // ab hier verlieren sowohl "result", als auch "parameter" ihre Gültigkeit

// Aufruf

doSomethingWithParameter(42); // Hier muss ein Parameterwert vom Typ int angegeben werden

// oder
int value = 42;
doSomethingWithParameter(value); // geht auch

Ein Array ist ein etwas spezieller Typ. Eine Arrayvariable enthält nicht das Array selbst, sondern einen Verweis (Referenz) auf das Array, also auf die Stelle, an der sich das Array im Speicher befindet. Grob gesagt.

Diese Referenz wird an die Methode übergeben (als Parameter in deinem Fall) und damit zeigt die Referenz innerhalb der Methode auf das selbe Array wie außerhalb der Methode. Änderungen, die innerhalb der Methode am Array vorgenommen werden, sind damit auch außerhalb sichtbar. Damit hast du Recht. Da ändert aber nichts an der Tatsache, dass du den Parameter angeben musst.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Was für ein Spielfeld soll es denn abändern?

spielfeldLeer deklariert eine lokale Variable, setzt da Werte und gibt diese zurück.
spielfeldbefullen nimmt ein Spielfeld als Parameter entgegen und bearbeitet diesen dann.

==> Wenn eine Methode einen (oder mehrere) Parameter benötigt, dann musst Du diesen übergeben. Sonst kommt diese Fehlermeldung.
==> Wenn Du etwas in einer lokalen Variable erzeugst und zurück gibst, dann musst Du das irgendwo merken (also in eine Variable schreiben), damit es nicht verloren geht.
 
K

kneitzel

Gast
Vielleicht einfach zur Veranschaulichung ein kleiner Vergleich:

Die Methoden seien jetzt Menschen.

Du hast also eine Person, die sich einfach einen weißen Zettel nimmt, darauf mehrere Linien malt, so dass du schöne Kästchen auf dem Zettel hast. Diesen Zettel gibt es dann weg.

Du kannst also nun diesen Zettel entgegen nehmen und etwas damit machen. Du kannst es aber auch ignorieren - Wenn niemand den Zettel nimmt, dann landet er aber im Müll und der Müllmann (GC) kommt und entsorgt ihn.

Nun gibt es eine Person, der kannst Du sagen: Ich habe hier einen Zettel, mach was damit. Dann kann diese Person was in die Kästchen rein schreiben. Da es aber immer dein Zettel war, gibt dir die Person am Ende nichts. Super. Wenn Du der Person aber nur sagst: Mach was ohne so einen Zettel oder Du verweist auf eine Tasse Kaffe, dann kommt so eine Fehlermeldung zurück, die nichts anderes aussagt als: "Hey, willst Du mich verarschen? Du weißt doch, dass ich einen Zettel mit Kästchen brauche, die ich dann füllen kann!" ==> Das ist die Fehlermeldung, die dir der Compiler gegeben hat. Die besagt einfach nur: Da will eine Methode was anderes, als Du Ihr gegeben hast.
 

temi

Top Contributor
Ich befürchte fast, dass @Zakon jetzt völlig verwirrt ist ;)

Fang doch einfach mit kleinen Schritten an und erzeuge mit Hilfe deiner Methode spielfeldleer() ein Spielfeld und weise dieses erzeugte Spielfeld einer Variablen zu.

Im nächsten Schritt kannst du dann diese Variable als Parameter für die Methode spielfelbefullen() verwenden.

Java:
    public void spiele() {
        spielfeldleer(); // weise das Ergebnis der Methode einer Variablen zu
        spielfelbefullen(); // und verwende die Variable als Parameter dieser Methode

Ich glaub allerdings, genau das steht auch schon etwas weiter oben - ja - in #5.
 

Zakon

Bekanntes Mitglied
Ich habe das ganze jetzt so gelöst. Ihr habt mir echt weiter geholfen. Waren zwar ein bisschen viele Informationen auf einmal aber es hat ja dann doch geklappt 😁 Ich danke euch und danke für die super erklärungen :)

Java:
public void spiele() {
        char[][] spielfeldvoll = spielfelbefullen(spielfeldleer());

        waagerechtGewonnen(spielfeldvoll);
        senkrechtGewonen(spielfeldvoll);
        diagonalGewonnen(spielfeldvoll);
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S ArrayList.add Falsches Argument? Java Basics - Anfänger-Themen 1
M Argument in Integer verwandeln und das Doppelte davon printen Java Basics - Anfänger-Themen 9
K Operatoren The Operator * is undefined for the argument type(s) double, String Java Basics - Anfänger-Themen 4
H Argument bei Methode .toArray() Java Basics - Anfänger-Themen 8
V RMI - argument type mismatch Java Basics - Anfänger-Themen 1
V Operatoren Java if-else argument Java Basics - Anfänger-Themen 4
A Double[] Array zahlen per Argument übergeben Java Basics - Anfänger-Themen 5
L The operator && is undefined for the argument type(s) String, boolean Java Basics - Anfänger-Themen 8
H Methoden null-Argument bei varargs Java Basics - Anfänger-Themen 6
M Hochkomma in Argument Java Basics - Anfänger-Themen 7
V Erste Schritte Return ohne Argument Java Basics - Anfänger-Themen 6
M Argument der Kommandozeile überprüfen Java Basics - Anfänger-Themen 4
C Begriffe Parameter und Argument Java Basics - Anfänger-Themen 4
danielita Dateiname als Argument Java Basics - Anfänger-Themen 3
nabla Threads mit Argument? Java Basics - Anfänger-Themen 2
I Fehlendes Argument in Main-Methode abfangen Java Basics - Anfänger-Themen 15
A Klassennahmen über Kommandenzeile-Argument mitteilen Java Basics - Anfänger-Themen 2
X übergebenes Argument als Ziel Java Basics - Anfänger-Themen 7
L Dieses Problem nagt an meiner Würde - Argument * Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben