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

Gast TheDude
 2009-07-27 21:22
#123624 #123624
Hm durch die Referenzen Blick ich irgendwie noch nicht durch.. Werd mir da nochmal nen paar Tuts durchlesen.. Deswegen hab ich jetzt eure Ratschlaege bezueglich der Referenzen mal nicht umgesetzt es funktioniert naemlich momentan auch so..
Ich hatte wohl versaeumt zu erwaehnen das sich Gruppen mit mehr als 3 automatisch aufloesen und auch wenn sie durch ne Folge Reaktionentstehen.. Und wenn Elemente Platz freimachen rutschen die von Oben nach und es fallen neue von ganz Oben ins Feld.. Das heißt es gibt zum Zeitpunkt des Wechsels keine Reihen aus mehr als 2 Elementen weil die sich sonst schon aufgeloest haetten.. Es ist also sinnvoll als Spieler Kettenreaktionen auszuloesen..
Jetzt kann ich GetMoves aufrufen mit ner Referenz auf nen Feld als Argument und krieg nen Array aus Arrays zurueck mit den zu vertauschenden Koordinaten und der Anzahl der dann zusammenhaengenden Elemente..

Sieht dann so aus:
0 0 0 0
0 0 x x
0 x 0 0

@Moves = ([x, y, x, y, Q],
[1, 2, 1, 1, 3]);

Als naechstes wuerde ich dann die Qualitaet ueber mehrere "Spielfeld-Generationen" berechnen.. Das Spielfeld veraendert sich ja durch das aufloesen einer Reihe und bildet eventuell direkt eine Neue die sich wieder aufloest und vielleicht noch eine Neue bildet.. Momentan werden ja nur die Anzahl der Elemente die sich sofort aufloesen berrechnet.. Aber das hat noch Zeit..
Und das mit dem clonen des Arrays hatte ich auch schon festgestellt.. Habs jetzt mal so geloest wie unten zu sehen.. Mit dem Clone-Modul hats irgendwie nicht funktionieren wollen..

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
sub GetMoves
{
        my @Moves;
        for my $y (0..7)
        {
                for my $x (0..7)
                {
                        if ($x != 7) {
                                my $qualityR = TestMove(\@{$_[0]}, $x, $y, 'right');
                                if ($qualityR > 0) {
                                        push(@Moves, [$x, $y, $x+1, $y, $qualityR])
                                }
                        }
                        if ($y != 7) {
                                my $qualityD = TestMove(\@{$_[0]}, $x, $y, 'down');
                                if ($qualityD > 0) {
                                        push(@Moves, [$x, $y, $x, $y+1, $qualityD])
                                }
                        }
                }
        }
        return @Moves;
}

sub TestMove
{
        foreach my $temparray (@{$_[0]}) {
                push(@TestFeld, [@$temparray]);
        }
        if ($_[3] eq 'right') {
                my $ToSwap = ${$TestFeld[$_[2]]}[$_[1]];
                ${$TestFeld[$_[2]]}[$_[1]] = ${$TestFeld[$_[2]]}[$_[1]+1];
                ${$TestFeld[$_[2]]}[$_[1]+1] = $ToSwap;
        } elsif ($_[3] eq 'down') {
                my $ToSwap = ${$TestFeld[$_[2]]}[$_[1]];
                ${$TestFeld[$_[2]]}[$_[1]] = ${$TestFeld[$_[2]+1]}[$_[1]];
                ${$TestFeld[$_[2]+1]}[$_[1]] = $ToSwap;
        }
        my $quality = GetQuality(\@TestFeld);
        undef @TestFeld;
        return $quality;
}

sub GetQuality
{
        my $ref = $_[0];
        my $quality = 0;
        for my $x (0..7)
        {
                my $string = join("", @{@$ref[$x]});
                while ($string =~ m/(11111|1111|111)|(22222|2222|222)|(33333|3333|333)|(44444|4444|444)|(55555|5555|555)|(66666|6666|666)|(77777|7777|777)|(88888|8888|888)/g) {
                        $quality += length($&);
                }
                undef $string;
        }
        for my $y (0..7)
        {
                my $string = "";
                for my $z (0..7)
                {
                        $string = $string . ${@$ref[$z]}[$y];
                }
                while ($string =~ m/(11111|1111|111)|(22222|2222|222)|(33333|3333|333)|(44444|4444|444)|(55555|5555|555)|(66666|6666|666)|(77777|7777|777)|(88888|8888|888)/g) {
                        $quality += length($&);
                }
                undef $string;
        }
        return $quality;
}

View full thread Gamelogik in Perl