-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgame
85 lines (65 loc) · 1.51 KB
/
game
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/perl
use Term::ANSIScreen qw(cls);
my $clear_screen = cls();
use strict;
use warnings;
use feature 'state';
use constant MARKS=>[ 'X', 'O' ];
use constant HAL9K=>'O';
use constant BOARD=>'
┌───┬───┬───┐
│ 7 │ 8 │ 9 │
├───┼───┼───┤
│ 4 │ 5 │ 6 │
├───┼───┼───┤
│ 1 │ 2 │ 3 │
└───┴───┴───┘
';
use lib 'hal';
use if -e 'hal/chip1.pm', 'chip1';
use if -e 'hal/chip2.pm', 'chip2';
use if -e 'hal/chip3.pm', 'chip3';
sub get_mark {
my $game = shift;
my @nums = $game =~ /[1-9]/g;
my $indx = (@nums+1) % 2;
return MARKS->[$indx];
}
sub put_mark {
my $game = shift;
my $mark = shift;
my $move = shift;
$game =~ s/$move/$mark/;
return $game;
}
sub get_move {
return (<> =~ /^[1-9]$/) ? $& : '0';
}
PROMPT: {
no strict;
no warnings;
state $game = BOARD;
my $mark;
my $move;
print $clear_screen;
print $game;
if (defined &get_victor) {
my $victor = get_victor $game, MARKS;
if (defined $victor) {
print "$victor wins!\n";
complain if ($victor ne HAL9K);
last PROMPT;
}
}
last PROMPT if ($game !~ /[1-9]/);
$mark = get_mark $game;
print "$mark\'s move?: ";
if ($mark eq HAL9K and defined &hal_move) {
$move = hal_move $game, $mark, MARKS;
print "$move\n";
} else {
$move = get_move;
}
$game = put_mark $game, $mark, $move;
redo PROMPT;
}