2 Stimmen

Javascript ... Anzeigen von Werten

Ich erstelle ein Blackjack-Kartenspiel in JavaScript. Ich schätze Ihre bisherigen Kommentare. Ich suche nach Feedback, warum ich anscheinend nur die Funktion cardFace einmal innerhalb der Funktion cardDealer aufrufen kann. Derzeit gibt cardFace(0) mir einen Wert, während cardFace(1) oder eine andere Zahl nicht, es sei denn, es ist die einzige cardFace(x), die innerhalb der Funktion cardDealer aufgerufen wird. Über Ideen würde ich mich freuen. Vielen Dank

Der untenstehende Code ist nicht vollständig, aber ich glaube, genug Informationen daraus ablesen zu können. Danke

    function card(name, suit, face, value)
    {
        this.name = name;
        this.suit = suit;
        this.face = face;
        this.value = value;
    }

    aceOfHearts = new card("aceofhearts","hearts", "ass", 11);
    kingOfHearts = new card("kingofhearts","hearts", "könig", 10);
    queenOfHearts = new card("queenofhearts","hearts", "dame", 10);
    jackOfHearts = new card("jackofhearts","hearts", "bube", 10);
    tenOfHearts = new card("tenofhearts","hearts", "zehn", 10);
    nineOfHearts = new card("nineofhearts","hearts", "neun", 9);
    eightOfHearts = new card("eightofhearts","hearts", "acht", 8);
    sevenOfHearts = new card("sevenofhearts","hearts", "sieben", 7);
    sixOfHearts = new card("sixofhearts","hearts", "sechs", 6);

    var deck;
    deck = [];

    deck.push(aceOfHearts);
    deck.push(aceOfDiamonds);
    deck.push(aceOfClubs);
    deck.push(aceOfSpades);
    deck.push(kingOfClubs);
    deck.push(kingOfDiamonds);
    deck.push(kingOfHearts);
    deck.push(kingOfSpades);
    deck.push(queenOfClubs);
    deck.push(queenOfDiamonds);
    deck.push(queenOfHearts);
    deck.push(queenOfSpades);
    deck.push(jackOfClubs);
    deck.push(jackOfDiamonds);
    deck.push(jackOfHearts);
    deck.push(jackOfSpades);
    deck.push(tenOfClubs);
    deck.push(tenOfDiamonds);
    deck.push(tenOfHearts);
    deck.push(tenOfSpades);

    var cardDealer = function()
    {  
        fisherYates(deck);

        document.getElementById("yourFirstCard").textContent = "Ihre erste Karte ist " + cardFace(0) ;
        document.getElementById("yourSecondCard").textContent = "Ihre zweite Karte ist " + cardFace(1) ;

    };

    var cardFace = function(x)
    {   
        cardFace = deck[x].face;
        return cardFace;
    };

    var cardSuit = function(x)
    {
        cardSuit = deck[x].suit;
        return cardSuit;
    };

0voto

Vlad Punkte 2413

Hier ist, wo ich das Problem sehe:

var cardFace = function(x)
{   
    cardFace = deck[x].face;
    return cardFace;
};

Zuerst deklarieren Sie eine Variable namens cardFace und weisen sie einer Funktion zu. Was diese Funktion tatsächlich macht, ist, Ihre cardFace-Variable neu zuzuweisen und sie als Ergebnis zurückzugeben. Das war's, Ihre Funktion ist jetzt weg, Sie können nicht mehr darauf verweisen, da cardFace neu zugewiesen wurde.

Was Sie tun müssen, ist den Körper der Funktion so zu ändern, dass er die Variable nicht neu zuweist:

var cardFace = function(x)
{   
    var cardFaceValue = deck[x].face;
    return cardFaceValue;
};

Gleiches gilt für die cardSuit-Funktion.

0voto

dennmat Punkte 2501

Verschieben Sie cardFace über cardDealer oder ändern Sie es in eine function cardFace(x) Definition.

Das ist eine js Verhaltenssache. Funktionen, die im Format function x definiert sind, können aus dem darüber geschriebenen Code aufgerufen werden. Im Gegensatz dazu kann var x = function() nicht aufgerufen werden, da es zur Laufzeit bestimmt wird.

Siehe: http://ejohn.org/apps/learn/#4 für mehr Beispiele von Herrn Resig.

Probieren Sie es aus: http://ejohn.org/apps/learn/ es ist gut das durchzugehen.

BEARBEITEN: Es gibt auch viele gute Vorschläge, denen Sie in diesem Thread nachgehen sollten. Einschließlich der anderen veröffentlichten Antwort. Sie sollten sich mit Scopes befassen.

BEARBEITEN 2

Nachdem ich Ihren Code noch einmal angesehen habe, glaube ich, dass meine Lösung tatsächlich nicht die richtige war, da mir entgangen ist, dass cardFace innerhalb des Umfangs von cardDealer aufgerufen wird, was bedeutet, dass es wahrscheinlich definiert sein wird, wenn Sie cardDealer aufrufen. Ich denke daher, dass Sie, als Sie es in eine function geändert haben, möglicherweise eine Namensänderung vorgenommen haben, wie es die andere Antwort vorschlägt. Und ist tatsächlich die richtige Antwort.

//Testfunktion, die eine vordefinierte Funktion aufruft
var f = function() { x(); };
var x = function() { console.log('a'); }
f()
>>> a

// Testfunktion, die ihren eigenen Bereichsnamen modifiziert
var f = function() { f = 'test'; return f; };
f()
>>> "test"
f()
>>> TypeError: string is not a function

// Testfunktion, die ihren eigenen Bereichsnamen modifiziert, wenn als Funktion deklariert
function f() { f = 'test'; return f; };
f()
>>> "test"
f()
>>> TypeError: string is not a function

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X