Uri: Fehler in eine if-Bedingung feststellen

Hallo,

ich habe vor 3 Tagen angefangen Javascript zu lernen und möchte einen Programm bauen, das 32 Karten an vier Spieler verteilt.

Dazu habe ich für jeden Spieler einen array derfiniert und für jede Karte eine Variable.
Die Funktion teilekr13 soll z.B Kreuz König an einen der Spieler verteilen und das ganze mache ich dann mit jede Karte.
Aus irgend einem Grund werden manche Karten nicht nur einmal zugeordnet und andere überhaupt nicht.
Ich verstehe aber nicht wo der Fehler ist.

function teilekr13(){
var x=Math.random();
console.log(x);
if (x >0.75 && !(spieler1.length>=8)){
var NeustesElement = spieler1.push(kr13);
} else if(x>0.5 && !(spieler2.length>=8)){
var NeuestesElement = spieler2.push(kr13);
} else if (x >0.25 && !(spieler3.length>=8)){
var NeuestesElement = spieler3.push(kr13);
} else if(x>0 && !(spieler4.length>=8)) {
var NeuestesElement = spieler4.push(kr13);
} else {teilekr13();}}

Ich wäre froh, wenn mir einer einen Tipp geben könnte.

Uri

  1. Du machst aber nicht ernsthaft 32 einzelne Funktionen, die jeweils eine bestimmte Karte verteilen?

    Warum rufst du die Funktion im letzten else nochmal auf?

    !(spieler1.length>=8)

    Schreib doch da lieber (spieler1.length < 8), das ist viel lesbarer.

    Zu deiner eigentlichen Frage, die Antwort liegt sehr wahrscheinlich daran wie du die Funktionen für die Karten aufrufst. Das sieht man in deinem Beispiel nicht.

    Sinnvoller fände ich es, wenn du für jeden Spieler 8 zufällige Karten aus dem Stapel der noch nicht verteilten Karten aussuchst.

    1. Warum rufst du die Funktion im letzten else nochmal auf?

      Ich habe mir gedacht, dass für den fall, dass die Karte keinem Spieler zugeordnet werden kann, dass die funktion einfach wiederholt wird.
      Denk ich da falsch?

      Zu deiner eigentlichen Frage, die Antwort liegt sehr wahrscheinlich daran wie du die Funktionen für die Karten aufrufst. Das sieht man in deinem Beispiel nicht.

      function kartenteilen(){

      teilekr7();
      teilekr8();
      teilekr9();
      teilekr10();
      ... usw

      document.write(spieler1.join("  ") + "<br>");
      document.write(spieler2.join("  ") + "<br>");
      document.write(spieler3.join("  ") + "<br>");
      document.write(spieler4.join("  ") + "<br>");
      }

      Ich führe eine funktion Kartenteilen auf, die alle einzelnen Funktionen ausführt und ausgibt.

      Sinnvoller fände ich es, wenn du für jeden Spieler 8 zufällige Karten aus dem Stapel der noch nicht verteilten Karten aussuchst.

      Das habe ich mir auch überlegt, aber war mir nicht sicher, wie ich darstelle, welche karten nicht verteilt wurden ohne als if-bedingung jeden einzelnen Arrayelement zu nennen.

      1. Warum rufst du die Funktion im letzten else nochmal auf?

        Ich habe mir gedacht, dass für den fall, dass die Karte keinem Spieler zugeordnet werden kann, dass die funktion einfach wiederholt wird.
        Denk ich da falsch?

        Warum sollte es beim zweiten Durchlauf anders laufen? Die Zufallszahlen hast du alle komplett geprüft und wenn alle Spieler schon genug Karten haben, ändert sich auch nichts mehr.

        Das habe ich mir auch überlegt, aber war mir nicht sicher, wie ich darstelle, welche karten nicht verteilt wurden ohne als if-bedingung jeden einzelnen Arrayelement zu nennen.

        Such mal nach "Array zufällig sortieren" oder irgendsowas. Dann nimmst du den ersten Teil für Spieler 1, den zweiten für Spieler 2.
        Wenn du so anfängst wie du es zeigst, codest du dich kaputt und hast am Schluss ein unglaublich unflexibles System.

        Ich sehe dass du noch so gut wie gar keine Programmiererfahrung hast. Mach dich unbedingt mehr mit der Sprache vertraut.

  2. @@Uri:

    nuqneH

    Die Funktion teilekr13 soll z.B Kreuz König an einen der Spieler verteilen

    Und für jede der 32 Karten eine eigene Funktion? Du kopierst den Code und änderst jeweils nur die Bezeichner für Funktion und Karte?

    Das wäre ein sicheres Zeichen für schlechten Code. DRY! Don’t repeat yourself! Hieße: eine Funktion teile(karte) mit einem Parameter für die Karte.

    Aber sorum wird das wohl nichts. Verteile nicht die geordneten Karten nacheinander zufällig auf die Spieler (dabei aufpassen, dass alle 8 Karten bekommen), sondern mische die Karten und verteile sie gleichmäßig auf die Spieler.

    Und damit kein Spaghetti-Code dabei herauskommt, das Ganze objektorientiert. (<http://de.selfhtml.org/javascript/sprache/objekte.htm#eigene@title=Eigene Objekte definieren>)

      
    /**  
     * Objekt für eine Karte  
     * @param suit Farbe  
     * @param rank Kartenwert  
     */  
    function Card(suit, rank)  
    {  
        this.suit = suit;  
        this.rank = rank;  
    }  
      
    /**  
     * Objekt für ganzes Kartespiel  
     */  
    function Deck()  
    {  
        var suits = ['♦', '♥', '♠', '♣'],  
            ranks = ['7', '8', '9', '10', 'J', 'Q', 'K', 'A'],  
            cards = [];  
      
        // fülle das cards-Array mit den verschiedenen Karten von ♦7 bis ♣A  
        for (var suitIndex = 0; suitIndex < suits.length; suitIndex++)  
        {  
            for (var rankIndex = 0; rankIndex < ranks.length; rankIndex++)  
            {  
                cards.push(new Card(suits[suitIndex], ranks[rankIndex]));  
            }  
        }  
      
        /**  
         * Mischen  
         */  
        this.shuffle = function ()  
        {  
            cards.sort(function(a,b) { return Math.round(Math.random()); });  
        }  
      
        /**  
         * Austeilen  
         * @param n Anzahl der Karten  
         * @return Array  
         */  
        this.deal = function (n)  
        {  
            return cards.splice(0, n);  
        }  
    }  
      
    /**  
     * Objekt für einen Spieler  
     * @param name Name  
     * @param hand Blatt  
     */  
    function Player(name, hand)  
    {  
        this.name = name;  
        this.hand = hand;  
    }  
      
      
    // erzeuge neues Kartenspiel  
    var deck = new Deck();  
      
    // mische die Karten  
    deck.shuffle();  
      
    // Array für 4 Spieler  
    var numberOfPlayers = 4,  
        players = new Array(numberOfPlayers);  
      
    // benenne Spieler und gib allen jeweils 8 Karten  
    for (playerIndex = 0; playerIndex < players.length; playerIndex++)  
    {  
        players[playerIndex] = new Player('Player #' + (playerIndex + 1), deck.deal(8));  
    }  
      
    console.log(players);  
    
    

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. @@Gunnar Bittersmann:

      nuqneH

      /**
           * Mischen
           */
          this.shuffle = function ()
          {
              cards.sort(function(a,b) { return Math.round(Math.random()); });
          }

      Zu früh aufgehört zu lesen. So sollte man’s nicht machen, sondern …

      Qapla'

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      1. Hi,

        Zu früh aufgehört zu lesen. So sollte man’s nicht machen, sondern …

        Und warum nicht einfach shuffle(array &$array) benutzen?

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. @@MudGuard:

          nuqneH

          Und warum nicht einfach shuffle(array &$array) benutzen?

          Weil JavaScript != PHP.

          Qapla'

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    2. @Gunnar Bittersmann

      ich versuchs mal umzusetzen.

      danke