# 盤面初期化
for ($i=0; $i<9; $i++) {
$b[$i]=0;
}
# メインループ
for ($i=0; $i<9; $i++) {
if ( ($i % 2) ==0 ) {
$b[&input(@b)]=1; # 先手
} else {
$b[&input(@b)]=-1; # 後手
}
&print_board(@b);
if (&check_winner(@b)!=0) {
last;
}
}
# 勝敗表示
if (&check_winner(@b)==1) {
print "○の勝ち!\n";
} elsif (&check_winner(@b)==-1) {
print "×の勝ち!\n";
} else {
print "引き分け!\n";
}
# 盤面表示サブルーチン
sub print_board {
my @b=@_;
my $i;
for ( $i=0; $i<9; $i++ ) {
if ( $b[$i]==1 ) {
print "○";
} elsif ( $b[$i]==-1 ) {
print "×";
} else {
print " ";
}
if ( ($i==2) || ($i==5) || ($i==8) ) {
print "\n";
}
}
}
# 勝敗チェックサブルーチン
sub check_winner {
my @b=@_;
my $i;
for ( $i=0; $i<3; $i++ ) {
if ( $b[$i*3+0]+$b[$i*3+1]+$b[$i*3+2]==3 ) {
return 1;
} elsif ( $b[$i*3+0]+$b[$i*3+1]+$b[$i*3+2]==-3 ) {
return -1;
}
}
for ( $i=0; $i<3; $i++ ) {
if ( $b[0+$i]+$b[3+$i]+$b[6+$i]==3 ) {
return 1;
} elsif ( $b[0+$i]+$b[3+$i]+$b[6+$i]==-3 ) {
return -1;
}
}
if ( $b[0]+$b[4]+$b[8]==3 ) {
return 1;
} elsif ( $b[0]+$b[4]+$b[8]==-3 ) {
return -1;
}
if ( $b[2]+$b[4]+$b[6]==3 ) {
return 1;
} elsif ( $b[2]+$b[4]+$b[6]==-3 ) {
return -1;
}
return 0;
}
# 入力サブルーチン
sub input {
my @b=@_;
my $number;
while () { # 無限ループ
print "012\n";
print "345\n";
print "678\n";
print "0-8の数字をいれてください。";
$number=<stdin>;
chomp($number);
if ($number>=0 && $number<=8) { # 数字チェック。文字列も0として通ってしまう。TT
if ($b[$number]!=0) { # 重複チェック
print "そのマスはすでに入力済みです。\n";
} else {
return $number;
}
} else {
print "入力が正しくありません。";
}
}
}