-
Notifications
You must be signed in to change notification settings - Fork 3
/
JSON 2048.json
29 lines (29 loc) · 6.27 KB
/
JSON 2048.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"@lang": [
"en",
"en"
],
"head": {
"meta": [
{
"@charset": "UTF-8"
},
{
"@name": "viewport",
"@content": "width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
},
{
"@http-equiv": "X-UA-Compatible",
"@content": "ie=edge"
}
],
"title": "2048",
"style": "#field {\n border: 1px solid black;\n }\n .cell {\n border: 1px solid black;\n text-align: center;\n width: 80px;\n height: 80px;\n }"
},
"body": {
"table": {
"@id": "field"
},
"script": "var size = 4;\n var htmlElements;\n var cell;\n\n function createField() {\n if(htmlElements) {\n return;\n }\n htmlElements = [];\n var table = document.getElementById('field');\n for (var y = 0; y < size; y++) {\n var tr = document.createElement('tr');\n var trElements = [];\n for (var x = 0; x < size; x++) {\n var td = document.createElement('td');\n td.setAttribute('class', 'cell');\n tr.appendChild(td);\n trElements.push(td);\n }\n htmlElements.push(trElements);\n table.appendChild(tr);\n }\n }\n\n function createCells() {\n cells = [];\n for(var y = 0; y < size; y++) {\n cells.push(new Array(size).fill(0));\n }\n }\n\n function generateInEmptyCell() {\n var x, y;\n do {\n x = Math.floor(Math.random() * size);\n y = Math.floor(Math.random() * size);\n if(cells[y][x] === 0) {\n cells[y][x] = Math.random() >= 0.9 ? 4 : 2;\n break;\n }\n } while(true);\n }\n\n function draw() {\n for(var y = 0; y < size; y++) {\n for (var x = 0; x < size; x++) {\n var td = htmlElements[y][x];\n var v = cells[y][x];\n td.innerHTML = v === 0 ? '' : String(v);\n if (v === 0) {\n td.setAttribute('style', 'background-color: white');\n } else {\n var h = 20 + 24 * Math.log2(2048 / v);\n td.setAttribute('style', 'background-color: hsl(' + h + ', 100%, 50%)');\n }\n }\n }\n }\n\n function slide(array, size) {\n function filterEmpty(a) {\n return a.filter(x => x !== 0);\n }\n\n array = filterEmpty(array);\n if(array.length > 0) {\n for(var i = 0; i < array.length - 1; i++) {\n if(array[i] === array[i + 1]) {\n array[i] *= 2;\n array[i + 1] = 0;\n }\n }\n }\n array = filterEmpty(array);\n while (array.length < size) {\n array.push(0);\n }\n return array;\n }\n\n function slideLeft() {\n var changed = false;\n for(var y = 0; y < size; y++) {\n var old = Array.from(cells[y]);\n cells[y] = slide(cells[y], size);\n changed = changed || (cells[y].join(',') !== old.join(','));\n }\n return changed;\n }\n\n function swap(x1, y1, x2, y2) {\n var tmp = cells[y1][x1];\n cells[y1][x1] = cells[y2][x2];\n cells[y2][x2] = tmp;\n }\n\n function mirror() {\n for (var y = 0; y < size; y++) {\n for (var xLeft = 0, xRight = size - 1; xLeft < xRight; xLeft++, xRight--) {\n swap(xLeft, y, xRight, y);\n }\n }\n }\n\n function transpose() {\n for(var y = 0; y < size; y++){\n for (var x = 0; x < y; x++) {\n swap(x, y, y, x);\n }\n }\n }\n\n function moveLeft() {\n return slideLeft();\n }\n\n function moveRight() {\n mirror();\n var changed = moveLeft();\n mirror();\n return changed;\n }\n\n function moveUp() {\n transpose();\n var changed = moveLeft();\n transpose();\n return changed;\n }\n\n function moveDown() {\n transpose();\n var changed = moveRight();\n transpose();\n return changed;\n }\n\n function isGameOver() {\n for (var y = 0; y < size; y++) {\n for (var x = 0; x < size; x++) {\n if (cells[y][x] === 0) {\n return false;\n }\n }\n }\n for (var y = 0; y < size - 1; y++) {\n for (var x = 0; x < size - 1; x++) {\n var c = cells[y][x]\n if (c !== 0 && (c === cells[y + 1][x] || c === cells[y][x + 1])) {\n return false;\n }\n }\n }\n return true;\n }\n\n document.addEventListener('keydown', function (e) {\n var code = e.keyCode;\n var ok;\n switch (code) {\n case 40: ok = moveDown(); break;\n case 38: ok = moveUp(); break;\n case 37: ok = moveLeft(); break;\n case 39: ok = moveRight(); break;\n default: return;\n }\n if(ok) {\n generateInEmptyCell();\n draw();\n }\n if(isGameOver()) {\n setTimeout(function () {\n alert('Game Over');\n init();\n }, 1000);\n }\n });\n\n function init() {\n createField();\n createCells();\n new Array(3).fill(0).forEach(generateInEmptyCell);\n draw();\n }\n\n init();"
}
}