○×ゲームを作る (4) 勝敗を判定する

今回は、勝敗を判定するコードを書いてみます。

はじめに用意した二次元配列には、初期値として 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(); と記述してみてください。下図のように、勝敗の判定ができるようになりました。

 

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

Leave a Reply

Your email address will not be published. Required fields are marked *