ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Games-Go-SimpleBoard/SimpleBoard.pm
(Generate patch)

Comparing Games-Go-SimpleBoard/SimpleBoard.pm (file contents):
Revision 1.2 by root, Mon Jun 23 00:38:35 2008 UTC vs.
Revision 1.6 by root, Tue Jun 24 23:19:24 2008 UTC

17Marker types for each board position (ORed together): 17Marker types for each board position (ORed together):
18 18
19 MARK_TRIANGLE # triangle mark 19 MARK_TRIANGLE # triangle mark
20 MARK_SQUARE # square mark 20 MARK_SQUARE # square mark
21 MARK_CIRCLE # circle mark 21 MARK_CIRCLE # circle mark
22 MARK_CROSS # cross mark
22 MARK_SMALL_B # small stone, used for scoring or marking 23 MARK_SMALL_B # small stone, used for scoring or marking
23 MARK_SMALL_W # small stone, used for scoring or marking 24 MARK_SMALL_W # small stone, used for scoring or marking
24 MARK_B # normal black stone 25 MARK_B # normal black stone
25 MARK_W # normal whit stone 26 MARK_W # normal whit stone
26 MARK_GRAYED # in conjunction with MARK_[BW], grays the stone 27 MARK_GRAYED # in conjunction with MARK_[BW], grays the stone
31 MARK_REDRAW # ignored, can be used for your own purposes 32 MARK_REDRAW # ignored, can be used for your own purposes
32 33
33 COLOUR_BLACK # used for $board->{last} 34 COLOUR_BLACK # used for $board->{last}
34 COLOUR_WHITE # to mark the colour of the last move 35 COLOUR_WHITE # to mark the colour of the last move
35 36
37 MOVE_HANDICAP # used as "x-coordinate" for handicap moves
38 MOVE_PASS # can be used as "x-coordinate" for handicap moves
39
36=head2 METHODS 40=head2 METHODS
37 41
38=over 4 42=over 4
39 43
40=cut 44=cut
41 45
46no warnings;
47use strict;
48
49use Carp ();
50
42use base Exporter; 51use base Exporter::;
43 52
44our $VERSION = '1.0'; 53our $VERSION = '1.0';
45 54
46@EXPORT = qw( 55our @EXPORT = qw(
47 MARK_TRIANGLE MARK_SQUARE MARK_CIRCLE MARK_SMALL_B MARK_SMALL_W MARK_B 56 MARK_TRIANGLE MARK_SQUARE MARK_CIRCLE MARK_SMALL_B MARK_SMALL_W MARK_B
48 MARK_W MARK_GRAYED MARK_MOVE MARK_LABEL MARK_HOSHI MARK_KO 57 MARK_W MARK_GRAYED MARK_MOVE MARK_LABEL MARK_HOSHI MARK_KO
49 MARK_REDRAW 58 MARK_REDRAW
50 COLOUR_BLACK COLOUR_WHITE 59 COLOUR_BLACK COLOUR_WHITE
60 MOVE_HANDICAP MOVE_PASS
51); 61);
52 62
53# marker types for each board position (ORed together) 63# marker types for each board position (ORed together)
54 64
55sub MARK_TRIANGLE (){ 0x0001 } 65sub MARK_TRIANGLE (){ 0x0001 }
62sub MARK_GRAYED (){ 0x0080 } # in conjunction with MARK_[BW], grays the stone 72sub MARK_GRAYED (){ 0x0080 } # in conjunction with MARK_[BW], grays the stone
63sub MARK_LABEL (){ 0x0100 } 73sub MARK_LABEL (){ 0x0100 }
64sub MARK_HOSHI (){ 0x0200 } # this is a hoshi point (not used much) 74sub MARK_HOSHI (){ 0x0200 } # this is a hoshi point (not used much)
65sub MARK_MOVE (){ 0x0400 } # this is a regular move 75sub MARK_MOVE (){ 0x0400 } # this is a regular move
66sub MARK_KO (){ 0x0800 } # this is a ko position 76sub MARK_KO (){ 0x0800 } # this is a ko position
77sub MARK_CIRCLE (){ 0x1000 }
67sub MARK_REDRAW (){ 0x8000 } 78sub MARK_REDRAW (){ 0x8000 }
68 79
69sub COLOUR_BLACK (){ 0 } 80sub COLOUR_BLACK (){ 0 }
70sub COLOUR_WHITE (){ 1 } 81sub COLOUR_WHITE (){ 1 }
71 82
83sub MOVE_PASS (){ undef }
84sub MOVE_HANDICAP (){ -2 }
85
72=item my $board = new $size 86=item my $board = new $size
73 87
74Creates a new empty board of the given size. 88Creates a new empty board of the given size.
89
90C<< $board->{size} >> stores the board size.
75 91
76C<< $board->{max} >> stores the maximum board coordinate (size-1). 92C<< $board->{max} >> stores the maximum board coordinate (size-1).
77 93
78C<< $board->{captures}[COLOUR] >> stores the number of captured stones for 94C<< $board->{captures}[COLOUR] >> stores the number of captured stones for
79the given colour. 95the given colour.
87sub new { 103sub new {
88 my $class = shift; 104 my $class = shift;
89 my $size = shift; 105 my $size = shift;
90 bless { 106 bless {
91 max => $size - 1, 107 max => $size - 1,
108 size => $size,
92 board => [map [(0) x $size], 1 .. $size], 109 board => [map [(0) x $size], 1 .. $size],
93 captures => [0, 0], # captures 110 captures => [0, 0], # captures
94 #timer => [], 111 #timer => [],
95 #score => [], 112 #score => [],
96 #last => COLOUR_..., 113 #last => COLOUR_...,
134=item $hint = $board->update ([update-structures...]) 151=item $hint = $board->update ([update-structures...])
135 152
136Each update-structure itself is also an array-ref: 153Each update-structure itself is also an array-ref:
137 154
138 [$x, $y, $clr, $set, $label, $hint] # update or move 155 [$x, $y, $clr, $set, $label, $hint] # update or move
156 [MOVE_HANDICAP, $handicap] # black move, setup handicap
157 [MOVE_PASS] # pass
139 [] # pass 158 [] # also pass (deprecated!)
140 159
141It changes the board or executes a move, by first clearing the bits 160It changes the board or executes a move, by first clearing the bits
142specified in C<$clr>, then setting bits specified in C<$set>. 161specified in C<$clr>, then setting bits specified in C<$set>.
143 162
144If C<$set> includes C<MARK_LABEL>, the label text must be given in 163If C<$set> includes C<MARK_LABEL>, the label text must be given in
145C<$label>. 164C<$label>.
146 165
166If C<$set> contains C<MARK_MOVE>, then a circle symbol will be placed
167at this coordinate. Also, surrounded stones will be removed from the
168board and (simple) Kos are detected and marked with square symbols and
169C<MARK_KO>. The circle and square markings are removed with the next
170update that uses C<MARK_MOVE>, so this flag is suited well for marking,
171well, moves. Note that you can make invalid "moves" (such as suicide) and
172C<update> will try to cope with it. You can use C<is_valid_move> to avoid
173making illegal moves.
174
175For handicap "moves", currently only board sizes 9, 13 and 19 are
176supported and only handicap values from 2 to 9. The placement follows the
177IGS rules, if you want other placements, you have to set it up yourself.
178
147This function modifies the hint member of the specified path to speed up 179This function modifies the C<$hint> member of the specified structure
148repeated board generation and updates with the same update structures. 180to speed up repeated board generation and updates with the same update
181structures.
149 182
150If the hint member is a reference the scalar pointed to by the reference 183If the hint member is a reference the scalar pointed to by the reference
151is updated instead. 184is updated instead.
152 185
153If all this hint member thing is unclear, just ignore it and specify it 186If all this hint member thing is confusing, just ignore it and specify
154as C<undef> or leave it out of the array entirely. Do make sure that you 187it as C<undef> or leave it out of the array entirely. Do make sure that
155keep your update structures around, however, as regenerating a full board 188you keep your update structures around as long as previous updates don't
156position from hinted update structures is I<much> faster then recreating 189change, however, as regenerating a full board position from hinted
157it from fresh update structures. 190update structures is I<much> faster then recreating it from fresh update
191structures.
158 192
159Example, make two silly moves: 193Example, make two silly moves:
160 194
161 $board->update ([[0, 18, -1, MARK_B|MARK_MOVE], 195 $board->update ([[0, 18, -1, MARK_B | MARK_MOVE],
162 [0, 17, -1, MARK_W|MARK_MOVE]); 196 [0, 17, -1, MARK_W | MARK_MOVE]]);
163 197
164=cut 198=cut
199
200our %HANDICAP_COORD = (
201 9 => [2, 4, 6],
202 13 => [3, 6, 9],
203 19 => [3, 9, 15],
204);
205our %HANDICAP_XY = (
206 2 => [qw(0,2 2,0 )],
207 3 => [qw(0,2 2,0 0,0 )],
208 4 => [qw(0,2 2,0 0,0 2,2 )],
209 5 => [qw(0,2 2,0 0,0 2,2 1,1)],
210 6 => [qw(0,2 2,0 0,0 2,2 0,1 2,1 )],
211 7 => [qw(0,2 2,0 0,0 2,2 0,1 2,1 1,1)],
212 8 => [qw(0,2 2,0 0,0 2,2 0,1 2,1 1,0 1,2 )],
213 9 => [qw(0,2 2,0 0,0 2,2 0,1 2,1 1,0 1,2 1,1)],
214);
165 215
166sub update { 216sub update {
167 my ($self, $path) = @_; 217 my ($self, $path) = @_;
168 218
169 my $board = $self->{board}; 219 my $board = $self->{board};
174 my $nodemask = 224 my $nodemask =
175 $_ == $path->[-1] 225 $_ == $path->[-1]
176 ? ~0 226 ? ~0
177 : ~(MARK_SQUARE | MARK_TRIANGLE | MARK_CIRCLE | MARK_LABEL | MARK_KO); 227 : ~(MARK_SQUARE | MARK_TRIANGLE | MARK_CIRCLE | MARK_LABEL | MARK_KO);
178 228
179 if (defined $x) { 229 if (!defined $x) {
230 # pass
231 $self->{last} = $set & MARK_B ? COLOUR_BLACK : COLOUR_WHITE;
232
233 } elsif ($x == MOVE_HANDICAP) {
234 # $y = #handicap stones
235 my $c = $HANDICAP_COORD{$self->{size}}
236 or Carp::croak "$self->{size}: illegal board size for handicap";
237 my $h = $HANDICAP_XY{$y}
238 or Carp::croak "$y: illegal number of handicap stones";
239
240 for (@$h) {
241 my ($x, $y) = map $c->[$_], split /,/;
242 $board->[$x][$y] = MARK_B | MARK_MOVE;
243 }
244
245 } else {
180 $board->[$x][$y] = 246 $board->[$x][$y] =
181 $board->[$x][$y] 247 $board->[$x][$y]
182 & ~$clr 248 & ~$clr
183 | $set 249 | $set
184 & $nodemask; 250 & $nodemask;
229 $board->[$x][$y] |= MARK_KO & $nodemask; 295 $board->[$x][$y] |= MARK_KO & $nodemask;
230 } 296 }
231 } 297 }
232 } 298 }
233 } 299 }
234 } else {
235 $self->{last} = $set & MARK_B ? COLOUR_BLACK : COLOUR_WHITE;
236 } 300 }
237 } 301 }
238} 302}
239 303
240=item $board->is_valid_move ($colour, $x, $y[, $may_suicide]) 304=item $board->is_valid_move ($colour, $x, $y[, $may_suicide])
241 305
242Returns true if the move of the given colour on the given coordinates is 306Returns true if the move of the given colour on the given coordinates is
243valid or not. 307valid or not. Kos are taken into account as long as they are marked with
308C<MARK_KO>. Suicides are invalid unless C<$may_suicide> is true (e.g. for
309new zealand rules)
244 310
245=cut 311=cut
246 312
247sub is_valid_move { 313sub is_valid_move {
248 my ($self, $colour, $x, $y, $may_suicide) = @_; 314 my ($self, $colour, $x, $y, $may_suicide) = @_;
278 344
279Marc Lehmann <schmorp@schmorp.de> 345Marc Lehmann <schmorp@schmorp.de>
280 346
281=head2 SEE ALSO 347=head2 SEE ALSO
282 348
283L<KGS::Protocol>, L<KGS::Game::Tree>, L<Gtk2::GoBoard>. 349L<Gtk2::GoBoard>.
284 350
285=cut 351=cut
286 352

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines