Thread Spiel: Kettenreaktion (3 answers)
Opened by Mampfgnom at 2011-03-08 09:09

Mampfgnom
 2011-03-08 09:10
#146296 #146296
User since
2010-11-16
16 Artikel
BenutzerIn
[default_avatar]
Hier mal mein erster Versuch. Sicher noch nicht optimiert, aber hier könnt ihr mal sehen wie das Spiel funktionieren soll.

more (81.7kb):
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#!/usr/bin/perl -w

use strict;
use Tk;
use Tk::LabEntry;
use Time::HiRes;


my $mw = MainWindow->new(-title=>"Kettenreaktion");
my $width = $mw->screenwidth;
my $height = $mw->screenheight-200;
$mw->geometry($width.'x'.($height+200));

my $frame1 = $mw->Frame(-height=>40)->pack(-side=>'bottom', -fill=>'both', -expand=>1);
my $frame2 = $mw->Frame(-height=>40)->pack(-side=>'bottom', -fill=>'both', -expand=>1);
my $bt_beenden = $frame1->Button(-text=>"Beenden", -command=>sub{exit})->pack(-side=>'left', -padx=>5);
my $bt_reset = $frame1->Button(-text=>"Reset", -command=>\&feld_zeichnen)->pack(-side=>'left', -padx=>5);
my $LE_feld = $frame2->LabEntry(-label=>"Breite (4-10)",
                                  -labelPack=>[-side=>'right'], -width=>4,
                                  -text=>"5")->pack(-side=>'left', -padx=>20, -pady=>5);
$LE_feld->bind( '<Return>', \&feld_zeichnen);
my $LE_spieler = $frame2->LabEntry(-label=>"Spieler (2-6)",
                                  -labelPack=>[-side=>'right'], -width=>4,
                                  -text=>"2")->pack(-side=>'left', -padx=>20, -pady=>5);
$LE_spieler->bind( '<Return>', \&feld_zeichnen);        
my $LE_aktueller_spieler = $frame2->LabEntry(-label=>"aktueller Spieler",
                                  -labelPack=>[-side=>'right'], -width=>4,
                                  -text=>"1")->pack(-side=>'left', -padx=>20, -pady=>5);
my $LE_sieger = $frame2->LabEntry(-label=>"Sieger",
                                  -labelPack=>[-side=>'right'], -width=>4,
                                  -text=>"")->pack(-side=>'left', -padx=>20, -pady=>5);                                                           

my $breite_feld = 80;                                                             
my $c = $mw->Canvas(-width=>800, -height=>800, -bg=>'white')->pack(-side=>'top');
$c->CanvasBind('<ButtonPress-1>'=>[\&mausdown,Ev('x'),Ev('y'),$breite_feld]);

my %feld;

my $anzahl_feld = 5;
my $anzahl_spieler = 2;
&feld_zeichnen;

my $counter = 0;
my $spieler = 1;
my $sieger;


MainLoop;


sub feld_zeichnen{
   $c->delete('all');
   $anzahl_feld = $LE_feld->get;
   $anzahl_spieler = $LE_spieler->get;
   if (($anzahl_feld >= 4)&&($anzahl_feld <= 10)){
      for my $i(0..$anzahl_feld){
         $c->createLine($i*$breite_feld+1, 1, $i*$breite_feld+1, $anzahl_feld*$breite_feld+1);
         $c->createLine(1, $i*$breite_feld+1, $anzahl_feld*$breite_feld+1, $i*$breite_feld+1);
      }
   }
   &init($anzahl_feld);
}

