| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
=head1 NAME |
|
2
|
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
Chess::Piece::Pawn - a class representing a pawn in a chess game |
|
4
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
$pawn = Chess::Piece::Pawn->new("e2", "White King's pawn"); |
|
8
|
|
|
|
|
|
|
$true = $pawn->can_reach("e4"); |
|
9
|
|
|
|
|
|
|
$true = $pawn->can_reach("e3"); |
|
10
|
|
|
|
|
|
|
$true = $pawn->can_reach("f3"); |
|
11
|
|
|
|
|
|
|
$false = $pawn->can_reach("e5"); |
|
12
|
|
|
|
|
|
|
$queen = $pawn->promote("queen"); |
|
13
|
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
15
|
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
The Chess module provides a framework for writing chess programs with Perl. |
|
17
|
|
|
|
|
|
|
This class is part of that framework, representing a pawn in a |
|
18
|
|
|
|
|
|
|
L. |
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
=head1 METHODS |
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
=head2 Construction |
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
=over 4 |
|
25
|
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
=item new() |
|
27
|
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
Constructs a new Chess::Piece::Pawn. Requires a two scalar parameters |
|
29
|
|
|
|
|
|
|
containing the square on which the pawn is to be constucted and its color, |
|
30
|
|
|
|
|
|
|
Optionally takes a third parameter containing a text description of the pawn. |
|
31
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
$pawn = Chess::Piece::Pawn->new("d2", "white"); |
|
33
|
|
|
|
|
|
|
$pawn = Chess::Piece::Pawn->new("e2", "white", |
|
34
|
|
|
|
|
|
|
"White King's pawn"); |
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
=head2 Class methods |
|
37
|
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
There are no class methods for this class. |
|
39
|
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
=head2 Object methods |
|
41
|
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
=item reachable_squares() |
|
43
|
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
Overrides base class version. Returns a list of squares that this pawn can |
|
45
|
|
|
|
|
|
|
reach from its current position. See L |
|
46
|
|
|
|
|
|
|
for more details on this method. |
|
47
|
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
=item promote() |
|
49
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
Takes a parameter containing the type of piece to promote to. Returns itself |
|
51
|
|
|
|
|
|
|
blessed as that type of piece. Returns undef and produces a warning (see |
|
52
|
|
|
|
|
|
|
L"DIAGNOSTICS"> if the piece is not one of 'bishop', 'knight', 'queen' or |
|
53
|
|
|
|
|
|
|
'rook'. |
|
54
|
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
=head1 DIAGNOSTICS |
|
56
|
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
=over 4 |
|
58
|
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
=item Can't promote a pawn to a 'king' |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
You may only promote a pawn to a 'bishop', 'knight', 'queen' or 'rook'. |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
=back |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
=head1 BUGS |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
Please report any bugs to the author. |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=head1 AUTHOR |
|
70
|
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
Brian Richardson |
|
72
|
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=head1 COPYRIGHT |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
Copyright (c) 2002, 2005 Brian Richardson. All rights reserved. This module |
|
76
|
|
|
|
|
|
|
is Free Software. It may be modified and redistributed under the same terms as |
|
77
|
|
|
|
|
|
|
Perl itself. |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
=cut |
|
80
|
|
|
|
|
|
|
package Chess::Piece::Pawn; |
|
81
|
|
|
|
|
|
|
|
|
82
|
6
|
|
|
6
|
|
68581
|
use Chess::Piece; |
|
|
6
|
|
|
|
|
14
|
|
|
|
6
|
|
|
|
|
154
|
|
|
83
|
6
|
|
|
6
|
|
1945
|
use Chess::Board; |
|
|
6
|
|
|
|
|
13
|
|
|
|
6
|
|
|
|
|
155
|
|
|
84
|
6
|
|
|
6
|
|
38
|
use base 'Chess::Piece'; |
|
|
6
|
|
|
|
|
10
|
|
|
|
6
|
|
|
|
|
844
|
|
|
85
|
6
|
|
|
6
|
|
46
|
use Carp; |
|
|
6
|
|
|
|
|
9
|
|
|
|
6
|
|
|
|
|
366
|
|
|
86
|
6
|
|
|
6
|
|
30
|
use strict; |
|
|
6
|
|
|
|
|
9
|
|
|
|
6
|
|
|
|
|
2830
|
|
|
87
|
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
sub new { |
|
89
|
69
|
|
|
69
|
1
|
159
|
my ($caller, $sq, $color, $desc) = @_; |
|
90
|
69
|
|
33
|
|
|
279
|
my $class = ref($caller) || $caller; |
|
91
|
69
|
|
|
|
|
257
|
my $self = $caller->SUPER::new($sq, $color, $desc); |
|
92
|
69
|
|
|
|
|
233
|
return bless $self, $class; |
|
93
|
|
|
|
|
|
|
} |
|
94
|
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
sub reachable_squares { |
|
96
|
2018
|
|
|
2018
|
1
|
2288
|
my ($self) = @_; |
|
97
|
2018
|
|
|
|
|
4902
|
my $color = $self->get_player(); |
|
98
|
2018
|
|
|
|
|
5215
|
my $csq = $self->get_current_square(); |
|
99
|
2018
|
|
|
|
|
2244
|
my $tsq1; |
|
100
|
2018
|
|
|
|
|
2969
|
my @squares = ( ); |
|
101
|
2018
|
100
|
|
|
|
3995
|
if ($color eq 'white') { |
|
102
|
997
|
50
|
|
|
|
4365
|
$tsq1 = Chess::Board->square_up_from($csq) if defined($csq); |
|
103
|
|
|
|
|
|
|
} |
|
104
|
|
|
|
|
|
|
else { |
|
105
|
1021
|
50
|
|
|
|
3845
|
$tsq1 = Chess::Board->square_down_from($csq) if defined($csq); |
|
106
|
|
|
|
|
|
|
} |
|
107
|
2018
|
100
|
|
|
|
5264
|
push @squares, $tsq1 if defined($tsq1); |
|
108
|
2018
|
|
|
|
|
2337
|
my $tsq2; |
|
109
|
2018
|
100
|
|
|
|
3642
|
if ($color eq 'white') { |
|
110
|
997
|
50
|
|
|
|
3440
|
$tsq2 = Chess::Board->square_up_from($tsq1) if defined($tsq1); |
|
111
|
|
|
|
|
|
|
} |
|
112
|
|
|
|
|
|
|
else { |
|
113
|
1021
|
100
|
|
|
|
3669
|
$tsq2 = Chess::Board->square_down_from($tsq1) if defined($tsq1); |
|
114
|
|
|
|
|
|
|
} |
|
115
|
2018
|
100
|
100
|
|
|
5561
|
push @squares, $tsq2 if (!$self->moved() and defined($tsq2)); |
|
116
|
2018
|
100
|
|
|
|
8071
|
$tsq2 = Chess::Board->square_left_of($tsq1) if defined($tsq1); |
|
117
|
2018
|
100
|
|
|
|
5319
|
push @squares, $tsq2 if (defined($tsq2)); |
|
118
|
2018
|
100
|
|
|
|
7124
|
$tsq2 = Chess::Board->square_right_of($tsq1) if defined($tsq1); |
|
119
|
2018
|
100
|
|
|
|
5176
|
push @squares, $tsq2 if (defined($tsq2)); |
|
120
|
2018
|
|
|
|
|
23734
|
return @squares; |
|
121
|
|
|
|
|
|
|
} |
|
122
|
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
sub promote { |
|
124
|
3
|
|
|
3
|
1
|
7
|
my ($self, $new_rank) = @_; |
|
125
|
3
|
50
|
33
|
|
|
87
|
unless (lc($new_rank) eq 'bishop' || lc($new_rank) eq 'knight' || |
|
|
|
|
33
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
126
|
|
|
|
|
|
|
lc($new_rank) eq 'rook' || lc($new_rank) eq 'queen') { |
|
127
|
0
|
|
|
|
|
0
|
carp "Can't promote a pawn to a '$new_rank'"; |
|
128
|
0
|
|
|
|
|
0
|
return undef; |
|
129
|
|
|
|
|
|
|
} |
|
130
|
3
|
|
|
|
|
19
|
return bless $self, ('Chess::Piece::' . ucfirst($new_rank)); |
|
131
|
|
|
|
|
|
|
} |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
1; |