I'm pretty sure this won't run on Pugs, but it does have more Perl6ish features.
use v6;
sub print_board ( @b ) {
my $count = 0;
for (@b) -> $x {
print "$x \t";
print "\n" unless ++count % 3;
}
}
my @g = ('.') xx 9;
print_board( @g );
my %player = ('X','Player 1','O','Player 2');
my %entered;
my $choice = any (1 .. 9);
my $player = 'X';
while (@g ==> grep { $_ eq '.' })
{
INPUT: {
say %player{$player} ," Enter the Position [1-9]:";
my $in = =$IN;
unless ($in == $choice) {
say "Please enter a value within 1-9";
redo INPUT;
}
my $idx = $in - 1;
if (%entered.exists($idx)) {
say "Element already entered at $in";
redo INPUT;
}
@g[$idx] = $player;
%entered{$idx} ++;
}
for (
[ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ],
[ 0, 3, 6 ], [ 1, 4, 7 ], [ 2, 5, 8 ],
[ 0, 4, 8 ], [ 2, 4, 6 ],
) -> @c
{
if ( @g[@c[0]] eq @g[@c[1]] eq @g[@c[2]] )
say " %player{$player} Wins \n";
exit;
}
}
print_board( @g );
$player = $player eq 'X' ?? 'O' :: 'X';
}