勝敗を調べる(勝敗チェックサブルーチン)

  1. 行・列・斜めについて同じ記号が並んでいるかどうか調べ、並んでいた場合には勝敗を表示する。チェックする際には

    ことを利用する。

    # 勝敗チェックサブルーチン
    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 ) {
    			print "○の勝ち!\n";
    		} elsif ( $b[$i*3+0]+$b[$i*3+1]+$b[$i*3+2]==-3 ) {
    			print "×の勝ち!\n";
    		}
    	}
    	for ( $i=0; $i<3; $i++ ) { # 縦チェック
    		if ( $b[0+$i]+$b[3+$i]+$b[6+$i]==3 ) {
    			print "○の勝ち!\n";
    		} elsif ( $b[0+$i]+$b[3+$i]+$b[6+$i]==-3 ) {
    			print "×の勝ち!\n";
    		}
    	}
    	if ( $b[0]+$b[4]+$b[8]==3 ) { # 斜めチェック1
    		print "○の勝ち!\n";
    	} elsif ( $b[0]+$b[4]+$b[8]==-3 ) {
    		print "×の勝ち!\n";
    	}
    	if ( $b[2]+$b[4]+$b[6]==3 ) { # 斜めチェック2
    		print "○の勝ち!\n";
    	} elsif ( $b[2]+$b[4]+$b[6]==-3 ) {
    		print "×の勝ち!\n";
    	}
    }
  2.  勝者(○ならば 1, ×ならば-1, 未定ならば 0)を返すように変更する。
    (勝敗後の処理を変更しやすいようにするため)
    # 勝敗チェックサブルーチン
    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;
    }
    呼び出し側(メインルーチン)
    if (&check_winner(@b)==1) {
    	print "○の勝ち!\n";
    } elsif (&check_winner(@b)==-1) {
    	print "×の勝ち!\n";
    } else {
    	print "引き分け!\n";
    }