> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.KOL$pf5i9IP/rev.12868
 * 
 * authors: 
 *   Jeff Bauer

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



/*
 
Tic Tac Toe
by Jeff Bauer
 
*/
 
background(255);
 
size(300, 300);
 
mark = ["X", "O"];
 
var buttons = [];
 
var markedX = [];
 
var markedO = [];

var playing = true;
 
// draw the grid
var drawGame = function() {
    line(125, 75, 125, 225);
    line(175, 75, 175, 225);
    line(75, 125, 225, 125);
    line(75, 175, 225, 175);
}
 
var drawWin = function() {
    // background(0, 0, 0);
    textSize(20);
    fill(0);
    textAlign(CENTER, TOP);
    text("3 X's in a row!", width/2, 20);
    playing = false;
}
 
var drawGameOver = function() {
    // background(0, 0, 0);
    textSize(20);
    fill(0);
    textAlign(CENTER, TOP);
    text("3 O's in a row!", width/2, 20);
    playing = false;
}
 
var drawTie = function() {
    // background(0, 0, 0);
    textSize(20);
    fill(0);
    textAlign(CENTER, TOP);
    text("It's a draw!", width/2, 20);
    playing = false;
}
 
drawGame();
 
var Button = function(x, y, row, col) {
    this.x = x || 0;
    this.y = y || 0;
    this.row = row || 0;
    this.col = col || 0;
    this.width = 50;
    this.height = 50;
    this.label = "";
    this.onClick = function() { 
       fill(0, 0, 0);
       textSize(50);
       textAlign(CENTER, CENTER);
       text(mark[0], this.x+this.width/2, this.y+this.height/2);
       this.label = mark[0];
    };
};
 
Button.prototype.isMouseInside = function() {
    return mouseX > this.x &&
           mouseX < (this.x + this.width) &&
           mouseY > this.y &&
           mouseY < (this.y + this.height);
};
 
Button.prototype.handleMouseClick = function() {
    if (this.isMouseInside()) {
        if (playing) {
            this.onClick();
            pos = buttons.indexOf(this);
            markedX.push(buttons[pos]);
            buttons.splice(pos, 1);
            if(checkVictoryX()) {
                drawWin();
            } 
            if(markedX.length + markedO.length < 9) {
                compMove();
            }
            if(checkVictoryO()) {
                drawGameOver();
            } 
            if(markedX.length + markedO.length == 9) {
                drawTie();
            }
        }
    }
};
 
for(var x = 0; x < 3; x++) {
    for(var y = 0; y < 3; y++) {
        buttons.push(new Button(x * 50 + 75, y * 50 + 75, y, x));
    }
}
 
mouseClicked = function() {
    for(i = 0; i < buttons.length; i++) {
        buttons[i].handleMouseClick();
    }
};
 
// Easy
 
var compMove = function() {
    var r = random(buttons.length);
    r = floor(r);
    fill(0, 0, 0);
    textSize(50);
    textAlign(CENTER, CENTER);
    text(mark[1], buttons[r].x+buttons[r].width/2, buttons[r].y+buttons[r].height/2);
    buttons[r].label = mark[1];
    markedO.push(buttons[r]);
    buttons.splice(r, 1);
};
 
 
// Hard
/*
var compMove = function() {
    if(markedX < 2) {
        var r = random(buttons.length);
        r = floor(r);
        fill(0, 0, 0);
        textSize(50);
        textAlign(CENTER, CENTER);
        text("O", buttons[r].x+buttons[r].width/2, buttons[r].y+buttons[r].height/2);
        markedO.push(buttons[r]);
        buttons.splice(r, 1);
    } else if( 
};
*/
 
var sortX = function(ar) {
    ar.sort(function(a, b) {
        return a.x - b.x;
    });
}
 
var sortY = function(ar) {
    ar.sort(function(a, b) {
        return a.y - b.y;
    });
}
 
var checkVictoryX = function() {
    var row0 = 0;
    var row1 = 0;
    var row2 = 0;
    var col0 = 0;
    var col1 = 0;
    var col2 = 0;
    var diagTL = 0;
    var diagTR = 0;
    for(var i = 0; i < markedX.length; i++) {
        if(markedX[i].row == 0) {
            row0++;
            if(markedX[i].col == 0) {
                diagTL++;
            }
            if(markedX[i].col == 2) {
                diagTR++;
            }
            if(diagTL > 2) {
                return true;
            }
            if(diagTR > 2) {
                return true;
            }
            if(row0 > 2) {
                return true;
            }
        } else if(markedX[i].row == 1) {
            row1++;
            if(markedX[i].col == 1) {
                diagTL++;
                diagTR++;
            }
            if(diagTL > 2) {
                return true;
            }
            if(diagTR > 2) {
                return true;
            }
            if(row1 > 2) {
                return true;
            }
        } else if(markedX[i].row == 2) {
            row2++;
            if(markedX[i].col == 2) {
                diagTL++;
            }
            if(markedX[i].col == 0) {
                diagTR++;
            }
            if(diagTL > 2) {
                return true;
            }
            if(diagTR > 2) {
                return true;
            }
            if(row2 > 2) {
                return true;
            }
        } 
        if(markedX[i].col == 0) {
            col0++;
            if(col0 > 2) {
                return true;
            }
        } else if(markedX[i].col == 1) {
            col1++;
            if(col1 > 2) {
                return true;
            }
        } else if(markedX[i].col == 2) {
            col2++;
            if(col2 > 2) {
                return true;
            }
        }  
    }
    return false;
}
 
var checkVictoryO = function() {
    var row0 = 0;
    var row1 = 0;
    var row2 = 0;
    var col0 = 0;
    var col1 = 0;
    var col2 = 0;
    var diagTL = 0;
    var diagTR = 0;
    for(var i = 0; i < markedO.length; i++) {
        if(markedO[i].row == 0) {
            row0++;
            if(markedO[i].col == 0) {
                diagTL++;
            }
            if(markedO[i].col == 2) {
                diagTR++;
            }
            if(diagTL > 2) {
                return true;
            }
            if(diagTR > 2) {
                return true;
            }
            if(row0 > 2) {
                return true;
            }
        } else if(markedO[i].row == 1) {
            row1++;
            if(markedO[i].col == 1) {
                diagTL++;
                diagTR++;
            }
            if(diagTL > 2) {
                return true;
            }
            if(diagTR > 2) {
                return true;
            }
            if(row1 > 2) {
                return true;
            }
        } else if(markedO[i].row == 2) {
            row2++;
            if(markedO[i].col == 2) {
                diagTL++;
            }
            if(markedO[i].col == 0) {
                diagTR++;
            }
            if(diagTL > 2) {
                return true;
            }
            if(diagTR > 2) {
                return true;
            }
            if(row2 > 2) {
                return true;
            }
        } 
        if(markedO[i].col == 0) {
            col0++;
            if(col0 > 2) {
                return true;
            }
        } else if(markedO[i].col == 1) {
            col1++;
            if(col1 > 2) {
                return true;
            }
        } else if(markedO[i].col == 2) {
            col2++;
            if(col2 > 2) {
                return true;
            }
        } 
    }
    return false;
}