Variablen Funktion übergibt den Wert nicht

Apri

Mitglied
Hey, ich hab hier ein kleines Projekt begonnen den ich als Übung mir vorgenommen habe, bin noch dazu sehr frisch in diesem Gebiet. Ich will jetzt nicht lang drum herum reden. Mein Problem: Ich hab hier die Funktion "karte", dieser sollte meinem Array eine zufällige Zahl zwischen 1 und 13 vergeben. Und der "Zaehler" sollte die Werte von "d" und "s" immer um eins erhöhen.
Java:
import java.util.Random;

public class Main {

    public static void main(String[] args) {
    int [] Dealer = new int [6];
    int d = 0;
    int [] Spieler = new int [6];
    int s = 0;
    karte(Dealer,d);
    karte(Spieler,s);
    karte(Dealer,d);
    karte(Spieler,s);


    System.out.println(arrAdd(Dealer));
    System.out.println(arrAdd(Spieler));
    }
    public static int arrAdd (int array[]) {
        int a = 0;
        for (int c=0; array.length > c; c++){
            a = a + array[c];
        }
        return a;
    }

    public static void karte (int arr [], int zaehler){
        Random rnd = new Random();
        int b = rnd.nextInt(13) + 1;
        if(arr.length > zaehler ) {
            arr[zaehler] = b;
            zaehler++; //Der Wert zaehler/d/s sollte hier um 1 steigen.
        }else{
            System.out.println("Fehler");
        }
    }
}
 
Wenn du innerhalb einer Methode einen Parameterwert per Zuweisung (=) oder Inkrement/Dekrement änderst, hat das keine Auswirkung auf den Aufrufer der Methode. Java verwendet "Call-by-Value".
Also:
Java:
private static void increment(int a) {
  a++;
}
public static void main(String[] args) {
  int a = 1;
  System.out.println(a); // <- "1"
  increment(a);
  System.out.println(a); // <- "1"
}

Du bräuchtest entweder eine Variable (Klassenvariable oder Instanzvariable), in der du den Wert speicherst und erhöhst. Oder du verwendest/"missbrauchst" den Rückgabewert deiner "karte"-Methode, um den erhöhten Wert zurückzuliefern, so dass der Aufrufer diesen seiner eigenen lokalen Variablen zuweisen kann.
 
Vielen Dank für deine Hilfe. Ich weiß zwar grad nicht genau wie ich weiter Coden soll, aber dank deiner Hilfe weiß ich zumindest worans liegt und wo ich nach einer Lösung suchen muss.
 
Na, schau Dir mal an, wie Du es bei arrAdd gemacht hast. Das (der Rückgabewert) wäre eine Möglichkeit.

Unabhängig davon: in Java schreibt man Bezeichner per Konvention für Methoden, Parameter und Variablen in lowerCamelCase (z. B. dealer, nicht Dealer). Namen von Klassen und anderen Typen in UpperCamelCase.
 
Ja dann müsste ich aber den return wert jedesmal nachdem ich die Funktion aufgerufen hab an meinem integer d/s übergeben. Dann könnte ich genau so in meiner main Methode einfach d++ /s++ machen und ich käme aufs gleiche. Und bei "arrAdd" verwende ich a nur um die Summe meines Arrays auszugeben. Ich wollte halt alles irgendwie in einer Funktion einpacken das 1. Mein Code Ordentlich aussieht 2. Das alles Systematisch abläuft. Wie gesagt noch gaaanz am Anfang der Lernphase. Und das mit dem Bezeichner wusste ich nicht. 🙂 Aber danke dafür, werde ich mir merken.
PS: Sollte ein simples Blackjack sein. :/
 
Dann könnte ich genau so in meiner main Funktion einfach d++ /s++ machen und ich käme aufs gleiche.
Jein, das ist eine Frage der Zuständigkeiten. Richtig wäre, wenn Du eine separate Klasse schreibst, die als Instanzvariable den zaehler selbst verwaltet (oder Du nimmst gleich eine List her, die macht das dann automatisch 🙂)

Als Funktion könntest Du auch hergehen und das Array einfach füllen lassen, dann können auch keine Fehler auftreten:
Java:
    public static void karten(int[] arr){
        Random rnd = new Random();
        for (int i = 0; i < arr.length; i++) {
            int b = rnd.nextInt(13) + 1;
            arr[i] = b;
        }
    }
 
