NAME
Games::Go::Cinderblock::Scorable - An abstract state of endgame score negotiation
SYNOPSIS
my $rulemap = Games::Go::Cinderblock::Rulemap::Rect->new( h=>2, w=>5 );
my $board = [
[qw/0 w 0 b b/],
[qw/0 w w b 0/],
];
my $state_to_score = Games::Go::Cinderblock::State->new(
rulemap => $rulemap,
turn => 'b',
board => $board,
);
my $scorable = $state_to_score->scorable;
my %score = $scorable->score;
say "black: $score{b}, white: $score{w}";
# black: 1, white: 2
$scorable->transanimate([0,4]);
# equivelent: $scorable->deanimate([0,4]);
my %dead_stones = $scorable->dead;
say "black: $dead_stones{b}, white: $dead_stones{w}";
# black: 3, white: 0
#
$scorable->reanimate([0,4]);
# equivelent: $scorable->transanimate([0,4]);
# score black: 1, white: 2
DESCRIPTION
The status of each node is one of the following categories: categories:
Stone-occupied node categories:
- alive
-
The initial state.
- dead
-
A scorable must be told what stones are dead.
- seki?
-
not implemented. Maybe the stones are alive in seki? dunno how to mark seki.
stoneless node categories:
- known_territory
-
considering stones that are known to be dead, this area is known to be alive.
- derived_territory
-
Surrounded by stones that may be deanimated.
- dame
-
the region is bounded by stones of more than one color.
- seki territory?
-
not implemented. Further research is needed.
I think that this covers all categories related to score negotiation for different scoring regimes.
head1 TERMINOLOGY
- deanimate -- To set as dead, to kill
- reanimate -- To set as alive, to revive
- animation -- the life/death state of a stone, chain, group, or any (in)?animate object
- transanimate -- to animate xor deanimate something, to to toggle the life/death state
METHODS
dame
Returns a Games::Go::Cinderblock::NodeSet of contiguous empty regions bounded by multiple colors.
territory($color)
Returns a nodeset of known & perceived territory.
Excludes nodes occupied by dead stones of the opposite color
dead ($color)
Returns a nodeset of stone of $color, which have been deanimated
alive ($color)
Returns a nodeset of nodes with stones of $color, which have not been deanimated. Alive is the default state.
deanimate($node)
$node must be occupied with a stone.
This marks a stone as dead, and the region bounded by stones of the opposite color is now known territory of the opposite color. Contained nodes of the same color as $node are also marked as dead.
reanimate($node)
Opposite of deanimate($node)
transanimate($node)
Either reanimates or deanimates at $node. Does nothing if $node is empty.
RULES
Empty regions are initially either dame or derived territory. marking a stone as dead has the effect of converting dame/derived to known for the region bounded by stones of the opposite color. reanimating dead stones returns its adjacent empty nodes to dame. alive stones adjacent to known territory can not be deanimated.
REPRESENTATION
Each category has a hash attribute in the scorable object. they are divided into colors, where each color of that cat has a B::NodeSet. the cats are named _alive, _dead, _known_terr, _derived_terr, _dame, maybe _seki later. each transanimation initiates a floodfill to discover the boundry of its the region bordered by the opposite color.
The dame category is an exception. there is no color specified.