PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : If abfrage in Case umwandeln


Nokman
12.03.2014, 17:36
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
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, 18:12
_blub = switch (sname) do {
case "Daniel" : {Daniel = _menge;};
case "Peter" : {Peter = _menge;};
case "Hans" : {Hans = _menge;};
};

Vienna
12.03.2014, 18:24
https://community.bistudio.com/wiki/Control_Structures

Drunken Officer
12.03.2014, 18:57
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, 19:44
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, 21:07
folgende Zeile speichert _menge in eine Variable je sname !call compile (format["%1=%2",sname,_menge]);Ganz ohne switch oder if.

Wozu das auch immer gut sein soll :rolleyes:

Vienna
13.03.2014, 17: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.


//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, 06: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
_blub = switch (sname) do {
case "Daniel" : {Daniel = _menge;};
case "Peter" : {Peter = _menge;};
case "Hans" : {Hans = _menge;};
};

von Vienna
//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
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, 08: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, 10: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, 11: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.


//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?