mkirank has asked for the wisdom of the Perl Monks concerning the following question:
Hi All,
I have successfully written my first perl 6 code :-) Please feel free to make changes and then someone with commit access can put it to the pugs/examples/games directory
#!/usr/bin/pugs
use v6;
my @g = ('.') xx 9;
my $cnt = 0;
for (@g)->$x {
print "$x \t";
print "\n" if ( !( ++$cnt % 3 ) );
}
my $player;
my %player = ('X','Player 1','O','Player 2');
my %entered;
my $choice = any (1 .. 9);
my $tmp = 0;
while ($tmp < 9)
{
$player = ( $tmp % 2 ) ?? 'O' :: 'X';
say %player{$player} ," Enter the Position [1-9]:";
my $in = =$IN;
if (!$in ~~ rx:perl5/[1-9]/) {
say " Please enter digits from 1-9 \n";
eval 'next';
}
if ($in == $choice) {
$in --;
if (%entered.exists($in)) {
say "Element already entered at $in";
eval 'next';
}
%entered{$in} ++;
$tmp ++;
} else {
say "Please enter a value within 1-9";
$tmp --;
eval 'next';
}
@g[$in] = $player;
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 (join ('',@g[@c]) ~~ rx:perl5/([XO])\1\1/) {
say " %player{$player} Wins \n";
exit;
}
}
for (@g) { print $_; print "\n" if ( !( ++ $cnt % 3 ) ); }
}
Re: Pugs Tic Tac
by stvn (Monsignor) on Apr 25, 2005 at 16:36 UTC
|
| [reply] |
Re: Pugs Tic Tac
by dragonchild (Archbishop) on Apr 25, 2005 at 19:01 UTC
|
I'm pretty sure this won't run on Pugs, but it does have more Perl6ish features.
The Perfect is the Enemy of the Good.
| [reply] [d/l] |
|
#!/usr/bin/pugs
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 (grep { $_ eq '.' } @g) {
say %player{$player} ~ " Enter the Position [1-9]:";
my $in = =$IN;
unless ($in == $choice) {
say "Please enter a value within 1-9";
}
else {
my $idx = $in - 1;
if (%entered.exists($idx)) {
say "Element already entered at $in";
}
else {
@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]] ne '.' && @g[$c[0]] eq @g[$c[1]] eq @g[$
+c[2]]) {
print_board( @g );
say " " ~ %player{$player} ~ " Wins \n";
exit();
}
}
print_board( @g );
$player = $player eq 'X' ?? 'O' :: 'X';
}
}
}
=pod
=head1 NAME
tic_tac_toe.p6 - Tic-Tac-Toe
=head1 DESCRIPTION
This is a perl6 implementation of the classic Tic-Tac-Toe game.
=head1 AUTHORS
mkirank L<http://www.perlmonks.org/index.pl?node_id=451261>
rob kinyon L<http://www.perlmonks.org/index.pl?node_id=451302>
stevan little, E<lt>stevan@iinteractive.comE<gt>
=cut
BTW - if either of you want commit access, just ask :)
| [reply] [d/l] |
Re: Pugs Tic Tac
by eric256 (Parson) on Apr 25, 2005 at 18:11 UTC
|
For my own sake, and others I hope, why do you have to do ~~ rx:perl5/([XO])\1\1/ instead of just plain old =~ /([XO])\1\1/?
| [reply] [d/l] [select] |
|
For my own sake, and others I hope, why do you have to do ~~ rx:perl5/([XO])\1\1/ instead of just plain old =~ /([XO])\1\1/?
The old pattern-match-binding operator =~ has been usurped by the smart match operator ~~, and "regular expressions" have been reworked in Perl6 to "rules". The old regular expression engine will still be there, but you have to use the vaguely ugly rx:perl5// syntax, or rx:P5// will work too (I think). The reason he used a P5 regex in the code is because Pugs doesn't have Perl6 rules support yet.
| [reply] [d/l] [select] |
|
Yes, as of 6.2.1, P5 works, as do Perl5 and perl5.
| [reply] |
|
~~ is called the "smart match operator" and supersedes the binding operator, =~. It allows you to use it on anything and it'll do the right thing, ie:
$i = 1; if ( $i ~~ 1 ) { # $i == 1
$i = 'foo'; if ( $i ~~ 'foo' ) { # $i eq 'foo'
$i = 'foo'; if ( $i ~~ m/fo(.)/ ) { # $1 contains 'o'
Read the "Smart Matching" section of Synopsis 4 for details.
rx is a replacement for qr. rx:perl5 means use perl5-compatible regular expressions. More details about rx in Synopsis 5.
| [reply] [d/l] [select] |
|
Thanks for the links. Are we sure this new language is perl? I mean it looks like perl, but it sure aint the same thing. Anyone else completly terrified by the need to learn a new language? I know it is not a need, and it does look quite cool, but I just feel like i'm getting the hang of 5.8. ;)
| [reply] |
|
Re: Pugs Tic Tac
by jacques (Priest) on Apr 25, 2005 at 17:00 UTC
|
| [reply] [d/l] |
|
Yuck. I want my old trinary operator back.
You use it often enough that The addition of two extra characters makes you say "yuck"? I mean, it works exactly the same. It looks nearly exactly the same. It just has two of each character instead of one.
Update: don't want my position to hinge on how often people use the operator.
| [reply] |
|
What has the single ''?'' been usurped for?? I can''t remember.. Or is the problem that ""everyone wants the colon"",, so a doubled colon was needed,, leading to a doubled question mark??
| [reply] |
|
|
|
|
You use it often enough that two extra characters makes you say "yuck"?
I do.
I mean, it works exactly the same. It looks nearly exactly the same. It just has two of each character instead of one.
It's an increase of 100%, you know? :-)
But please note: I'm not saying that I'm against the change or anything. With time, I'll probably enjoy it. I just wanted to make it perfectly clear that some people use the ternary operator a lot.
And I'm proudly one of them :-)
print "$users user", ( $users == 1 ? '' : 's'), " currently use the ternary operator.\n";
| [reply] [d/l] |
|
|
|
Re: Pugs Tic Tac
by stvn (Monsignor) on Apr 26, 2005 at 03:45 UTC
|
mkirank, dragonchild,
I have refactored the code to be even more perl6-ish. Some of the changes include using a junction instead of the %entered hash, adding argument and return type signatures to the print_board function, and improving the 'for' loop to use multiple topics (for (@b) -> $x, $y, $z { }) when printing the board.
You can see the changes here.
| [reply] [d/l] [select] |
|
|