sub init{
   my $anzahl_feld = $_[0];
   $spieler = 1;
   $LE_aktueller_spieler->configure(-text=>$spieler);
   $sieger = 0;
   $LE_sieger->configure(-text=>" ");
   ########## limit setzen ##########
   for my $i(2..($anzahl_feld-1)){
      for my $j(2..($anzahl_feld-1)){
         $feld{$i}->{$j}->{limit} = 4;
      }
   }
   for my $i(2..($anzahl_feld-1)){
      $feld{$i}->{1}->{limit} = 3;
      $feld{$i}->{$anzahl_feld}->{limit} = 3;
      $feld{1}->{$i}->{limit} = 3;
      $feld{$anzahl_feld}->{$i}->{limit} = 3;
   }
   $feld{1}->{1}->{limit} = 2;
   $feld{$anzahl_feld}->{1}->{limit} = 2;
   $feld{$anzahl_feld}->{$anzahl_feld}->{limit} = 2;
   $feld{1}->{$anzahl_feld}->{limit} = 2;
   
   for my $i(0..($anzahl_feld+1)){
      $feld{0}->{0}->{limit} = 0;
      $feld{$anzahl_feld+1}->{0}->{limit} = 0;
      $feld{$anzahl_feld+1}->{$anzahl_feld+1}->{limit} = 0;
      $feld{0}->{$anzahl_feld+1}->{limit} = 0;
   }
   ########## anzahl und besitzer nullen ##########
   for my $i(1..$anzahl_feld){
      for my $j(1..$anzahl_feld){
         $feld{$i}->{$j}->{anzahl} = 0;
         $feld{$i}->{$j}->{spieler} = 0;
      }
   }   
}

sub mausdown{
   my ($canvas, $x, $y, $breite_feld) = @_;
   my $feld_x = int($x/$breite_feld)+1;
   my $feld_y = int($y/$breite_feld)+1;
   if (($feld_x <= $anzahl_feld)&&($feld_y <= $anzahl_feld)){
      &setzen($feld_x,$feld_y);
      if (($feld{$feld_x}->{$feld_y}->{spieler} == $spieler)||($feld{$feld_x}->{$feld_y}->{spieler} == 0)){
         do{
            if ($spieler < $anzahl_spieler){$spieler++;}
            else{$spieler = 1;}
            $LE_aktueller_spieler->configure(-text=>$spieler);
         }while(&freies_feld($spieler) == 0);   
      }
      &farbig_hinterlegen;
   }
}

sub freies_feld{
   my $frei = 0;
   for my $i(1..$anzahl_feld){
      for my $j(1..$anzahl_feld){
         $frei = 1 if (($feld{$i}->{$j}->{spieler} == $spieler)||($feld{$i}->{$j}->{spieler} == 0));
      }
   }
   return $frei;
}

sub setzen{
   $counter = 0;
   my ($X, $Y) = @_;
   if (($feld{$X}->{$Y}->{spieler} == $spieler)||($feld{$X}->{$Y}->{spieler} == 0)){
      $feld{$X}->{$Y}->{anzahl} += 1;
      $feld{$X}->{$Y}->{spieler} = $spieler;
      &check($X,$Y);
   }   
}

sub check{
   if (++$counter < 10000){
      my ($X, $Y) = @_;
      if ($feld{$X}->{$Y}->{anzahl} == $feld{$X}->{$Y}->{limit}){
         $feld{$X}->{$Y}->{anzahl} = 0;    $feld{$X}->{$Y}->{spieler} = 0;
         $feld{$X+1}->{$Y}->{anzahl} += 1; $feld{$X+1}->{$Y}->{spieler} = $spieler; &check($X+1,$Y);
         $feld{$X-1}->{$Y}->{anzahl} += 1; $feld{$X-1}->{$Y}->{spieler} = $spieler; &check($X-1,$Y);
         $feld{$X}->{$Y+1}->{anzahl} += 1; $feld{$X}->{$Y+1}->{spieler} = $spieler; &check($X,$Y+1);
         $feld{$X}->{$Y-1}->{anzahl} += 1; $feld{$X}->{$Y-1}->{spieler} = $spieler; &check($X,$Y-1);
      }
   }
   else{
      $sieger = $spieler;
      $LE_sieger->configure(-text=>$spieler);
   }
}

