|
|
|
// array reverse |
|
function reversal(arr) { |
|
var result = []; |
|
var i = null; |
|
for (i = arr.length-1; i >= 0; i -= 1) |
|
{ |
|
result.push(arr[i]); |
|
} |
|
return result; |
|
} |
|
|
|
|
|
// get html elements |
|
const board = document.getElementById('board') |
|
const boardSize = document.getElementById('board_size') |
|
const gameNew = document.getElementById('game_new') |
|
const gameMode = document.getElementById('game_mode') |
|
const gamePass = document.getElementById('game_pass') |
|
const gameResign = document.getElementById('game_resign') |
|
const gameMoves = document.getElementById('game_moves') |
|
const gameTurns = document.getElementById('game_turns') |
|
const gameLog = document.getElementById('game_log') |
|
const gameNext = document.getElementById('game_next') |
|
const play = document.getElementById('play') |
|
|
|
|
|
// game mode checker |
|
function modeCheck(e) { |
|
let md = gameMode.options[gameMode.selectedIndex].value |
|
|
|
if (md==='Edit') { |
|
play.classList.add('hidden') |
|
|
|
} |
|
else if (md==='Play') { |
|
play.classList.remove('hidden') |
|
} |
|
//console.log(md) |
|
} |
|
|
|
// listen for game mode change |
|
gameMode.addEventListener('change', modeCheck, false); |
|
|
|
|
|
// game globals |
|
var gameOn = true; |
|
var turn = 1; |
|
var turnLog = []; |
|
|
|
|
|
function turnAdvance() { |
|
|
|
if (gameOn === true) { |
|
turn += 1; |
|
gameTurns.textContent = turn; |
|
|
|
if (turn%2 === 0) { |
|
gameNext.textContent = 'White to Play'; |
|
} |
|
else if (turn%2 === 1) { |
|
gameNext.textContent = 'Black to Play'; |
|
} |
|
} |
|
else { |
|
gameNext.textContent = 'Game Over'; |
|
} |
|
|
|
let turnLogOut = reversal(turnLog); |
|
gameLog.textContent = turnLogOut.join('\n'); |
|
//console.log(turnLog) |
|
} |
|
|
|
function newGame(e) { |
|
makeBoard(e); |
|
gameOn = true; |
|
turn = 0; |
|
turnLog = []; |
|
gameTurns.textContent = turn; |
|
|
|
if (gameMoves.classList.contains('hidden')) { |
|
gameMoves.classList.remove('hidden') |
|
} |
|
turnAdvance() |
|
} |
|
|
|
function playPass(e) { |
|
if (gameOn === true) { |
|
|
|
if (turn%2 === 1) { |
|
turnLog.push(turn+' B Pass') |
|
turnAdvance() |
|
} |
|
else if (turn%2 === 0) { |
|
turnLog.push(turn+' W Pass') |
|
turnAdvance() |
|
} |
|
|
|
// check game log for pass on last turn |
|
let lastTurn = turnLog[turn-2].split(' ')[2]; |
|
|
|
// end game if both players pass |
|
if (turn>4 && lastTurn === 'Pass') { |
|
gameOn = false; |
|
gameNext.textContent = 'Game Over'; |
|
gameMoves.classList.add('hidden') |
|
turnLog.push('Pass End') |
|
turnAdvance() |
|
} |
|
//console.log(turn) |
|
} |
|
} |
|
|
|
// listen for board new board |
|
gameNew.addEventListener('click', newGame, false); |
|
boardSize.addEventListener('change', newGame, false); |
|
|
|
|
|
// listen for pass |
|
gamePass.addEventListener('click', playPass, false); |
|
|
|
|
|
/* |
|
//board.addEventListener('click', mover, false); |
|
|
|
function mover(e) { |
|
//e.buttons > 0 && |
|
if (e.path[0].classList.contains('space')) { |
|
flipSpace3(e.path[0]); |
|
console.log(e.path[0]) |
|
//e.path[0].className = 'space X' |
|
|
|
} |
|
} |
|
|
|
*/ |
|
|
|
|
|
// space maker |
|
// drops in default space element |
|
|
|
function makeSpace(i) { |
|
let dx = document.createElement('div'); |
|
dx.id = i; |
|
dx.classList.add('space','empty') |
|
dx.textContent = '+'; |
|
//dx.textContent = '\u254B'; // + |
|
|
|
return dx; |
|
} |
|
|
|
|
|
// flip space |
|
// cycles through possible states for spaces |
|
|
|
// deprecated ascii-only variant |
|
function flipSpaceEmoji(e) { |
|
if (e.target.textContent === '\u254B') // + |
|
e.target.textContent = '\u26AB'; // X |
|
else if (e.target.textContent === '\u26AB') // X |
|
e.target.textContent = '\u26AA'; // O |
|
else if (e.target.textContent === '\u26AA') // O |
|
e.target.textContent = '\u254B'; // + |
|
|
|
return e.target; |
|
} |
|
|
|
// stylesheet class switching variant |
|
function flipSpaceSprite(e) { |
|
if (e.target.classList.contains('empty')) { |
|
e.target.classList.replace('empty', 'black') |
|
e.target.textContent = 'X'; |
|
} |
|
else if (e.target.classList.contains('black')) { |
|
e.target.classList.replace('black', 'white') |
|
e.target.textContent = 'O'; |
|
} |
|
else if (e.target.classList.contains('white')) { |
|
e.target.classList.replace('white', 'empty') |
|
e.target.textContent = '+'; |
|
} |
|
//console.log(e.target) |
|
return e.target; |
|
} |
|
|
|
|
|
// |
|
function spaceToCoord(i) { |
|
let bs = boardSize.options[boardSize.selectedIndex].value, |
|
blah = Math.floor(i/bs)+1, |
|
boo = Math.floor(i%bs)+1; |
|
|
|
return boo + ',' + blah; |
|
} |
|
|
|
|
|
// play stones |
|
|
|
function playStone(e) { |
|
|
|
if (e.target.classList.contains('empty') === true) { |
|
// can move in empty spaces |
|
if (turn%2===1) { |
|
e.target.textContent = 'X'; |
|
e.target.classList.replace('empty', 'black') |
|
turnLog.push(turn + ' B ' + spaceToCoord(e.target.id)) |
|
} |
|
else if (turn%2===0) { |
|
e.target.textContent = 'O'; |
|
e.target.classList.replace('empty', 'white') |
|
turnLog.push(turn + ' W ' + spaceToCoord(e.target.id)) |
|
} |
|
turnAdvance(); |
|
} |
|
else if (e.target.classList.contains('empty') === false) { |
|
// can't move in occupied spaces |
|
} |
|
|
|
//return e.target; |
|
} |
|
|
|
|
|
function spaceCheck (e) { |
|
let md = gameMode.options[gameMode.selectedIndex].value |
|
|
|
if (md==='Edit') { |
|
flipSpaceSprite(e) |
|
} |
|
else if (md==='Play' && gameOn === true) { |
|
playStone(e) |
|
} |
|
//console.log(md) |
|
} |
|
|
|
// board maker |
|
// builds board and attaches event listeners to spaces |
|
|
|
function makeBoard() { |
|
// board size selector |
|
let bs = boardSize.options[boardSize.selectedIndex].value, |
|
// board length |
|
bl = bs*bs; |
|
|
|
// reset board |
|
board.innerHTML = ''; |
|
board.className = 's'+bs; |
|
|
|
// build board |
|
for(let i = 0; i < bl; i++) { |
|
let nsp = makeSpace(i); |
|
board.appendChild(nsp); |
|
let ex = document.getElementsByClassName('space')[i]; |
|
ex.addEventListener('click', spaceCheck, false); |
|
if (i%bs === bs-1) { |
|
board.appendChild(document.createElement('br')); |
|
} |
|
} |
|
|
|
return bl; |
|
} |
|
|
|
makeBoard(); |
|
|
|
|
|
|
|
|
|
|