Thread Gamelogik in Perl (7 answers)
Opened by TheDude at 2009-07-25 18:06

topeg
 2009-07-27 00:32
#123590 #123590
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ein paar Tips:

Solche konstrukte brauchst du nicht
Code (perl): (dl )
${$TestFeld[$_[2]]}[$_[1]]

so ist es einfacher:
Code (perl): (dl )
$$TestFeld[$_[2]][$_[1]]

sowas:
Code (perl): (dl )
@{@$ref[$x]}

ist besser so geschrieben:
Code (perl): (dl )
@{$$ref[$x]}

dies Konstruktion:
Code (perl): (dl )
1
2
3
4
for my $z (0..7)
                {
                        $string = $string . ${@$ref[$z]}[$y];
                }

lässt sich auch so schreiben:
Code (perl): (dl )
$string=join('',map{$$ref[$_][$x]}(0..7));


das
Code (perl): (dl )
undef $string;
ist unnötig, da du schon mittels "my" den Gültigkeitsbereich eingeschränkt hast.

Weiterhin modifizierst du "@Feld" weil du nicht korrekt dereferenzierst.
Wenn du
Code (perl): (dl )
1
2
$ref=\@Feld;
@TestFeld=@{$ref};
machst sind alle Arrays innerhalb "@Feld" identisch mit denen in "@TestFeld".

willst du das Feld Clonen so kannst du entsprechende Module nutzen (CPAN:Clone) oder es von Hand machen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
my @TestFeld;
for my $y (0..$#Feld)
{
  for my $x (0..$#{$Feld[$y]})
  {
    $TestFeld[$y][$x]=$Feld[$y][$x];
  }
}


Und da ist noch die Parameterübergabe an Funktionen.
Entweder du machst es überall oder nirgendwo (besser überall). Dieses Mischmasch ist schwer zu lesen und sorgt leicht für Fehler (man verändert Variablen und weiß nicht mehr wo das passiert ist).

Aus meiner Sicht am übersichtlichsten ist am Anfang einer Funktion die Parameter benannt zu übernehmen.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub mach_was
{
  my $x=shift;        # ist das gleiche unten
  my $y=shift();      # das gleiche wie unten
  my $feld=shift(@_); # besagt: verschiebe den ersten Wert aus @_ in $feld
  my @rest=@_;
  # ...
  # code
  # ...
}



Ich weiß nicht ob das so beabsichtigt ist, aber mir scheint du testet ein Reiche und eine Spalte nur ab dem Aktuellen Punkt das könnte bei Feldern wie diesem (vereinfacht)
Code: (dl )
1
2
3
4
X 0 X 0
0 X 0 0
0 0 X 0
0 0 0 0

zu falschen Interpretationen führen.
den ein einfacher Tausch:
Code: (dl )
1
2
3
4
X X X 0
0 0 0 0
0 0 X 0
0 0 0 0

oder
Code: (dl )
1
2
3
4
X 0 X 0
0 0 X 0
0 0 X 0
0 0 0 0

Würde nach deiner Suche kein Treffer ergeben (soweit ich es sehe).

Zudem findet deine Suche in "GetQuality" nicht die nur die neu entstandenen Zusammenhängenden Gruppen(wie ich es erwarten würde), sondern alle in der Spalte/Zeile vorhandenen. Das kann dazu Führen, dass ein Tausch als "gut" bewertet wird obwohl er keine Verbesserung bringt, wenn es schon viele Tripple in der Zeile/Spalte gibt.
Last edited: 2009-07-27 00:35:27 +0200 (CEST)

View full thread Gamelogik in Perl