JS Tutorial: Wie man einen Zufallsgenerator programmiert - Teil 7

in #deutsch6 years ago (edited)

teil7.png

Hallo und herzlich Willkommen zum siebten Teil zum Thema:
Wie man einen Zufallsgenerator programmiert.

Heute möchte ich mich um die folgenden Anforderungen kümmern:

  • Gewichtung der einzelnen Teilnehmer
  • Keine doppelten Erfassung einzelner Teilnehmer mehr

Gewichtung der einzelnen Teilnehmer

Um die Gewichtung der Teilnehmer zu realisieren, habe ich mir folgendes Überlegt. Die einzelnen Einträge innerhalb des Teilnehmer Arrays werden zu Objekten, welche folgende Eigenschaften tragen werden:

  • Name des Steemians
  • URL zum Profilbild
  • Anzahl der Lose im Lostopf

Der Name ist dabei unverändert. Die URL benutzen wir zum Darstellen des Profilbilds innerhalb der Teilnehmerliste. Die Anzahl der Lose erhöhen dann entsprechend die Chance gezogen zu werden.

Praktisch brauchen wir dafür zunächst einmal einen Konstruktor, welcher uns das gewünschte Objekt zur Verfügung stellt.

/* neuer Teilnehmer Konstruktor*/
function neuerTeilnehmer(name, lose, pburl) {
    var teilnehmer = {};
    if (lose != undefined) {
        teilnehmer["lose"] = lose;
    }
    if (pburl != undefined) {
        teilnehmer["pburl"] = pburl;
    }
    if (name != undefined) {
        teilnehmer["name"] = name;
    }
    return teilnehmer;
}

Nun sind wir gezwungen, das Objekt an Stelle des einzelnen Eintrags im Array zu verwenden.
Wo vorher auf den Textwert innerhalb des Arrays zugegriffen wurde, müssen wir nun auf den Namen unseres Objektes zugreifen. Somit wird aus unseren Push folgendes:

teilnehmerliste.push("name") > teilnehmerliste.push(neuerTeilnehmer(name, lose, pburl))

Der Zugriff auf den Namen funktioniert dann so:

teilnehmerliste[i] > teilnehmerliste[i].name


Nun da wir unser Teilnehmerobjekt in den Code eingebaut haben, wollen wir die Zusatzinformation in der Gewinnergenerierung auch sinnvoll nutzen. Dazu bauen wir uns jetzt einen Lostopf, in denen jeder Teilnehmer die entsprechende Anzahl seiner Lose reinwirft. Das sieht dann so aus:

function generiereLostopf() {
    var lostopf = [];
      for(var i=0; i < teilnehmerliste.length; i++) {
          var teilnehmer = teilnehmerliste[i];
          var lose = 1;
          if (teilnehmer.lose != undefined) {
            var lose = teilnehmer.lose;
          }
          for(var j = 0; j < lose; j++) {
            lostopf.push(teilnehmer);
          }
  }
  return lostopf;
}

Haben wir nun 10 Leute mit je einer Gewichtung von 2, wären somit 20 Lose im Topf. Dabei sind immer die jeweiligen Lose des einzelnen Teilnehmers hintereinander im Lostopf. Dies spielt für die Ermittlung des Gewinners keine Rolle, da wir nicht wie im echten Leben von oben ein Los ziehen.

Keine doppelten Erfassung einzelner Teilnehmer mehr

Um dieses Feature zu realisieren, brauchen wir eigentlich nichts weiteres tun, als uns zu merken, welche Teilnehmer wir bereits in der Liste haben. Sollten wir dann einen neuen hinzufügen wollen, schauen wir auf diese Liste und wenn er nicht draufsteht, packen wir ihn hinzu. Im Rahmen eines Programmablaufplans würde dass dann so aussehen:

beispiel.png

Der entsprechende Code zum PAP sieht folgendermaßen aus:

function fuegeTeilnehmerlisteHinzu(teilnehmer) {
    var alreadyInList = false;
    for (var i=0; i < teilnehmerliste.length; i++) {
            if (teilnehmerliste[i].name === teilnehmer.name) {
                 alreadyInList = true;
                   break;
            }
    }
    if (!alreadyInList) {
        teilnehmerliste.push(teilnehmer);
    } else {
        window.alert("Teilnehmer bereits in Liste vorhanden!");
    }
}

Durch das break Statement wird der For-Loop abgebrochen. Das können wir immer dann tun, wenn wir die für uns relevante Information extrahiert haben und ein weiteres Betrachten der anderen Objekte nicht mehr von Nöten ist. In unseren Fall sobald wir wissen, dass der Name auf der Liste steht.

Schlusswort

Somit sind wir auch schon wieder am Ende angekommen.

Im nächsten Teil kümmern wir uns um den von @cuby angeforderten Export der Gewinner. Zudem sollte das Feedback für den Nutzer anschaulicher gestaltet werden, als in Form eines alerts.

Außerdem möchte ich mich an dieser Stelle bei allen fleißigen Lesern und Unterstützern bedanken! Ich hätte nie damit gerechnet, dass überhaupt jemand die Entstehung eines solchen Tools mitverfolgen würde. Die 50 Follower Marke wurde geknackt! Für mich ein Anlass, dass Tool in Zukunft in vollen Umfang erneut auf die Probe zu stellen.

Eure mithilfe ist gefragt

Falls ihr Ideen, Wünsche oder Anregungen habt, was noch fehlt, bitte lasst ein Kommentar dar. Ich habe vor das Tool in Zukunft auf eine Website zu packen, sodass es jeder verwenden kann. Und jeder von euch hat die Chance dabei am zukünftigen Ergebnis zu feilen. Ein Link zum aktuellen Stand findet ihr hier

Ich hoffe es hat euch Spaß gemacht und ich wünsche euch allen einen guten Start in die kommende Woche!


Die Grafik, welche den PAP zeigt habe ich hier erstellt. Ziemlich cooles Tool wie ich finde, definitiv zu empfehlen.

Sort:  

As a follower of @followforupvotes this post has been randomly selected and upvoted! Enjoy your upvote and have a great day!

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.029
BTC 57839.82
ETH 3132.70
USDT 1.00
SBD 2.43