I tried to use the 'this' keyword in other methods in my class but the value is undefined.
class TicTacToe {
/**
*Tic Tac Toe
*/
constructor() {
this.gameState = [ '', '', '', '', '', '', '', '', '' ];
this.currentPlayer = 'X';
this.gameActive = true;
console.log('constructing now');
}
/**
*
* @param {function} clickedCellEvent
*/
handleCellClick(clickedCellEvent) {
// Will save the clcicked element in a variable for use
const clickedCell = clickedCellEvent.target;
//Identifies the cells location on the grid
const clickedCellIndex = parseInt(
clickedCell.getAttribute('data-cell-index')
);
// Checks to see if the cell is played already or if the game is over
// If so the click is ignored
if (this.gameState[clickedCellIndex] !== '' || ! this.gameActive) {
return;
}
// Once we get the cell index and run our check,
// We update the gamestate and pass the turn
this.handleGameStateUpdate(clickedCell, clickedCellIndex);
this.handleResult();
}
/**
* Updates the gamestate array and the html grid
* @param {function} clickedCell
* @param {function} clickedCellIndex
*/
handleGameStateUpdate(clickedCell, clickedCellIndex) {
// With this handler we will update the game state and the UI
this.gameState[clickedCellIndex] = this.currentPlayer;
clickedCell.innerHTML = this.currentPlayer;
}
/**
* Changes the player turn
*/
handelPlayerChange() {
this.currentPlayer = this.currentPlayer === 'X' ? 'O' : 'X';
}
/**
* Check to see if the game has ended after each turn
*/
handelResult() {
let roundWon = false;
const roundDraw = !this.gameState.includes('');
const winConditions = [
[ 0, 1, 2 ],
[ 3, 4, 5 ],
[ 6, 7, 8 ],
[ 0, 3, 6 ],
[ 1, 4, 7 ],
[ 2, 5, 8 ],
[ 0, 4, 8 ],
[ 2, 4, 6 ]
];
for (let i = 0; i <= 7; i++) {
const winCondition = winConditions[i];
const a = this.gameState[winCondition[0]];
const b = this.gameState[winCondition[1]];
const c = this.gameState[winCondition[2]];
if (a === '' || b === '' || c === '') {
continue;
}
if (a === b && b === c) {
roundWon = true;
break;
}
}
if (roundWon) {
this.gameActive = false;
return;
}
if (roundDraw) {
this.gameActive = false;
return;
}
this.handelPlayerChange();
}
/**
* Restarts the game
*/
handelRestartGame() {
this.gameActive = true;
this.currentPlayer = 'X';
this.gameState = [ '', '', '', '', '', '', '', '', '' ];
document.querySelectorAll('.cell')
.forEach(cell => {
cell.innerHTML = '';
});
}
}
const ttt = new TicTacToe();
/**
* event listener for cell clicks on the html grid
* @param {String} .cell
*/
document.querySelectorAll('.cell').forEach(cell => cell.addEventListener('click', ttt.handleCellClick));
/**
* event listener for game restart button
* @param {String} .game--restart
*/
document.querySelector('.game--restart').addEventListener('click', ttt.handelRestartGame);
.game--container {
display: grid;
grid-template-columns: repeat(3, auto);
width: 306px;
margin: 50px auto;
}
.cell {
font-family: "Permanent Marker", cursive;
width: 100px;
height: 100px;
box-shadow: 0 0 0 1px #333333;
border: 1px solid #333333;
cursor: pointer;
line-height: 100px;
font-size: 60px;
}
<h1 class="game--title"> Tic Tac Toe</h1>
<div class="game--container">
<div data-cell-index="0" class="cell"></div>
<div data-cell-index="1" class="cell"></div>
<div data-cell-index="2" class="cell"></div>
<div data-cell-index="3" class="cell"></div>
<div data-cell-index="4" class="cell"></div>
<div data-cell-index="5" class="cell"></div>
<div data-cell-index="6" class="cell"></div>
<div data-cell-index="7" class="cell"></div>
<div data-cell-index="8" class="cell"></div>
<button class="game--restart">Restart Game</button>
</div>
<script src="script.js"></script>
https://codepen.io/donovanandrews300/pen/dyoBKjV?editors=1010