# HG changeset patch # User Oleksandr Gavenko # Date 1410369366 -10800 # Node ID 359719178176df39802a7b68256d4c2690d9ff40 # Parent 84e0c62adc087a5974cc502ed8fa0f61ca0fd2be Reorganise code. Warn about uninitialised AI. diff -r 84e0c62adc08 -r 359719178176 2048.html --- a/2048.html Wed Sep 10 19:46:51 2014 +0300 +++ b/2048.html Wed Sep 10 20:16:06 2014 +0300 @@ -314,6 +314,9 @@ } ui.board.enableEdit(); + //////////////////////////////////////////////////////////////// + // Score statistic. + ui.score = {}; var scoreDom = document.getElementById("score"); var maxDom = document.getElementById("max"); @@ -336,6 +339,19 @@ } //////////////////////////////////////////////////////////////// + // Suggestion UI. + + ui.suggestion = {}; + ui.suggestion.btns = document.querySelectorAll('div.move-control button'); + ui.suggestion.clear = function() { + for (var i = 0; i < ui.suggestion.btns.length; i++) + ui.suggestion.btns[i].classList.remove('suggestion'); + } + ui.suggestion.set = function(dir) { + document.getElementById(dir).classList.add('suggestion'); + } + + //////////////////////////////////////////////////////////////// // Game flow. ui.game = {}; @@ -371,6 +387,20 @@ return true; } + ui.game.beginStep = function() { + ui.suggestion.clear(); + ui.game.clearMessage(); + if (ui.game.checkGameOver()) + return false; + return true; + } + ui.game.finishStep = function() { + board.putRandom(board.current); + ui.board.update(board.current); + ui.score.update(board.current); + localStorage.savedBoard = board.current; + } + //////////////////////////////////////////////////////////////// // Actions. @@ -378,8 +408,8 @@ ui.action.start = function() { ui.score.clear(); + ui.suggestion.clear(); ui.game.clearMessage(); - ui.action.clearSuggestion(); board.current = board.create(); board.putRandom(board.current); ui.board.update(board.current); @@ -392,12 +422,10 @@ return function() { if (ui.game.checkGameOver()) return; - ui.action.clearSuggestion(); + ui.suggestion.clear(); var updated = board.move[dir](board.current); if (updated) { - board.putRandom(board.current); - ui.board.update(board.current); - ui.score.update(board.current); + ui.game.finishStep(); ui.ai.current && ui.ai.current.cleanup(); } } @@ -423,15 +451,12 @@ board.move.replaceByBoardJS(ui.brdEngine); }); - ui.action.clearSuggestion = function() { - var btns = document.querySelectorAll('div.move-control button'); - for (var i = 0; i < btns.length; i++) - btns[i].classList.remove('suggestion'); - } ui.action.suggest = function() { - ui.action.clearSuggestion(); - ui.game.clearMessage(); - if (ui.game.checkGameOver()) + if ( ! ui.ai.current) { + ui.game.setMessage('Select AI!'); + return; + } + if ( ! ui.game.beginStep()) return; var tmpBrd = board.create(); board.copy(board.current, tmpBrd); @@ -439,13 +464,15 @@ ui.ai.current.cleanup(); if ( ! ui.game.checkMoveValid(move)) return; - document.getElementById(move).classList.add('suggestion'); + ui.suggestion.set(move); } document.getElementById("suggest").addEventListener("click", ui.action.suggest); ui.action.step = function() { - ui.game.clearMessage(); - ui.action.clearSuggestion(); - if (ui.game.checkGameOver()) + if ( ! ui.ai.current) { + ui.game.setMessage('Select AI!'); + return; + } + if ( ! ui.game.beginStep()) return; var tmpBrd = board.create(); board.copy(board.current, tmpBrd); @@ -454,15 +481,16 @@ if ( ! ui.game.checkMoveValid(move)) return; board.move[move].call(null, board.current); - board.putRandom(board.current); - ui.board.update(board.current); - ui.score.update(board.current); + ui.game.finishStep(); } document.getElementById("step").addEventListener("click", ui.action.step); ui.action.finish = function() { - ui.game.clearMessage(); - ui.action.clearSuggestion(); + if ( ! ui.ai.current) { + ui.game.setMessage('Select AI!'); + return; + } + ui.game.beginStep(); var step = 0; var tsFrom = new Date().getTime(); while (!board.gameOver(board.current)) { @@ -477,16 +505,14 @@ if (updated) { board.putRandom(board.current); } else { - ui.board.update(board.current); - ui.score.update(board.current); + ui.game.finishStep(); ui.game.setMessage("Wrong move!"); return; } step++; } var tsTo = new Date().getTime(); - ui.board.update(board.current); - ui.score.update(board.current); + ui.game.finishStep(); ui.score.speed(step*1000.0/(tsTo-tsFrom), step); ui.game.setMessage("Game over!"); ui.ai.current && ui.ai.current.cleanup(); @@ -560,7 +586,12 @@ ui.brdEngine = BoardArr2d; // TODO make user selectable - ui.action.start(); + if (localStorage.savedBoard) { + board.current = localStorage.savedBoard; + ui.board.update(board.current); + } else { + ui.action.start(); + }