sub farbig_hinterlegen{
   for my $X(1..$anzahl_feld){
      for my $Y(1..$anzahl_feld){
         my ($farbe, $hintergrund);
         $farbe = 'red' if ($feld{$X}->{$Y}->{spieler} == 1);
         $farbe = 'blue' if ($feld{$X}->{$Y}->{spieler} == 2);
         $farbe = 'green' if ($feld{$X}->{$Y}->{spieler} == 3);
         $farbe = 'yellow' if ($feld{$X}->{$Y}->{spieler} == 4);
         $farbe = 'black' if ($feld{$X}->{$Y}->{spieler} == 5);
         $farbe = 'brown' if ($feld{$X}->{$Y}->{spieler} == 6);
         $hintergrund = 'white' if ($feld{$X}->{$Y}->{spieler} != $spieler);
         $hintergrund = 'cyan' if ($feld{$X}->{$Y}->{spieler} == $spieler);
         if ($feld{$X}->{$Y}->{anzahl} == 0){
            $c->createRectangle(($X-1)*$breite_feld+1,($Y-1)*$breite_feld+1,$X*$breite_feld+1,$Y*$breite_feld+1, -fill=>$hintergrund);
         }   
         if ($feld{$X}->{$Y}->{anzahl} == 1){
            $c->createRectangle(($X-1)*$breite_feld+1,($Y-1)*$breite_feld+1,$X*$breite_feld+1,$Y*$breite_feld+1, -fill=>$hintergrund);
            $c->createOval(($X-1)*$breite_feld+int($breite_feld/2)-15,($Y-1)*$breite_feld+int($breite_feld/2)-15,($X-1)*$breite_feld+int($breite_feld/2)+15,($Y-1)*$breite_feld+int($breite_feld/2)+15, -fill=>$farbe);
         }
         if ($feld{$X}->{$Y}->{anzahl} == 2){
            $c->createRectangle(($X-1)*$breite_feld+1,($Y-1)*$breite_feld+1,$X*$breite_feld+1,$Y*$breite_feld+1, -fill=>$hintergrund);
            $c->createOval(($X-1)*$breite_feld+int($breite_feld/2)-22,($Y-1)*$breite_feld+int($breite_feld/2)-22,($X-1)*$breite_feld+int($breite_feld/2)+8,($Y-1)*$breite_feld+int($breite_feld/2)+8, -fill=>$farbe);
            $c->createOval(($X-1)*$breite_feld+int($breite_feld/2)-8,($Y-1)*$breite_feld+int($breite_feld/2)-8,($X-1)*$breite_feld+int($breite_feld/2)+22,($Y-1)*$breite_feld+int($breite_feld/2)+22, -fill=>$farbe);
         }
         if ($feld{$X}->{$Y}->{anzahl} == 3){
            $c->createRectangle(($X-1)*$breite_feld+1,($Y-1)*$breite_feld+1,$X*$breite_feld+1,$Y*$breite_feld+1, -fill=>$hintergrund);
            $c->createOval(($X-1)*$breite_feld+int($breite_feld/2)-30,($Y-1)*$breite_feld+int($breite_feld/2)-22,($X-1)*$breite_feld+int($breite_feld/2)+0,($Y-1)*$breite_feld+int($breite_feld/2)+8, -fill=>$farbe);
            $c->createOval(($X-1)*$breite_feld+int($breite_feld/2)-15,($Y-1)*$breite_feld+int($breite_feld/2)+5,($X-1)*$breite_feld+int($breite_feld/2)+15,($Y-1)*$breite_feld+int($breite_feld/2)+35, -fill=>$farbe);
            $c->createOval(($X-1)*$breite_feld+int($breite_feld/2)-0,($Y-1)*$breite_feld+int($breite_feld/2)-22,($X-1)*$breite_feld+int($breite_feld/2)+30,($Y-1)*$breite_feld+int($breite_feld/2)+8, -fill=>$farbe);
         }
      }
   }
}

View full thread Spiel: Kettenreaktion