• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Spielernam in Code wandeln???

FSNTL

Geocacher
Moin,
ist es möglich den "Spielernamen" in einen Code zu wandeln? (z.B. Anzahl der Buchstaben oder die buchstaben in Zahlen wandeln A=1, B=2 usw)
Oder ist der Fix?

Danke und Gruß
FSNTL
 

dennistreysa

Geocacher
Ja, ist möglich, man kann auf den Wert der Buchstaben zugreifen und darauf dann arbeiten und später den Wert wieder in ein Zeichen zurückumwandeln, also z.B. würde folgende Funktion einen String nehmen, Buchstaben extrahieren und die Entsprechenden Buchstabenwerte zurückgeben, als auf "abcde" würde "1,2,3,4,5"

Im Anhang ist ein fixes Beispiel dazu.
 

Anhänge

  • test.zip
    1,6 KB · Aufrufe: 46
OP
F

FSNTL

Geocacher
vielen Dank für die schneölle Antwort ;-)

so ganz verstehe ich die Datei aber noch nicht.....

Wie könnte ich denn da den Spielernamen (Spiele->Name) in Zahlen wandeln? Und geht es auch ohne die Kommas?

Danke und Gruß
FSNTL
 

dennistreysa

Geocacher
Möchtest du den Namen ändern, oder nur z.B. die Länge des Namens herausfinden und irgendwo anders verwenden?

So etwas sind Lua-Spezifische Sachen, das geht nicht durch diese Point-And-Click-Programmierung von Urwigo, also am besten mal nach "Lua string length" oder sowas Googeln. In meinem Programm habe ich die Länge des Strings sogar benutzt, in Lua geht das ganz einfach über voranstellen des #-Zeichens, also #Player.Name (oder wie das heißt) gibt die Länge des Spielernamens zurück.

Was genau hast du denn damit vor?
 
OP
F

FSNTL

Geocacher
Ich würde (wenn möglich) gerne den Spieler (Cacher)Namen in Zahlen wandeln (zB FSNTL = 619142012 --- >da F Buchstabe 6, S Buchstabe 19, N Buchstabe 14, T Buchstabe 20, L Buchstabe 11)

Damit hätte ich einen Code den es immer nur für diesen Spieler gibt, den könnte man dann für weitere Aktionen nutzen (zB um sich auf einer Homepage anzumelden....)

Erst mal nur so eine Idee, nur kenne ich mich mit LUA leider nicht aus..

Vielen Dank und Gruß
619142012 = FSNTL ;-)
 

Charlenni

Geomaster
Habe jetzt mal zwei Funktionen geschrieben, die die Arbeit aufteilen. Die erste (GetStringAsTable) wandelt alle darstellbaren Zeichen (ASCII 32 bis 126) in eine Tabelle um. Kann natürlich so angepasst werden, dass nur Buchstaben verwendet werden, dass die Zeichenkette vorher in Groß- oder Kleinbuchstaben gewandelt werden usw. Die Tabelle enthält anschließend für jedes Zeichen in der Zeichenkette eine Zahl als Eintrag, die dem ASCII Wert entspricht.
Code:
function GetStringAsTable(text)
  local result = {}
  -- Convert to upper size
  for i = 1,#text do
    local byte
    byte = text:byte(i)
    -- Only use characters and numbers
    if byte >= 32 and byte <= 126 then
      table.insert(result, text:byte(i))
    end
  end
  return result
end
Die zweite Funktion wandelt eine Tabelle mit Zahlen in eine Zeichenkette um. Dabei kann das Trennzeichen und das Format angegeben werden. Vorgabe sind kein Trennzeichen und ein dreistelliges Format.
Code:
function ConvertTableToString(tab, separator, format)
  local result = ""
  separator = separator or ""
  format = format or "%03d"
  for k,v in ipairs(tab) do
    if result ~= "" then
      result = result..separator
    end
    result = result..string.format(format, v)
  end
  return result
end
Der Aufruf erfolgt nun so
Code:
ConvertTableToString(GetStringAsTable(Player.Name),"","%03d")
Als Ergebnis für "Mr. Smith" bekommt man dann "077114046032083109105116104". Alternativ geht auch
Code:
ConvertTableToString(GetStringAsTable(Player.Name),", ","%03d")
liefert "077, 114, 046, 032, 083, 109, 105, 116, 104". Und wenn man gerner Hexadezimale Zahlen möchte, dann hilft
Code:
ConvertTableToString(GetStringAsTable(Player.Name),"","%02X")
was zu "4D722E20536D697468" führt.

Du kannst natürlich die Tabelle noch bearbeiten, Werte abziehen usw. Der Phantasie sind keine Grenzen gesetzt :)

Einfügen in die Cartridge über "Verketten" und "Lua benutzerdefinierter Ausdruck".
 

dennistreysa

Geocacher
Also wenn man die Webseite aufrufen muss, um den Cache zu lösen kannst du das leider gleich weider knicken, das ist laut Guidelines nicht erlaubt: "Cache listings that require a cacher to visit another website will not be published if the finder must create an account with, or provide personal information to, the other website.", allerdings sind da manche Reviewer lockerer als andere und schalten dir das trotzdem frei...
Die Funktionen von Charlenni sind schon interessant, aber du könntest auch einfach die Urwigo-Hash-Funktion rippen, diese erzeugt ein mehr randomisiertes Ergebnis und lässt sich nicht so einfach nachvollziehen wie als wenn man einfach den Namen in die Buchstabenwerte wandelt ;)
Dazu müsstest du einfach eine Cartridge erstellen (im gwz Format), und suchst nach der "_Urwigo.Hash" Funktion. Diese benennst du um und speicherst sie in deinem Projekt ab, weiter würde ich die Werte für a und b ein wenig verändern, damit andere Werte herauskommen:

Code:
Hash = function(str)
   local b = 123456;
   local a = 420815;
   local hash = 0;
   for i = 1, #str, 1 do
      hash = hash*a+string.byte(str,i);
      hash = math.fmod(hash, 65535)
      a = a*b;
      a = math.fmod(a, 65535)
   end
   return hash;
end

print(Hash("dennistreysa"))
print(Hash("FSNTL"))

dennistreysa = 39997
FSNTL = 31066
 
OP
F

FSNTL

Geocacher
Danke für die vielen Infos und Hilfen, mal sehen was ich damit so basteln kann :)

@ Charlenni

bei dem Aufruf:
ConvertTableToString(GetStringAsTable(Player.Name),"","%02X")

kann ich doch bestimmt auch den "Player.Name" durch eine Variable ersetzen oder? (Dann könnte ich auch andere " Eingaben " umwandeln...)

Was muss ich dafür anstelle von Player.Name einsetzen?

Vielen Dank und Gruß
FSNTL



Wann wird es den WF.Player wohl offiziel für "Alle" geben? (Der ist einfach genial)
 

Charlenni

Geomaster
Klar geht das. Einfach "Player.Name" durch den Namen der Variablen (wie sie in der Kennung steht) ersetzen. Fertig.
 
OP
F

FSNTL

Geocacher
Oh ja klar...
Ich habe es mit dem Namen versucht :-(

Aber klar es muss die Kennung sein...


Dankeeeee
 
Oben