今回は、勝敗を判定するコードを書いてみます。
はじめに用意した二次元配列には、初期値として 1 を設定してあります。もしプレイヤーが 1 列そろえると、そろった列のマスの値がすべて 2 になるので、3つの値を掛け合わせると、2 × 2 × 2 = 8 になります。同様に、コンピュータが 1 列そろえると、そろったマスの値は 3 になり、すべて掛け合わせると 27 になります。これを利用して勝敗の判定を行いましょう。
勝敗を判定する win() 関数を作成します。winという名前で新しいタブを作成してください(「え、何のこと?」という方は、前回を参考にしてみてください)。この関数では、ちょっと力技ですが、縦 3 列、横 3 列、斜め 2 列の値をそれぞれ掛け、いずれかの列の値が 9 (プレイヤーの勝利)、もしくは27(プレイヤーの負け)となるかを判定します。
void win(){
textSize(100);
fill(0);
textAlign(CENTER, CENTER);
if((map[0][0]*map[0][1]*map[0][2] == 8) ||
(map[1][0]*map[1][1]*map[1][2] == 8) ||
(map[2][0]*map[2][1]*map[2][2] == 8) ||
(map[0][0]*map[1][0]*map[2][0] == 8) ||
(map[0][1]*map[1][1]*map[2][1] == 8) ||
(map[0][2]*map[1][2]*map[2][2] == 8) ||
(map[0][0]*map[1][1]*map[2][2] == 8) ||
(map[2][0]*map[1][1]*map[0][2] == 8)) {
text("YOU WIN!", width/2, height/2);
}
else if((map[0][0]*map[0][1]*map[0][2] == 27) ||
(map[1][0]*map[1][1]*map[1][2] == 27) ||
(map[2][0]*map[2][1]*map[2][2] == 27) ||
(map[0][0]*map[1][0]*map[2][0] == 27) ||
(map[0][1]*map[1][1]*map[2][1] == 27) ||
(map[0][2]*map[1][2]*map[2][2] == 27) ||
(map[0][0]*map[1][1]*map[2][2] == 27) ||
(map[2][0]*map[1][1]*map[0][2] == 27)) {
text("YOU LOSE!", width/2, height/2);
}
else if (turn >= 9){
text("DRAW", width/2, height/2);
}
}
最初の if 文でプレイヤーが勝ったかを判定し、そうでなければ、次の else if 文でプレイヤーが負けた(コンピュータの勝った)かを判定し、そのどちらでもなければ、その後の else if 文で引き分けかどうかを判定しています。
この win() 関数を、プレイヤー、コンピュータそれぞれのターンが終わる際に組み込むことで勝敗を判定することができます。draw() 関数の中で、プレイヤーが丸をつけた直後と、randomXの直後に win(); と記述してみてください。下図のように、勝敗の判定ができるようになりました。

現状では、コンピュータ側の戦略がありません。ですので、偶然にコンピュータ側にチャンスが回ってきても、それを生かすことができません。これでは面白みにかけてしまいますね。次回、コンピュータ側をもっと賢くさせましょう。