HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-187/)
-   -   If abfrage in Case umwandeln (https://hx3.de/editing-scripting-187/if-abfrage-case-umwandeln-23495/)

Nokman 12.03.2014 18:36

If abfrage in Case umwandeln
 
Meine Frage an Euch währe gibt es einen Schöneren weg als 100 If Abfragen zu erstellen um herauszufinden wo man _menge eintragen muss
Code:

if (sname == "Daniel") then
{
Daniel = _menge;
};
if (sname == "Peter") then
{
Peter = _menge;
};
if (sname == "Hans") then
{
Hans = _menge;
};

Das währe der momentane weg doch bei 100 Ifabfragen währe doch ein Case sinvoller nur wie würde der gehen?

Gruß
Nokman

Buliwyf 12.03.2014 19:12

Code:

_blub = switch (sname) do {
                case "Daniel" : {Daniel = _menge;};
                case "Peter" : {Peter = _menge;};
                case "Hans" : {Hans = _menge;};
};


Vienna 12.03.2014 19:24

https://community.bistudio.com/wiki/Control_Structures

Drunken Officer 12.03.2014 19:57

Zitat:

Zitat von Nokman (Beitrag 469559)
Meine Frage an Euch währe, gibt es einen schöneren Weg als 100 If Abfragen zu erstellen, um herauszufinden, wo man _menge eintragen muss.

[/code]Das währe der momentane weg, doch bei 100 Ifabfragen währe doch ein Case sinvoller. Nur wie würde der gehen?

Gruß
Nokman

in einem einigermaßen vernünftigen Deutsch:
Meine Frage an euch wäre die Folgende.
Gibt es einen anderen Weg um herauszufinden, wo man die Variable _menge eintragen muss, anstatt 100 IF-Abfragen zu erstellen.
***Script ***
Dies wäre der momentane Weg. Doch bei 100 IF-Abfragen, wäre eine CASE-Funktion doch sinnvoller. Kann mir einer ein CASE Beispiel schreiben?

Nokman 12.03.2014 20:44

Zitat:

Zitat von Drunken Officer (Beitrag 469570)
in einem einigermaßen vernünftigen Deutsch:
Meine Frage an euch wäre die Folgende.
Gibt es einen anderen Weg um herauszufinden, wo man die Variable _menge eintragen muss, anstatt 100 IF-Abfragen zu erstellen.
***Script ***
Dies wäre der momentane Weg. Doch bei 100 IF-Abfragen, wäre eine CASE-Funktion doch sinnvoller. Kann mir einer ein CASE Beispiel schreiben?

Vielen Dank Drunken Officer,
Ich werde mich bei kommenden Anfragen gewählter Ausdrücken damit wir beide auf einen Nenner kommen können. Ich respektiere Ihre Arbeit im Forum beim Helfen von teilweise fremden Menschen bei Ihren Problemen.
Nun hoffe ich das wir beide uns im nächsten Beitrag wiedersehen.

Ein bitte hatte ich leider auch Vergessen gehabt das würde ich gerne noch nachholen!

Vielen Dank für die Hilfestellung

Freundlichen Grüßen
Nokman

Lester 12.03.2014 22:07

folgende Zeile speichert _menge in eine Variable je sname !
Code:

call compile (format["%1=%2",sname,_menge]);
Ganz ohne switch oder if.

Wozu das auch immer gut sein soll :rolleyes:

Vienna 13.03.2014 18:41

Bei 100 Namen kann man das mit Arrays vereinfachen. Ein Beispiel für 3 Namen. Für jeden weiteren Namen ist dieser und die Punkte in den Array anzufügen.

Code:

//Arrays initialisieren:
 Namen  = ["Daniel", "Peter", "Hans"];
 Punkte = [0, 0, 0];

//Die weitere Verwendung der Arrays:

 sname  = "Peter";
 _menge = 50;

//sname in Namen finden.
 _i = Namen find sname;
 
// Der Index steht in _i (bei 3 Namen 0 bis 2) wenn kein Treffer dann -1
 if (_i > -1) then
  {
  //_menge in Punkte hinzufügen
    Punkte set [_i, (Punkte select _i) + _menge];
  //Namen mit neuen Punkten ausgeben
    hint format ["%1 Punkte: %2", Namen select _i, Punkte select _i]
  };

Hier gibt es was über Array zu lesen: https://community.bistudio.com/wiki/Array

Nokman 14.03.2014 07:40

Guten Tag Vienna,
Deine Lösung ist sehr "Umfangreich".
Bei denn 3 Möglichkeiten die wir nun genant haben, stellt sich mir wieder die Frage welche von ihn die Ressourcen des Rechners am besten schonen würde?

von Buliwyf
Code:

_blub = switch (sname) do {
                case "Daniel" : {Daniel = _menge;};
                case "Peter" : {Peter = _menge;};
                case "Hans" : {Hans = _menge;};
};

von Vienna
Code:

//Arrays initialisieren:
 Namen  = ["Daniel", "Peter", "Hans"];
 Punkte = [0, 0, 0];

//Die weitere Verwendung der Arrays:

 sname  = "Peter";
 _menge = 50;

//sname in Namen finden.
 _i = Namen find sname;
 
// Der Index steht in _i (bei 3 Namen 0 bis 2) wenn kein Treffer dann -1
 if (_i > -1) then
  {
  //_menge in Punkte hinzufügen
    Punkte set [_i, (Punkte select _i) + _menge];
  //Namen mit neuen Punkten ausgeben
    hint format ["%1 Punkte: %2", Namen select _i, Punkte select _i]
  };

von Lester
Code:

call compile (format["%1=%2",sname,_menge]);
Wobei ich die drite alleine vom Umfang her bevorzuge da es mit ihr ohne Änderungen ins fast Unendliche erweitern lässt.

Lester 14.03.2014 09:24

Mir ist nur etwas unverständlich was Du damit vor hast, du machst letztendlich für jeden (Spieler)namen eine eigene Variable auf, um dann dort immer das letzte Ergebnis zuzuweisen ?
Ansonsten müßtest Du anstelle von Daniel = _menge doch eher Daniel = Daniel + _menge verwenden.

Die Methode von Vieanna mit dem Array ist mit Sicherheit die mit Abstand flexibleste, das geht auch recht einfach zu initialisieren und man hat im nachherein auch noch weitgehest Kontrolle über die aufgelaufenen Daten.
Namen = [];
Punkte = [];

Das Script macht dann nichts anderes als sname auf vorhandensein zu prüfen um dann im entsprechenden _menge Eintrag bei Punkte zu modifizieren oder eben halt wenn nicht vorhanden sname & dazugehörige _menge hinzuzufügen.

Das hat nebenbei auch die Vorteile das man u.U. nicht immer weiß welche Namen alles aufschlagen werden.
In der Array Variante kannste es überprüfen, in der call compile Kurzform wird zwar was gemacht, aber im Nachherein weiß Niemand welche Namen dort alles aufgelaufen sind.

Hab das auch nur als Kurzform zu deinen Ansatz gepostet um Anregungen zu schaffen ohne den Zweck zu hinterfragen. ;)

