This is my first non-trivial program in Perl6. I had been experimenting with the Microsoft Winter Scripting Games to get a feel for the language using Rakudo (version 34768 : Dec 31, 2008), but wanted something a little less trivial. At about the same time, I was playing with my new Tivo, and found a game there that it calls "Skulls and Bones" -- but which I have always known as "Connect 4"
The goal of that game is to create a line of 4 of your tokens before you opponent does. The board is 7x7 on a vertical plane: you play in one of the seven columns, and the counter comes to rest in the lowest available row of that column.
I started by writing a simple computer player. Nothing hi-tech: it simply selects a random move from a set that it winnow down by looking ahead one or two moves to see if it can win or if it can prevent its opponent from winning. It started out as a procedural script, but then I refactored it to use P6 classes -- and enable different "Player" subclasses that have different strategies: one such subclass uses the strategy: ask the user.
The conversion of the code to html was done using vim with Luke Palmer's perl-6 syntax highlighting module
1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - Enter column number for X to play: 3 play 'X' -> 3 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | X | - | - | - | - 'O' should play one of 1 2 3 4 5 6 7 play 'O' -> 5 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | X | - | O | - | - Enter column number for X to play: 5 play 'X' -> 5 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | X | - | - - | - | X | - | O | - | - 'O' should play one of 1 2 3 4 5 6 7 play 'O' -> 6 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | X | - | - - | - | X | - | O | O | - Enter column number for X to play: 3 play 'X' -> 3 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | X | - | X | - | - - | - | X | - | O | O | - 'O' should play one of 1 2 3 4 5 6 7 play 'O' -> 4 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | X | - | X | - | - - | - | X | O | O | O | - Enter column number for X to play: 7 play 'X' -> 7 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | X | - | X | - | - - | - | X | O | O | O | X 'O' should play one of 1 2 3 4 5 6 7 play 'O' -> 1 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | X | - | X | - | - O | - | X | O | O | O | X Enter column number for X to play: 6 play 'X' -> 6 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | X | - | X | X | - O | - | X | O | O | O | X 'O' should play one of 4 play 'O' -> 4 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | X | O | X | X | - O | - | X | O | O | O | X Enter column number for X to play: 5 play 'X' -> 5 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | X | - | - - | - | X | O | X | X | - O | - | X | O | O | O | X 'O' should play one of 1 2 3 5 6 7 play 'O' -> 7 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | X | - | - - | - | X | O | X | X | O O | - | X | O | O | O | X Enter column number for X to play: 3 play 'X' -> 3 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | X | - | X | - | - - | - | X | O | X | X | O O | - | X | O | O | O | X 'O' should play one of 3 play 'O' -> 3 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | O | - | - | - | - - | - | X | - | X | - | - - | - | X | O | X | X | O O | - | X | O | O | O | X Enter column number for X to play: 4 play 'X' -> 4 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | O | - | - | - | - - | - | X | X | X | - | - - | - | X | O | X | X | O O | - | X | O | O | O | X 'O' has no move preference play 'O' -> 7 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | O | - | - | - | - - | - | X | X | X | - | O - | - | X | O | X | X | O O | - | X | O | O | O | X Enter column number for X to play: 4 play 'X' -> 4 1 2 3 4 5 6 7 - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | - | - | - | - | - - | - | O | # | - | - | - - | - | X | X | * | - | O - | - | X | O | X | * | O O | - | X | O | O | O | * X WINS on move 9!