Hikarihoshi: Prüfung der Anzahl eines wertes in einem Array

Hi

Ich versuche mich gerade in JavaSkript einzuarbeiten, da ich gerne für den RPG Maker MV ein Plugin schreiben würde und dieser mit JS läuft. Da ich noch neu hier bin hoffe ich das ich nicht an der falschen stelle meinen Post gesetzt habe. Finde mich noch nicht so zurecht hier (schäm)

Wie gesagt bin ich noch anfänger und will mein kartenspiel in einem plugin einbringen, dazu wollte ich ein 20 Karten Deck einbauen das der Spieler aus 100 verschiedenen Karten erstellen kann.

Für die Karten habe ich ein Objekt gemacht und daten wie kartenID, Name und Werte als Attribut. Auch Funktionen wie die Werte vergleichen etc. sind schon fertig.

Mein prob. ist das ich das deck mit hilfe eines Arrays und der kartenID machen wollte, also ein Array das mit 20 kartenIDs gefüllt wird. Keine Karte ist der wert 0 und die Karten haben einen wert von 1 - 100.

Meine frage ist wie kann ich es machen das ich die stückzahl der gleichen kartenID mit ausnahme der 0 auf 3x begrenzt ist, also jede karte max. 3x im Deck sein darf?

Und wenn es ok ist hätte ich dann noch etwas (meiner meinung nach) kniffligeres. Die Karten mit der kartenID 1-5 sind im Spiel besonders selten und nur je ein mal zu finden, aber der Spieler sollte auch nur 1 dieser 5 Karten in das Deck tun können. Die Karten 99 und 100 sind Spezielle karten die nicht in das deck dürfen.

würde mich sehr freuen wenn ihr mir helfen könntet, oder mir einen Link schicken könntet wo ich mich in die Thematik einlesen/schauen könnte.

Wenn das Kartenspiel interessiert der kann sich gerne unter http://isilra.de/besonderheit/kartenspiel/ mein Kartenspiel anschaun, dort stehen die Regeln die ich mir ausgedacht habe und auch 98 der 100 karten sind dort zu sehen.

  1. Morgen,

    ein Teil des Objekts wäre hilfreich mit beispielen wie es in den Unterschiedlichen Fällen aussieht. Grundlegend bietet Javascript, für Arrays eine ganze menge Methoden um mit ihnen zu arbeiten.

    P.s. Willkommen.

    Gruß
    Jo

  2. Hallo Hikarihoshi,

    Mein prob. ist das ich das deck mit hilfe eines Arrays und der kartenID machen wollte, also ein Array das mit 20 kartenIDs gefüllt wird. Keine Karte ist der wert 0 und die Karten haben einen wert von 1 - 100.

    Meine frage ist wie kann ich es machen das ich die stückzahl der gleichen kartenID mit ausnahme der 0 auf 3x begrenzt ist, also jede karte max. 3x im Deck sein darf?

    Und wenn es ok ist hätte ich dann noch etwas (meiner meinung nach) kniffligeres. Die Karten mit der kartenID 1-5 sind im Spiel besonders selten und nur je ein mal zu finden, aber der Spieler sollte auch nur 1 dieser 5 Karten in das Deck tun können. Die Karten 99 und 100 sind Spezielle karten die nicht in das deck dürfen.

    würde mich sehr freuen wenn ihr mir helfen könntet, oder mir einen Link schicken könntet wo ich mich in die Thematik einlesen/schauen könnte.

    Ich würde nicht ein Array mit 20 Karten verwenden, sondern jedem Spieler ein Array mit 99 Karten zuordnen.

    var player0 = new Array();
    player0[0] = [20,0]; // Spieler0[ID der Karte] = erlaubte Anzahl, vorhandene Anzahl
    player0[1] = [1,0];
    
    // ...
    
    player0[6] = [3,0];
    
    // ...
    
    player0[98] = [3,0];
    

    Nach jeder Veränderung änderst du den Wert vorhandene Anzahl.

    Damit du nicht jedesmal über das ganze Array iterieren musst, kannst du die entsprechenden Anzahlen auch in eigenen Variablen speichern:

    var player0-number-cards = 0,
        player0-number-rare-cards = 0;
    

    Bei jeder Veränderung des Decks prüfst du

    // k sei gezogene Karte
    
    if ( player0-number-cards > 20 ) // ungültiger Spielzug
    if ( player0-number-rare-cards > 1 ) // ungültiger Spielzug
    if ( player0[k][1] > player0[k][0] ) // ungültiger Spielzug
    

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. Hallo Matthias,

      var player0 = new Array();
      

      Das soll man doch nicht machen. Besser wäre:

      var player = [];
      

      Und warum für jeden Spieler ein neues Array?

      var player = [
        spielerId = []
      ];
      

      Damit du nicht jedesmal über das ganze Array iterieren musst, kannst du die entsprechenden Anzahlen auch in eigenen Variablen speichern:

      Warum eine neue Variable? Die Länge des Arrays kann man doch mit player.length prüfen. Dann wäre:

      // k sei gezogene Karte
      // s sei die Spieler Id
      
      if ( player[s].length > 20 ) // ungültiger Spielzug
      if ( player[s].length > 1 ) // ungültiger Spielzug
      if ( player[s][k][1] > player[s][k][0] ) // ungültiger Spielzug
      

      Gruß
      Jo

      1. Was für mich nicht so ganz ersichtlich ist, was macht

        if ( player[s][k][1] > player[s][k][0] ) // ungültiger Spielzug
        // oder
        if ( player0[k][1] > player[k][0] )
        

        ???

        Das andere ist ja alles verständlich nur diese if sagt mir nichts.

        und danke für die schnelle hilfe :D

        1. Hallo Hikarihoshi,

          if ( player[s][k][1] > player[s][k][0] ) // ungültiger Spielzug
          // oder
          if ( player0[k][1] > player[k][0] )
          

          Die obere Zeile wäre richtig, wenn du alle Spieler in ein Array packst, die untere wenn es für jeden Spieler ein eigenes Array gibt.

          Für jede Karte (das k) ist an der ersten (Zählung beginnt bei Null) Stelle festgelegt, wieviele Karten dieses Typs (dieser ID) der Spieler haben darf und an der zweiten Stelle, wieviele Karten dieses Typs der Spieler schon hat.

          wenn der Spieler von dieser Karte mehr hat als er haben darf, ist der Spielzug ungültig.

          Bis demnächst
          Matthias

          --
          Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
      2. Hallo j4nk3y,

        Besser wäre:

        var player = [];
        

        Ja.

        Und warum für jeden Spieler ein neues Array?

        Hatte ich auch überlegt. Meine Intension war: 1 Objekt - 1 Array.

        Damit du nicht jedesmal über das ganze Array iterieren musst, kannst du die entsprechenden Anzahlen auch in eigenen Variablen speichern:

        Warum eine neue Variable?
        Die Länge des Arrays kann man doch mit player.length prüfen.

        Nein. Denn mein Array enthält immer alle Karten.

        Vergleichbar etwa mit zwei verschiedenen Ansätzen für das Lottospiel 6 aus 49.

        { Syntax: Turbopascal }
        Ttipp = array [1..6] of [1..49];
        { vs. }
        Ttipp = array [1..49] of boolean;
        

        Bis demnächst
        Matthias

        --
        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.