skyemugen
Goto Top

Mehrere Variablen bzw. Zahlen vergleichen und den höchsten Wert ausgeben

Aloha alle miteinander (once again),

Kaum ist es Montag, purzeln neue Kniffligkeiten ins Haus. =)

Der Hintergrund des Ganzen ist eine Reparaturpatchung von Charakterdateien für ein privat-MMORPG.

Die folgende Bearbeitung basiert in veränderter Form auf den Code Mehrere Dateien im Batch per Drag und Drop bearbeiten lassen

Ablauf
Mastery1 bis Mastery7 sowie Level werden eigentlich per Schleife aus den .ini-Dateien ausgelesen:
for /f "tokens=2 delims=^=" %%i in ('findstr /n "^" %1^|findstr "^42:"') do set Mastery1=%%i
(wobei ich für jeden einzelnen Wert eine einzelne for-Schleife habe, da die Zeilen sich natürlich ändern [Level = Zeile 6; Mastery1 = Zeile 42 ... Mastery 7 = Zeile 48]

Habe ich hierfür aber fest definiert, um ein besseres Beispiel darstellen zu können.

Ziel
Aus den Werten der Mastery1-7 soll der höchste Wert ermittelt und mit dem Level verglichen werden.
In diesem Fall z.B. haben Mastery1 und Mastery4 ein höheres Level als der CharakterLevel.

Bisheriger Workaround
Momentan habe ich die ganze Problematik mit einer Rangliste, einer Sortierung und einem Auslesen der Zeile 1 der temporär erstellen Datei gelöst, finde dieses aber unschön und bin auf der Suche nach einem direkteren Weg.

@echo off & setlocal enabledelayedexpansion

set /a Mastery1=50
set /a Mastery2=0
set /a Mastery3=0
set /a Mastery4=50
set /a Mastery5=30
set /a Mastery6=0
set /a Mastery7=0
set /a Level=47

set R=%temp%\Liste.log
set T=%temp%\result.tmp 
if exist %R% del %R%
if exist %T% del %T%

set /a Anzahl=7
for /L %%i in (1,1,%Anzahl%) do for /L %%j in (1,1,%Anzahl%) do if !Mastery%%i! leq !Mastery%%j! set /a Rang%%i+=1
for /L %%i in (1,1,%Anzahl%) do set Wert=!Rang%%i!=!Mastery%%i! && echo !Wert! >>%T%

sort %T% /O %T%

for /f %%m in (%T%) do >>"%R%" echo\%%m  
for /f "tokens=2 delims=^=" %%k in ('findstr /n "^" %R%^|findstr "^1:"') do set LV=%%k  

echo Hoechste Mastery ist Level %LV%

if %LV% GTR %Level% (
set /a Ausgleich=%LV%-%Level%
) else (
echo kein Masterylevel ist zu hoch
pause
goto :eof
)
echo Der Charakterlevel wird um %Ausgleich% Level erhoeht.
pause

Nachbehandlung
Darüber muss man sich nicht allzuviele Gedanken machen, denn wie man im code bereits erkennen kann, habe ich vor, einen Ausgleichs-Wert zu definieren,
set /a Ausgleich=%LV%-%Level%
der später auf das Level addiert wird und per VBS in die per drag&drop gewählte Datei überschrieben wird.

Sprich: Der Level wird dem Wert der höchsten Mastery angepasst (gut, es werden auch noch Attributpunkte zusätzlich gesetzt, spielt aber keine größere Rolle, da dies alles schon funktioniert)

Anmerkung:
Es ist in dem Spiel durchaus möglich, ein niedrigeres Charakterlevel zu haben als die Masterys sind (durch sterben z.B.), allerdings passiert dies bei uns eher durch bugs beim Rollback und die Spieler erhalten keine Erfahrungspunkte mehr beim Monsterkillen.

Ich hoffe, es ist nicht zu verwirrend und ich hoffe ebenso, dass ihr mich bei der Lösungsfindung für einen direkteren Weg als ich ihn momentan gewählt habe, unterstützen werdet.

Grüße, André

Content-ID: 160713

Url: https://administrator.de/contentid/160713

Ausgedruckt am: 23.11.2024 um 13:11 Uhr

bastla
bastla 14.02.2011 um 12:04:49 Uhr
Goto Top
Hallo Skyemugen!

Wenn es also grundsätzlich nur darum geht, aus allen Werte der Variablen %Mastery#% sowie von %Level% den höchsten zu finden, würde ich das (ungetestet wie fast immer face-wink) so anlegen:
set /a Max=%Level%
for /f "tokens=2 delims==" %%i in ('set Mastery') do if %%i gtr %Max% set /a Max=%%i  
Grüße
bastla
Skyemugen
Skyemugen 14.02.2011 um 12:26:59 Uhr
Goto Top
Aloha bastla!

Ausgehend davon, dass dies den ganzen Rangliste und Sort-Mist ersetzen soll ... bekomme ich jedoch immer nur den Wert von Level; müsste bei ('set Mastery') nicht noch etwas hinzugefügt werden (so geht er doch gar nicht alle sieben Variablen durch oder wie oder was *grübel*)?

Ein interessanter Ansatz. (wenn das funktionieren würde, muss ich ja trotzdem nochmal mit %Level% vergleichen, um die Information zu bekommen, ob Max größer ist als Level, um die Differenz zu bekommen oder das Skript zu beenden - oder kommt mein Zug heute mal wieder später?)

Grüße, André

EDIT: Würde in diesem Fall die for-Schleife nicht sogar nur den erstgrößeren Wert ausgeben?
bastla
bastla 14.02.2011 um 12:32:11 Uhr
Goto Top
Hallo Skyemugen!

Wenn %Level% nur mit dem Max-Wert der einzelnen Variablen verglichen werden soll, dann natürlich eher so:
set /a Max=0
for /f "tokens=2 delims==" %%i in ('set Mastery') do if %%i gtr %Max% set /a Max=%%i  
set /a Diff=Max-Level
If %Diff% gtr 0 echo Ausgleichspunkte: %Diff%
Wenn Du übrigens einmal in der Konsole die Variablen setzt und ein "set Mastery" eingibst, sollte Deine Frage hinsichtlich "geht doch gar nicht alle sieben Variablen durch" eigentlich beantwortet sein ...

Grüße
bastla
Skyemugen
Skyemugen 14.02.2011 um 12:44:25 Uhr
Goto Top
Aloha bastla!

Ähm ja, natürlich: Umgebungsvariable. (ich seh schon „/“ wo keine sind). Hm, mit der letzten Lösung setzt er bei Max den niedrigsten Wert ungleich Null ein. (also hier: 30)

Also doch mit set /a Max=%Level% ^.^

Faszinierende Lösung (und da glaubt/hofft man, inzwischen vieles zu kennen *g*) und vorallem: so schön kompakt.

Ach, ich danke dir wieder einmal, mein guter bastla! und ich bau mir da einen Wolf zusammen, haha

set Mastery ... an diese Umsetzung hätte ich in den nächsten Monaten noch nichtmal gedacht ;)