Naja die eigentliche Funktion soll Karte für karte ausgeteilt werden. Und wen mein Array ausgefüllt wird, hab ich schon direkt 6 "Karten" gezogen was eigentlich auch nicht zu Blackjacks austeil System dazu passt.
Jeder Spieler und der Croupier erhalten zuerst eine offene Karte, danach erhält jeder Spieler − nicht aber der Croupier − eine zweite offene Karte ....Beginnend mit dem Spieler zur Linken des Croupiers kann nun jeder Teilnehmer solange weitere Karten verlangen („hit“, „Karte“ oder „carte“), bis er glaubt, nahe genug an 21 Punkte herangekommen zu sein und keine weitere Karte mehr will.... Sind alle Spieler bedient, zieht der Croupier seine zweite Karte. Hat er 17 oder mehr Punkte, muss er stehen bleiben, hat er 16 oder weniger Punkte, muss er eine weitere Karte ziehen
https://de.wikipedia.org/wiki/Black_Jack#Spielablauf
 
Naja die eigentliche Funktion soll Karte für karte ausgeteilt werden. Und wen mein Array ausgefüllt wird, hab ich schon direkt 6 "Karten" gezogen was eigentlich auch nicht zu Blackjacks austeil System dazu passt.
Jeder Spieler und der Croupier erhalten zuerst eine offene Karte, danach erhält jeder Spieler − nicht aber der Croupier − eine zweite offene Karte ....Beginnend mit dem Spieler zur Linken des Croupiers kann nun jeder Teilnehmer solange weitere Karten verlangen („hit“, „Karte“ oder „carte“), bis er glaubt, nahe genug an 21 Punkte herangekommen zu sein und keine weitere Karte mehr will.... Sind alle Spieler bedient, zieht der Croupier seine zweite Karte. Hat er 17 oder mehr Punkte, muss er stehen bleiben, hat er 16 oder weniger Punkte, muss er eine weitere Karte ziehen
https://de.wikipedia.org/wiki/Black_Jack#Spielablauf
Deshalb wollte ich eben die Karten einzeln austeilen und die Array stellen einzeln vergeben, später soll auch noch die Nachfrage kommen ob der Spieler noch eine Karte will oder nicht, dies stellt aber in ersten Blick kein Problem dar. Was noch dazu gesagt gehört. Meisten Online Casinos machen es auch so das der Croupier eine zweite Karte bekommt, diese ist aber verdeckt bis alles Spieler bedient wurden. Ich will hier auch nicht Spiel-Regeln umändern damit es für mich leichter wird, es soll trotzdem eine gewisse Herausforderung darstellen.
 
Und wen mein Array ausgefüllt wird, hab ich schon direkt 6 "Karten" gezogen was eigentlich auch nicht zu Blackjacks austeil System dazu passt.
Da hast Du vollkommen Recht, ich war gedanklich bei Kartenspielen, bei denen man x Karten "auf der Hand" hat. Beim Blackjack hättest Du einen Kartenstapel, der gemischt und anschließend an die Spieler verteilt wird.
 
@mihe7 Kennt Blackjack nicht. 😀
So gesehen, hält der Spieler offengelegte Karten auch auf der Hand. Das ist möglich weil das Spiel per Regeln kein kollaboratives Spiel ist.
Im Grunde genommen, lässt es sich auch sehr gut simulieren, um zum Bleistift den Erwartungswert empirisch bestätigen zu können. 🙂
 
Unterschiede

Dann nenn es so 😛 17 und 4 wird meist nicht angeboten, da nur ein Deck; und dadurch ist auch der Erwartungswert anders. Zudem gibt es keine Insurance.... (welche eigentlich niemals gewählt werden sollte). Aber ein Unterschied ist auch, dass es nicht offen gespielt wird. Und damit: Guten Morgen. 😀
 
Guten Morgen, da sieht man mal, dass ich kein Spieler bin. Ich wusste gar nicht, dass es da Unterschiede gibt 😕
 
Ich wusste das ad hoc auch nicht. 😀
Wichtig ist, nicht vergessen, Glücksspiel macht süchtig und leert den Geldbeutel. 🙁
 

Zurück
Oben