User since
2006-08-15
21
Artikel
BenutzerIn
Hab gerade ein Problem, vllt kennt ihr euch da aus ;-(
Will mit folgenden Befehl einen Counter durchführen:
++$Global{Base}{2}{0}[3];
Nun ist es aber so, das die Werte ab {0}[3] beim nächsten Befehl verlohren gehen:
++$Global{Base}{2}{5}{0}[6];
Das ganze sieht später aus wie eine Tupel oder ähnliches.
Nun hab ichs irgendwie so probiert, aber das mag Perl nicht. Wo ist da der Fehler?
%Global{Base} = ( $Global{Base}{2},
$Global{Base}{2}{5} = ++{0}[6]
);
Das Ding is Schwachfug ich weiss, aber eine bessere Idee hab ich nicht, das die alten Werte nicht verlohren gehn.
Ihr kennt euch da mit der genauen Syntax glaub besser aus :(
Wie kann ich den Befehl ++$Global{Base}{2}{5}{0}[6]; ausführen, ohne den Wert des vorherigen Counters zu verlieren?
User since
2003-08-14
2022
Artikel
BenutzerIn
Das ganze sieht sehr merkwürdig aus. Zeig mal den Zusammenhang im Programm.
User since
2003-08-04
14371
Artikel
ModeratorIn
%Global{Base} = ( $Global{Base}{2},
$Global{Base}{2}{5} = ++{0}[6]
);
Was soll das sein?
Es sieht so aus, als wolltest Du zu dem Schlüssel "Base" einen Hash speichern. Hashwerte können aber nur Skalare sein. Wenn, dann müsstest Du hier eine Hashreferenz oder eine Arrayreferenz als Hashwert aufbauen...
Und
++{0}[6] gibt es nicht...
Wie Ronnie schon sagte, zeig am besten mal etwas mehr Code. Am Besten ein kleines Beispielprogramm, mit dem der Fehler reproduziert werden kann.
User since
2006-08-15
21
Artikel
BenutzerIn
So wo ichs mir anschaue, kanns nicht funktionieren stimmt!
War früh am morgen und musste schnell zur Arbeit..
Hab den Code gerad nicht bei mir (häng an nem anderen PC).
Aber es läuft folgendermassen:
Ich wollte ich eine Art!! K.I. programmieren.
Diese sollte dann als ein Tic Tac Toe Gegenspieler fungieren.
Nun war es folgendermassen gedacht:
Jeder Spielzug ist eine Dimension $Base{Spielzug1}{Spielzug2}{Spielzug3}...
Wobei der Inhalt einer Dimension das gewählte Feld ist: $Base{3}{2}{6}
{3} = Oberste Reihe, 3. Feld
{2} = Oberste Reihe, 2. Feld
{6} = 2. Reihe, 3. Feld:
1¦2¦3
____
4¦5¦6
____
7¦8¦9
Gänge auch mit Arrays, allerdings in der Anfangsphase find ich die Variante
mit dem Hash in Kombination von Dumper übersichtlicher.
Nach mehreren Spielen sollte sich dann ein Tupel bzw. Baum entwickeln.
Weiter war es gedacht in der {0} (Die Zählung der Felder fängt bei 1 an, nicht bei 0!), den Wert um eins zu erhöhen: ++$Base{3}{2}{6}{0}[4] wobei die Zahl [4] wieder ein Feld definiert.
Es sind folgende Spielzüge gemacht worden:
3,2,6 und dann das Feld 4.
Soll später so aussehen:
$Base{3}{2}{6}{0}[1,4,7,2,1,0,2,3,2] Wobei jedes Arrayelement für die Anzahl steht, wie oft ein Feld nach diesem Zug gewählt wurde:
Die Felder 3, 2 und 6 sind belegt. Wie gross ist die Wahrscheinlichkeit, dass der Spieler Feld 3 nimmt?: 7. Wie gross ist die Wahrscheinlichkeit dass Spieler Feld 2 nimmt?: 4 Wie gross ist die wahr-scheinlichkeit das Spieler Feld6 nimmt?: 0 ...
Ist "einwenig" kompliziert^^ Zugegeben, aber ich hoff es kamm halbwegs durch oO
User since
2007-03-26
47
Artikel
BenutzerIn
[quote=Mates,25.06.2007, 07:20]Will mit folgenden Befehl einen Counter durchführen:
++$Global{Base}{2}{0}[3];
Nun ist es aber so, das die Werte ab {0}[3] beim nächsten Befehl verlohren gehen:
++$Global{Base}{2}{5}{0}[6];[/quote]
Hallo,
bei mir geht nichts verloren. Schau dir doch deine Struktur mal an:
User since
2005-12-17
1615
Artikel
HausmeisterIn
Also entweder du überschreibst den Hash an irgendeiner Stelle oder du
schaust dir die Struktur des Hashs ausserhalb des Geltungsbereiches an.
Ich tippe aber eher auf ersteres.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
User since
2006-08-15
21
Artikel
BenutzerIn
Hab den Fehler gefunden... Eigentlich ein ziemlich blöder :blush: Nach jedem Zug hat sich das Script logischerweise neugestartet. Der Hash wurde jedesmal neu geschrieben, aber ohne den Arraywert...
Aber wenn wir beim Thema sind... Wie programmiert man eine schwache KI? Aber da such ich glaub vorher nochmal ansonsten mach ich später nen neuen Thread auf.