2017-12-16 11 views
2

konvertieren Ich habe diesen einfachen Code in Python geschrieben, um eine kleine Kartenspiel zu erstellen, und ich möchte das gleiche mit Typoskript machen, aber ich bin mit einem großen Problem mit "das" in meiner Hauptklasse in Typoskript ist dies die ursprüngliche Klasse python:Wie behandelt man das in typescript/js? müssen Python-Code in Typescript

class deck: 
    card_type=['Hearts ','Diamonds','Spades','Clubs'] 
    card_rank=[2,3,4,5,6,7,8,9,10,'A','J','Q','K'] 
    full_deck=[] 

    def build_deck(self): 
     single={} 
     for card in self.card_type: 
      for n in self.card_rank: 
       single={n: card} 
       self.full_deck.append(single) 
     shuffle(self.full_deck) 


    def reshuffle (self): 
     print('Re-shuffling again!') 
     shuffle(self.full_deck) 


    def choose_card(self): 
     chosen=choice(self.full_deck) 
     the_index= self.full_deck.index(chosen) 
     self.full_deck.pop(the_index) 

     return chosen 

    def pick_hand(self, number_of_cards): 
     hand=[] 
     new_card={} 

     for i in range(number_of_cards): 
      new_card = self.choose_card() 
      hand.append(new_card) 

     return hand 

Und in meiner Haupt-Spiel-Datei kann ich so etwas wie diese:

from classes import deck 

deck1= deck() 
deck1.build_deck() 
my_hand=deck1.pick_hand(3) 
compu_hand=deck1.pick_hand(3) 

Aber wenn Ich versuche, eine ähnliche Klasse in Art Skript zu erstellen, schrieb ich folgendes:

export class deck { 

    single_card: { 
    cType: string; 
    cNumber: any; 
    }; 

    fullDeck: any[] = []; 
    card_type=['Hearts ','Diamonds','Spades','Clubs']; 
    card_rank=[2,3,4,5,6,7,8,9,10,'A','J','Q','K']; 

    shuffle() { 
    let counter = this.fullDeck.length; 

    // While there are elements in the array 
    while (counter > 0) { 
     // Pick a random index 
     let index = Math.floor(Math.random() * counter); 

     // Decrease counter by 1 
     counter--; 

     // And swap the last element with it 
     let temp = this.fullDeck[counter]; 
     this.fullDeck[counter] = this.fullDeck[index]; 
     this.fullDeck[index] = temp; 
    } 

    // return this.fullDeck; 
    } 


    buildDeck(){ 

    for (let t in this.card_type) { 
     for (let n in this.card_rank) { 
     this.single_card.cType = this.card_type[t]; 
     this.single_card.cNumber = this.card_rank[n]; 
     this.fullDeck.push(this.single_card); 
     console.log(this.single_card); 
     } 
    } 
    // this.shuffle() 

    } 

} 

Wenn ich versuche, wie so die Klasse aus der Haupt ‚ts‘ Datei zu verwenden:

import {deck} from './myclasses' 

$(document).ready (function(){ 
    let deck1= new deck; 
    deck1.buildDeck(); 
}); 

Die console.log Aufruf gibt den gleichen Fehler:

jQuery.Deferred exception: Cannot set property 'cType' of undefined TypeError: Cannot set property 'cType' of undefined at deck.buildDeck (file:///run/media/Work/HTML_Porjects/Game_TS/built/myclasses.js:132:44)

Wie ist es nicht definiert? Was muss ich tun, damit der Typescript-Code wie der Python-Code funktioniert?

Vielen Dank im Voraus ...

+0

Apologies, habe ich eine Antwort, die ich denke, _May been_ haben wild falsch. –

+0

Aber es scheint, als ob du 'single_card' seltsamerweise benutzt. Definieren Sie es nicht als Datentyp? Warum wird dann wie eine Objekteigenschaft verwendet? –

+0

Danke für die Antwort und ich habe versucht, die Pfeilfunktion funktioniert nicht –

Antwort

2

Der Fehler besagt lediglich, dass single_card nicht definiert ist, was es ist:

class deck { 

    single_card: { 
    cType: string; 
    cNumber: any; 
    }; 

    // … 
} 

Dies wird die Eigenschaft single_card auf der Typoskript Klasse deklariert, so dass der Compiler akzeptiert, wenn Sie auf die single_card Eigenschaft eines Objekts dieses Typs verweisen (z. B. wenn Sie this.single_card tun). Dies wird jedoch nicht tatsächlich ein Objekt dieses Typs dem Objekt zuweisen. Für das kompilierte JavaScript (wo die Typinformationen entfernt werden) existiert diese Eigenschaft nicht, da Sie sie nie zuweisen. Sie können dies leicht überprüfen, indem Sie die compiled JavaScript there betrachten.

Also, was Sie zuerst tun müssten etwas zu single_card ist zuweisen wie Sie in der Python-Version tat

this.single_card = {} 

Wenn Sie jedoch tatsächlich in Ihrer Python-Version aussehen, ist single_card kein Mitglied von das Objekt und es macht eigentlich keinen Sinn dafür zu sein. Damit erstellen Sie das Kartenobjekt, das Sie dann zum Array fullDeck hinzufügen. In Python ist es eine lokale Variable, so dass Sie es sich um eine lokale Variable in der Typoskript Version machen sollte:

buildDeck() { 
    for (const t of this.card_type) { 
    for (const n of this.card_rank) { 
     const single_card = { 
      cType: this.card_type[t], 
      cNumber: this.card_rank[n] 
     }; 
     this.fullDeck.push(single_card); 
    } 
    } 
} 

Btw. Sie möchten auch eine for…of Schleife dort anstelle von for…in verwenden.

Sie sollten auch darüber nachdenken, fullDeck korrekt eingegeben zu machen. Im Moment ist es ein Array von any, so dass es jedes Objekt speichern kann. Aber was Sie tun wollen, ist eigentlich nur Objekte dort zu halten, die so aussehen wie single_card aussieht.So betrachten einen Typ für diese Deklaration:

interface SingleCard { 
    cType: string; 
    cNumber: any; 
} 

Dann Sie richtig fullDeck eingeben können:

fullDeck: SingleCard[] = []; 
+0

Ihre Antwort war, was ich ziemlich dachte, war passiert, aber das Wissen fehlt, um die tatsächliche TS-Syntax zu wissen. Schöne Antwort –

+0

Vielen Dank für Ihre ausführliche Antwort, und ich stimme Ihnen zu, dass single_card kein Mitglied des Objekts sein sollte und es war nicht, aber während meiner fehlgeschlagenen Versuche habe ich es innen verschoben, aber jetzt habe ich es verschoben. Wie für Ihren Ratschlag hat es tatsächlich den Fehler behoben, aber aus irgendeinem Grund ist full_deck 52 Artikel der letzten Karte! 52 Kopie des gleichen Objekts! Wenn ich versuche, das Objekt single_card innerhalb der Schleife zu konsolieren, bekomme ich 52 verschiedene Karten, aber die Liste full_deck wird nur mit der letzten Karte gefüllt! Warum passiert dies? –

+0

Wenn Sie das selbe 'single_card'-Objekt weiterschieben und nur seine Eigenschaften aktualisieren, dann sind alle Objekte gleich. Sie sollten in jeder Iteration ein neues Objekt erstellen, wie ich es in meiner Antwort gezeigt habe (oder zumindest 'single_card = {} ', bevor Sie seine Eigenschaften zuweisen). – poke

Verwandte Themen