line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
=head1 NAME |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
Chess::Piece - a base class for chess pieces |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
=head1 SYNOPSIS |
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
$piece = Chess::Piece->new("e2", "white", "White King's pawn"); |
8
|
|
|
|
|
|
|
$piece->set_current_square("e4"); |
9
|
|
|
|
|
|
|
$e4 = $piece->get_current_square(); |
10
|
|
|
|
|
|
|
$piece->set_description("My Piece"); |
11
|
|
|
|
|
|
|
$description = $piece->get_description(); |
12
|
|
|
|
|
|
|
$color = $piece->get_color(); |
13
|
|
|
|
|
|
|
if (!$piece->moved()) { |
14
|
|
|
|
|
|
|
# do something with the unmoved piece |
15
|
|
|
|
|
|
|
} |
16
|
|
|
|
|
|
|
$piece->set_moved(1); |
17
|
|
|
|
|
|
|
if ($piece->threatened()) { |
18
|
|
|
|
|
|
|
# do something with the threatened piece |
19
|
|
|
|
|
|
|
} |
20
|
|
|
|
|
|
|
$piece->set_threatened(1); |
21
|
|
|
|
|
|
|
if ($piece->captured()) { |
22
|
|
|
|
|
|
|
# do something with the captured piece |
23
|
|
|
|
|
|
|
} |
24
|
|
|
|
|
|
|
$piece->set_captured(1); |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
=head1 DESCRIPTION |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
The Chess module provides a framework for writing chess programs with Perl. |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
This class represents the parent class for all Chess pieces, and contains |
31
|
|
|
|
|
|
|
accessors and mutators for all the common properties of chess pieces. |
32
|
|
|
|
|
|
|
The following is an exhaustive list of the properties of a Chess::Piece: |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
* initial square (read-only, specified at construction) |
35
|
|
|
|
|
|
|
* color (read-only, specified at construction) |
36
|
|
|
|
|
|
|
* current square |
37
|
|
|
|
|
|
|
* description |
38
|
|
|
|
|
|
|
* a flag indicating whether or not the piece has moved |
39
|
|
|
|
|
|
|
* a flag indicating whether or not the piece is threatened |
40
|
|
|
|
|
|
|
* a flag indicating whether or not the piece was captured |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
See L"METHODS"> for details of the methods which manipulate and return these |
43
|
|
|
|
|
|
|
properties. |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
=head1 METHODS |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
=head2 Construction |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
=over 4 |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
=item new() |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
Constructs a new Chess::Piece. Requires a two scalar arguments containing the |
54
|
|
|
|
|
|
|
initial square this piece is on and the color of the piece. If the program |
55
|
|
|
|
|
|
|
will use colors other than 'black' and 'white', then subclasses of |
56
|
|
|
|
|
|
|
Chess::Piece will need to override the L"can_reach()"> method to take these |
57
|
|
|
|
|
|
|
colors into account. Optionally takes a third argument containing a text |
58
|
|
|
|
|
|
|
description of the piece. Returns a blessed Chess::Piece object reference |
59
|
|
|
|
|
|
|
that can be used to call any of the methods listed in L"Object methods">. |
60
|
|
|
|
|
|
|
The square is not tested for validity, so the program must validate the |
61
|
|
|
|
|
|
|
square before calling new(). |
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
$piece = Chess::Piece->new("e2", "white"); |
64
|
|
|
|
|
|
|
$piece = Chess::Piece->new("e2", "white", "White King's pawn"); |
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
See also L"clone"> to construct a new Chess::Piece from an existing one. |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
=head2 Class methods |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
There are no class methods for this class. |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
=head2 Object methods |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
=item clone() |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
Clones an existing Chess::Piece. Requires no arguments. Returns a blessed |
77
|
|
|
|
|
|
|
Chess::Piece object reference which has data identical to the cloned piece, |
78
|
|
|
|
|
|
|
but can be manipulated separately. |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
$clone = $piece->clone(); |
81
|
|
|
|
|
|
|
$clone->set_description("Cloned piece"); |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=item get_initial_square() |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
Takes no parameters. Returns the initial square property that the piece was |
86
|
|
|
|
|
|
|
constructed with. |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
=item get_current_square() |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
Takes no parameters. Returns the value of the current square property. |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
=item set_current_square() |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
Takes a single scalar parameter containing the current square of this piece. |
95
|
|
|
|
|
|
|
Sets the current square property to this value. Like L"new()">, this square |
96
|
|
|
|
|
|
|
is not tested for validity and should be tested before calling the function. |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
=item get_description() |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
Takes no parameters. Returns the value of the description property. |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
=item set_description() |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
Takes a single scalar parameter containing a description for the piece. |
105
|
|
|
|
|
|
|
Sets the description property to this value. |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
=item get_color() |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
Takes no parameters. Returns the color property the piece was constructed with. |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
=item moved() |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
Takes no parameters. Returns true iff the piece has not been moved (as |
114
|
|
|
|
|
|
|
determined by a call to L"set_moved()">). |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
=item set_moved() |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
Takes a single scalar parameter containing true or false. Sets the moved flag |
119
|
|
|
|
|
|
|
if the parameter is true. |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
=item threatened() |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
Takes no parameters. Returns true iff the piece is not threatened (as |
124
|
|
|
|
|
|
|
determined by a call to L"set_threatened()">). |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
=item set_threatened() |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
Takes a single scalar parameter containing true or false. Sets the threatened |
129
|
|
|
|
|
|
|
flag if the parameter is true. |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
=item captured() |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
Takes no parameters. Returns true iff the piece is not captured (as |
134
|
|
|
|
|
|
|
determined by a call to L"set_captured()"> |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
=item set_captured() |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
Takes a single scalar parameter containing true or false. Sets the captured |
139
|
|
|
|
|
|
|
flag, and also sets the current square property to C, if the parameter |
140
|
|
|
|
|
|
|
is true. |
141
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
=item can_reach() |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
Takes a single scalar parameter containing the square to be tested. Returns |
145
|
|
|
|
|
|
|
true if the piece can reach the given square from its current location, as |
146
|
|
|
|
|
|
|
determined by a call to the abstract method L"reachable_squares()">. |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
=item reachable_squares() |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
This is an abstract method and must be overridden in all subclasses of |
151
|
|
|
|
|
|
|
Chess::Piece. Returns a list of squares (in lower-case) that the piece can |
152
|
|
|
|
|
|
|
reach. This list is used by L"can_reach()"> and various methods of |
153
|
|
|
|
|
|
|
L to determine legality of moves and other high-level analyses. |
154
|
|
|
|
|
|
|
Thus, subclasses of Chess::Piece not provided by this framework must return |
155
|
|
|
|
|
|
|
all squares that B reached, regardless of the current state of the |
156
|
|
|
|
|
|
|
board. The L method will then determine if all |
157
|
|
|
|
|
|
|
conditions for a particular move have been met. |
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
=back |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
=head1 DIAGNOSTICS |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
=over 4 |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
=item Missing argument to Chess::Piece::new() |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
The initial square argument is required. See L"new()"> for details on how |
168
|
|
|
|
|
|
|
to call this method. |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
=item Invalid Chess::Piece reference |
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
The program uses a reference which is undefined, or was obtained without |
173
|
|
|
|
|
|
|
using L"new()"> or L"clone()">. Ensure that the program only obtains |
174
|
|
|
|
|
|
|
its references from new() or clone() and that the reference refers to a |
175
|
|
|
|
|
|
|
defined value. |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
=item Call to abstract method Chess::Piece::reachable_squares() |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
The L"reachable_squares()"> function is abstract. Any class which subclasses |
180
|
|
|
|
|
|
|
Chess::Piece must provide its own implementation of this method. |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
=back |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
=head1 BUGS |
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
Please report any bugs to the author. |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
=head1 AUTHOR |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
Brian Richardson |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
=head1 COPYRIGHT |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
Copyright (c) 2002, 2005 Brian Richardson. All rights reserved. This module |
195
|
|
|
|
|
|
|
is Free Software. It may be modified and redistributed under the same terms |
196
|
|
|
|
|
|
|
as Perl itself. |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
=cut |
199
|
|
|
|
|
|
|
package Chess::Piece; |
200
|
|
|
|
|
|
|
|
201
|
12
|
|
|
12
|
|
20685
|
use strict; |
|
12
|
|
|
|
|
23
|
|
|
12
|
|
|
|
|
475
|
|
202
|
12
|
|
|
12
|
|
71
|
use Carp; |
|
12
|
|
|
|
|
25
|
|
|
12
|
|
|
|
|
1328
|
|
203
|
|
|
|
|
|
|
|
204
|
12
|
|
|
|
|
976
|
use constant OBJECT_FIELDS => ( |
205
|
|
|
|
|
|
|
_firstmoved => undef, |
206
|
|
|
|
|
|
|
init_sq => '', |
207
|
|
|
|
|
|
|
curr_sq => '', |
208
|
|
|
|
|
|
|
player => '', |
209
|
|
|
|
|
|
|
description => '', |
210
|
|
|
|
|
|
|
flags => 0x0 |
211
|
12
|
|
|
12
|
|
75
|
); |
|
12
|
|
|
|
|
20
|
|
212
|
|
|
|
|
|
|
|
213
|
12
|
|
|
12
|
|
77
|
use constant PIECE_MOVED => 0x01; |
|
12
|
|
|
|
|
20
|
|
|
12
|
|
|
|
|
597
|
|
214
|
12
|
|
|
12
|
|
83
|
use constant PIECE_THREATENED => 0x02; |
|
12
|
|
|
|
|
28
|
|
|
12
|
|
|
|
|
509
|
|
215
|
12
|
|
|
12
|
|
59
|
use constant PIECE_CAPTURED => 0x04; |
|
12
|
|
|
|
|
28
|
|
|
12
|
|
|
|
|
19878
|
|
216
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
{ |
218
|
|
|
|
|
|
|
my @_pieces = ( ); |
219
|
|
|
|
|
|
|
my %object_fields = OBJECT_FIELDS; |
220
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
sub _get_piece_ref { |
222
|
49382
|
|
|
49382
|
|
56724
|
my ($i) = @_; |
223
|
49382
|
|
|
|
|
83575
|
return $_pieces[$i]; |
224
|
|
|
|
|
|
|
} |
225
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
sub new { |
227
|
139
|
|
|
139
|
1
|
253
|
my ($caller, $init_sq, $color, $desc) = @_; |
228
|
139
|
|
33
|
|
|
503
|
my $class = ref($caller) || $caller; |
229
|
139
|
|
|
|
|
815
|
my $obj_data = { %object_fields }; |
230
|
139
|
50
|
33
|
|
|
674
|
croak "Missing argument to Chess::Piece::new()" unless ($init_sq && $color); |
231
|
139
|
|
|
|
|
240
|
$obj_data->{init_sq} = $init_sq; |
232
|
139
|
|
|
|
|
225
|
$obj_data->{curr_sq} = $init_sq; |
233
|
139
|
|
|
|
|
263
|
$obj_data->{player} = lc $color; |
234
|
139
|
100
|
|
|
|
883
|
$obj_data->{description} = $desc if ($desc); |
235
|
139
|
|
|
|
|
228
|
push @_pieces, $obj_data; |
236
|
139
|
|
|
|
|
203
|
my $i = $#_pieces; |
237
|
139
|
|
|
|
|
663
|
return bless \$i, $class; |
238
|
|
|
|
|
|
|
} |
239
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
sub clone { |
241
|
14707
|
|
|
14707
|
1
|
17668
|
my ($clonee) = @_; |
242
|
14707
|
|
33
|
|
|
32881
|
my $class = ref($clonee) || croak "Invalid Chess::Piece reference"; |
243
|
14707
|
|
|
|
|
24309
|
my $r_piece = _get_piece_ref($$clonee); |
244
|
14707
|
50
|
|
|
|
30344
|
croak "Invalid Chess::Piece reference" unless $r_piece; |
245
|
14707
|
|
|
|
|
88724
|
my $new_piece = { %$r_piece }; |
246
|
14707
|
|
|
|
|
27117
|
push @_pieces, $new_piece; |
247
|
14707
|
|
|
|
|
17450
|
my $i = $#_pieces; |
248
|
14707
|
|
|
|
|
54656
|
return bless \$i, $class; |
249
|
|
|
|
|
|
|
} |
250
|
|
|
|
|
|
|
|
251
|
|
|
|
|
|
|
sub _firstmoved { |
252
|
3
|
|
|
3
|
|
7
|
my ($self) = @_; |
253
|
3
|
|
33
|
|
|
13
|
my $class = ref($self) || croak "Invalid Chess::Piece reference"; |
254
|
3
|
|
|
|
|
8
|
my $r_piece = _get_piece_ref($$self); |
255
|
3
|
50
|
|
|
|
12
|
croak "Invalid Chess::Piece reference" unless $r_piece; |
256
|
3
|
|
|
|
|
28
|
return $r_piece->{_firstmoved}; |
257
|
|
|
|
|
|
|
} |
258
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
sub _set_firstmoved { |
260
|
165
|
|
|
165
|
|
311
|
my ($self, $movenum) = @_; |
261
|
165
|
|
33
|
|
|
594
|
my $class = ref($self) || croak "Invalid Chess::Piece reference"; |
262
|
165
|
|
|
|
|
323
|
my $r_piece = _get_piece_ref($$self); |
263
|
165
|
50
|
|
|
|
391
|
croak "Invalid Chess::Piece reference" unless $r_piece; |
264
|
165
|
|
|
|
|
601
|
$r_piece->{_firstmoved} = $movenum; |
265
|
|
|
|
|
|
|
} |
266
|
|
|
|
|
|
|
} |
267
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
sub get_initial_square { |
269
|
1
|
|
|
1
|
1
|
5
|
my ($self) = @_; |
270
|
1
|
50
|
|
|
|
5
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
271
|
1
|
|
|
|
|
4
|
my $r_piece = _get_piece_ref($$self); |
272
|
1
|
50
|
|
|
|
8
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
273
|
1
|
|
|
|
|
5
|
return $r_piece->{init_sq}; |
274
|
|
|
|
|
|
|
} |
275
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
sub get_current_square { |
277
|
17942
|
|
|
17942
|
1
|
29897
|
my ($self) = @_; |
278
|
17942
|
50
|
|
|
|
36680
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
279
|
17942
|
|
|
|
|
28270
|
my $r_piece = _get_piece_ref($$self); |
280
|
17942
|
50
|
|
|
|
39624
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
281
|
17942
|
|
|
|
|
54823
|
return $r_piece->{curr_sq}; |
282
|
|
|
|
|
|
|
} |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
sub set_current_square { |
285
|
202
|
|
|
202
|
1
|
1124
|
my ($self, $sq) = @_; |
286
|
202
|
50
|
|
|
|
629
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
287
|
202
|
|
|
|
|
416
|
my $r_piece = _get_piece_ref($$self); |
288
|
202
|
50
|
|
|
|
518
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
289
|
202
|
|
|
|
|
648
|
$r_piece->{curr_sq} = $sq; |
290
|
|
|
|
|
|
|
} |
291
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
sub get_description { |
293
|
4
|
|
|
4
|
1
|
14
|
my ($self) = @_; |
294
|
4
|
50
|
|
|
|
36
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
295
|
4
|
|
|
|
|
10
|
my $r_piece = _get_piece_ref($$self); |
296
|
4
|
50
|
|
|
|
11
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
297
|
4
|
|
|
|
|
15
|
return $r_piece->{description}; |
298
|
|
|
|
|
|
|
} |
299
|
|
|
|
|
|
|
|
300
|
|
|
|
|
|
|
sub set_description { |
301
|
2
|
|
|
2
|
1
|
12
|
my ($self, $desc) = @_; |
302
|
2
|
50
|
|
|
|
10
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
303
|
2
|
|
|
|
|
8
|
my $r_piece = _get_piece_ref($$self); |
304
|
2
|
50
|
|
|
|
7
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
305
|
2
|
|
|
|
|
7
|
$r_piece->{description} = $desc; |
306
|
|
|
|
|
|
|
} |
307
|
|
|
|
|
|
|
|
308
|
|
|
|
|
|
|
sub get_player { |
309
|
2808
|
|
|
2808
|
0
|
3568
|
my ($self) = @_; |
310
|
2808
|
50
|
|
|
|
5677
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
311
|
2808
|
|
|
|
|
4604
|
my $r_piece = _get_piece_ref($$self); |
312
|
2808
|
50
|
|
|
|
10274
|
croak "Invalid Chess::Piece reference" unless $r_piece; |
313
|
2808
|
|
|
|
|
9301
|
return $r_piece->{player}; |
314
|
|
|
|
|
|
|
} |
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
sub moved { |
317
|
2103
|
|
|
2103
|
1
|
2586
|
my ($self) = @_; |
318
|
2103
|
50
|
|
|
|
4358
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
319
|
2103
|
|
|
|
|
3766
|
my $r_piece = _get_piece_ref($$self); |
320
|
2103
|
50
|
|
|
|
4341
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
321
|
2103
|
|
|
|
|
11922
|
return $r_piece->{flags} & PIECE_MOVED; |
322
|
|
|
|
|
|
|
} |
323
|
|
|
|
|
|
|
|
324
|
|
|
|
|
|
|
sub set_moved { |
325
|
204
|
|
|
204
|
1
|
323
|
my ($self, $set) = @_; |
326
|
204
|
50
|
|
|
|
523
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
327
|
204
|
|
|
|
|
425
|
my $r_piece = _get_piece_ref($$self); |
328
|
204
|
50
|
|
|
|
513
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
329
|
204
|
100
|
|
|
|
641
|
$r_piece->{flags} |= PIECE_MOVED if ($set); |
330
|
204
|
100
|
|
|
|
796
|
$r_piece->{flags} &= ~PIECE_MOVED if (!$set); |
331
|
|
|
|
|
|
|
} |
332
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
sub threatened { |
334
|
135
|
|
|
135
|
1
|
232
|
my ($self) = @_; |
335
|
135
|
50
|
|
|
|
357
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
336
|
135
|
|
|
|
|
286
|
my $r_piece = _get_piece_ref($$self); |
337
|
135
|
50
|
|
|
|
699
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
338
|
135
|
|
|
|
|
675
|
return $r_piece->{flags} & PIECE_THREATENED; |
339
|
|
|
|
|
|
|
} |
340
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
sub set_threatened { |
342
|
318
|
|
|
318
|
1
|
520
|
my ($self, $set) = @_; |
343
|
318
|
50
|
|
|
|
898
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
344
|
318
|
|
|
|
|
681
|
my $r_piece = _get_piece_ref($$self); |
345
|
318
|
50
|
|
|
|
770
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
346
|
318
|
100
|
|
|
|
732
|
$r_piece->{flags} |= PIECE_THREATENED if ($set); |
347
|
318
|
100
|
|
|
|
1522
|
$r_piece->{flags} &= ~PIECE_THREATENED if (!$set); |
348
|
|
|
|
|
|
|
} |
349
|
|
|
|
|
|
|
|
350
|
|
|
|
|
|
|
sub captured { |
351
|
10753
|
|
|
10753
|
1
|
14152
|
my ($self) = @_; |
352
|
10753
|
50
|
|
|
|
22434
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
353
|
10753
|
|
|
|
|
18266
|
my $r_piece = _get_piece_ref($$self); |
354
|
10753
|
50
|
|
|
|
21730
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
355
|
10753
|
|
|
|
|
51054
|
return $r_piece->{flags} & PIECE_CAPTURED; |
356
|
|
|
|
|
|
|
} |
357
|
|
|
|
|
|
|
|
358
|
|
|
|
|
|
|
sub set_captured { |
359
|
35
|
|
|
35
|
1
|
71
|
my ($self, $set) = @_; |
360
|
35
|
50
|
|
|
|
117
|
croak "Invalid Chess::Piece reference" unless (ref($self)); |
361
|
35
|
|
|
|
|
85
|
my $r_piece = _get_piece_ref($$self); |
362
|
35
|
50
|
|
|
|
106
|
croak "Invalid Chess::Piece reference" unless ($r_piece); |
363
|
35
|
100
|
|
|
|
86
|
if ($set) { |
364
|
34
|
|
|
|
|
85
|
$r_piece->{curr_sq} = undef; |
365
|
34
|
|
|
|
|
107
|
$r_piece->{flags} |= PIECE_CAPTURED; |
366
|
|
|
|
|
|
|
} |
367
|
|
|
|
|
|
|
else { |
368
|
1
|
|
|
|
|
2
|
$r_piece->{flags} &= ~PIECE_CAPTURED; |
369
|
|
|
|
|
|
|
} |
370
|
|
|
|
|
|
|
} |
371
|
|
|
|
|
|
|
|
372
|
|
|
|
|
|
|
sub can_reach { |
373
|
4002
|
|
|
4002
|
1
|
10017
|
my ($self, $sq) = @_; |
374
|
4002
|
|
|
|
|
7974
|
my $lsq = lc $sq; |
375
|
4002
|
|
|
|
|
12815
|
return grep /^$sq$/, $self->reachable_squares(); |
376
|
|
|
|
|
|
|
} |
377
|
|
|
|
|
|
|
|
378
|
|
|
|
|
|
|
sub reachable_squares { |
379
|
0
|
|
|
0
|
1
|
|
croak "Call to abstract method Chess::Piece::reachable_squares()"; |
380
|
|
|
|
|
|
|
} |