ゲームの手順(メインルーチン)

  1. 以下を9回繰り返し。
    1. 入力(サブルーチン呼び出し)
    2. 入力されたマス目の番号に○(先手)または×(後手)を書き込む
    3. 盤面表示(サブルーチン呼び出し)
    4. 勝敗チェック(サブルーチン呼び出し)
    5. 勝敗が決まっていたらループを脱出
    # 盤面初期化
    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;
    	}	
    }
     
  2. 勝敗チェックをした結果により勝敗を表示する。上記のプログラムに追加。
    # 勝敗表示
    if (&check_winner(@b)==1) {
    	print "○の勝ち!\n";
    } elsif (&check_winner(@b)==-1) {
    	print "×の勝ち!\n";
    } else {
    	print "引き分け!\n";
    }

ここまでのプログラム

# 盤面初期化
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 "入力が正しくありません。";
		}
	}
}