Xeno 14.03.2014 11:02

Kein Mensch benutzt mehr call compile format um globalen Variablen dynamische Werte zuzuweisen... Es sei denn es ist einem egal das es 3-4 mal langsamer als die elegantere Lösung mittels missionNamespace ist :zahn:

Xeno

Vienna 14.03.2014 12:07

Durch eine kleine Ergänzung (else) sind keine Namen und Punkte mehr vorzugeben. Wird ein Name nicht gefunden, dann wird er dem Array Namen hinzugefügt, ebenso seine Punkte im Array Punkte.

Code:

//Arrays initialisieren:
 Namen  = [];
 Punkte = [];

//Die weitere Verwendung der Arrays:

 sname  = "Peter";
 _menge = 50;

//sname in Namen finden.
 _i = Namen find sname;
 
// Der Index steht in _i (ab 0). Wenn kein Treffer dann -1
 if (_i > -1) then
  {
  //_menge zur vorhandenen in Punkten hinzufügen
    Punkte set [_i, (Punkte select _i) + _menge];
  }
 else
  {
  //Array-Feld für neuen Namen im Array Namen hinzufügen
    Namen = Namen + [sname]; 
  //Array-Feld für den Wert dieses Namens im Array Punkte hizufügen 
    Punkte = Punkte + [_menge];
  //letzten Index feststellen
    _i = count Namen - 1     
  }; 

//Namen mit den Punkten ausgeben
 hint format ["%1 Punkte: %2", Namen select _i, Punkte select _i];

Noch schwerer verständlich?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120