NAME

Games::Chomp - Playing Chomp and calculating winning positions

SYNOPSIS

use Games::Chomp;
my $chomp = new Games::Chomp;
$chomp->run;

DESCRIPTION

Chomp is the name of a mathematical table game with 
finate number of positions. Though it is easily proven 
that the one who moves first has a winning strategy
there is no mathematical function that will calculate
the next winning move from any given position.

This module provides an algorithm to programatically 
calculate the winning moves for any given position.

The current implementation has some O(n**4) (?) complexity
so it is not a good one but this is the first version after
all.

THE RULES

There is a chocolate of n*m cubes.
The upper left cube is poisoned. Two people are eating the
chocolate (at least one cube at a time) and whoever eats the 
poisoned chocolate looses.

Eating the chocolate is done by pointing at one of the existing 
cubes eating it and everything to the right and below it.

Examples:
In the following case 
z - is the poisoned cube.
o - is a regular cube
x - is where the player points

Beginning: a chocolate with 4 rows and 6 cubes in every row.
zooooo
oooooo
oooooo
oooooo

player 1 points at row 2 cube 4

zooooo
oooxoo
oooooo
oooooo

result:

zooooo
ooo
ooo
ooo


player 2 points at row 3 cube 2

zooooo
ooo
oxo
ooo

result:

zooooo
ooo
o
o

player 1 points at row 1 cube 2

zxoooo
ooo
o
o

z
o
o
o

player 2 points at row 2 cube 1

z
x
o
o

result:

z

player 1 has to eat the poisoned cube so s/he looses.

METHODS

use Games::Chomp;
my $chomp = new Games::Chomp;

$chomp->run;
   ask for position in row-length representation
   computes all the positions up to that position and
   saves them in a file called chomp.txt in the local
   directory.
   Using run later will use the already calculated
   positions that were saved in that file.

$chomp->reset;
   Empties the list of winning positions kept in memory.
   The only case you want to use this is if you want to
   benchmark the module and start from an empty environment.

$chomp->resolve(POSITION);
   POSITION is array reference, it is a reference to a row-length 
   representation.
   
   resolve returns 1 if the above position is a winning position
   and returns 0 if it is a loosing position. As a side effect
   it *might* compute the 'winningness' of all the positions
   which are smaller than this one.

$chomp->show_all_winning_pos
   prints all the winning positions calculated so far
   (except the already obvious onces.) in row-length representation.

$chomp->transpose(POSITION)
   returns a reference to an array which is a POSITION where
   the rows and the columns are transposed.
   given [5,4,3]  it returns [3,3,3,2,1]
   not implemented yet

REPRESENTATIONS

A certain state of the game can be represented in different ways.

ROW-LENGTH
One of the ways I call row-length representation. I use this
representation in my implementation. In this representation we
give a list of numbers that represent the number of chocolates 
in the given row. [5,4,3] is the same as
    ooooo
    oooo
    ooo

AUTHOR

Gabor Szabo <lt>gabor@tracert.com<gt>

COPYRIGHT

The Games::Chomp module is Copyright (c) 2002 Gabor Szabo.
All rights reserved.

You may distribute under the terms of either the GNU General Public
License or the Artistic License, as specified in the Perl README file.

SEE ALSO

Games::NIM