Grüße André
bastla
bastla 14.02.2011 um 12:52:51 Uhr
Goto Top
Hallo Skyemugen!

Sorry - war nicht sonderlich konzentriert, sonst hätte mir "%" anstelle von "!" eigentlich nicht passieren sollen face-sad - jetzt aber:
set /a Max=0
for /f "tokens=2 delims==" %%i in ('set Mastery') do if %%i gtr !Max! set /a Max=%%i  
set /a Diff=Max-Level
If %Diff% gtr 0 echo Ausgleichspunkte: %Diff%
set Mastery ... an diese Umsetzung hätte ich in den nächsten Monaten noch nichtmal gedacht ;)
... ist aber bei sinnvoller Benennung der Variablen (gleiches Präfix) die einfachste Möglichkeit ...

Grüße
bastla
Skyemugen
Skyemugen 14.02.2011 um 13:00:17 Uhr
Goto Top
Zitat von @bastla:
Hallo Skyemugen!

Sorry - war nicht sonderlich konzentriert, sonst hätte mir "%" anstelle von "!" eigentlich nicht
passieren sollen face-sad - jetzt aber:

Aloha bastla!

Ja nun das zeigt auch wieder nur meine unausgeprägte Fähigkeit codes schnell zu interpretieren, sonst hätte mir das mit % statt ! in der for-Schleife selber auffallen müssen *schäm*.

> set Mastery ... an diese Umsetzung hätte ich in den nächsten Monaten noch nichtmal gedacht ;)
... ist aber bei sinnvoller Benennung der Variablen (gleiches Präfix) die einfachste Möglichkeit ...

Indeed, hatte bisher keine Fälle, wo dies zugetroffen hätte man befasst sich ja immer erst mit neuen Dingen, wenn man mit den üblichen Methoden an seine Grenzen kommt aber good to know.

Nun dann: Noch einen erholsamen ist das Wort eigentlich angebracht an einem Montag ... Tag wünsche ich dir =)

Grüße, André