2048 (java script) — различия между версиями
Dolenkoma (обсуждение | вклад) (→Описание) |
Dolenkoma (обсуждение | вклад) (→Описание) |
||
Строка 10: | Строка 10: | ||
{{#widget:Iframe | url=http://tm.spbstu.ru/htmlets/js2020/Dolenko/2048.html | width=800 | height=800 | border=0}} | {{#widget:Iframe | url=http://tm.spbstu.ru/htmlets/js2020/Dolenko/2048.html | width=800 | height=800 | border=0}} | ||
+ | |||
+ | ==Код программы== | ||
+ | <html> | ||
+ | <script> | ||
+ | var gridModel = []; | ||
+ | var numRows = 4; | ||
+ | var numCols = 4; | ||
+ | var backgroundElement; | ||
+ | var gap = 20; | ||
+ | |||
+ | var colors = [ | ||
+ | "orange", | ||
+ | "red", | ||
+ | "magenta", | ||
+ | "green", | ||
+ | "blue", | ||
+ | "cyan", | ||
+ | "purple", | ||
+ | "midnightblue", | ||
+ | "lime", | ||
+ | "pink", | ||
+ | "black" | ||
+ | ]; | ||
+ | |||
+ | window.onkeydown = function(e){ | ||
+ | if (e.keyCode == 38) | ||
+ | { | ||
+ | if (collapseUp()) addTile(); | ||
+ | } | ||
+ | else if (e.keyCode == 37) | ||
+ | { | ||
+ | if (collapseLeft()) addTile(); | ||
+ | } | ||
+ | else if (e.keyCode == 39) | ||
+ | { | ||
+ | if (collapseRight()) addTile(); | ||
+ | } | ||
+ | else if (e.keyCode == 40) | ||
+ | { | ||
+ | if (collapseDown()) addTile(); | ||
+ | } | ||
+ | |||
+ | setTimeout(function(){ | ||
+ | drawGridFromModel(); | ||
+ | },150); | ||
+ | } | ||
+ | |||
+ | window.onload = function() | ||
+ | { | ||
+ | backgroundElement = document.getElementById("gridBackground"); | ||
+ | |||
+ | initializeGridModel(); | ||
+ | drawGridFromModel(); | ||
+ | } | ||
+ | |||
+ | function initializeGridModel() | ||
+ | { | ||
+ | var counter = 0; | ||
+ | |||
+ | for (var i = 0; i < numRows; i++) | ||
+ | { | ||
+ | var aRow = []; | ||
+ | for (var j = 0; j < numCols; j++) | ||
+ | { | ||
+ | var value = ""; | ||
+ | if (Math.random() < .3 & counter < 2) | ||
+ | { | ||
+ | value = 2; | ||
+ | counter++; | ||
+ | } | ||
+ | aRow.push(value); | ||
+ | } | ||
+ | gridModel.push(aRow); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | function addTile() | ||
+ | { | ||
+ | var randRow = Math.floor(Math.random()*numRows); | ||
+ | var randCol = Math.floor(Math.random()*numCols); | ||
+ | while (gridModel[randRow][randCol] != "") | ||
+ | { | ||
+ | randRow = Math.floor(Math.random()*numRows); | ||
+ | randCol = Math.floor(Math.random()*numCols); | ||
+ | } | ||
+ | gridModel[randRow][randCol] = (Math.random() > .1) ? 2 :4; | ||
+ | |||
+ | checkGameOver(); | ||
+ | } | ||
+ | |||
+ | function checkGameOver() | ||
+ | { | ||
+ | for (var i = 0; i < numRows; i++) | ||
+ | { | ||
+ | for (var j = 0; j < numCols; j++) | ||
+ | { | ||
+ | if (gridModel[i][j] == 2048) | ||
+ | { | ||
+ | alert("Win!"); | ||
+ | } | ||
+ | |||
+ | if (gridModel[i][j] == "" || canCollapseWithNeighbor(i,j)) | ||
+ | { | ||
+ | return false; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | alert("Game Over"); | ||
+ | gameOver = true; | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | function canCollapseWithNeighbor(row,column) | ||
+ | { | ||
+ | if(row > 0 && gridModel[row][column] == gridModel[row-1][column]) | ||
+ | { | ||
+ | return true; | ||
+ | } | ||
+ | if(row < numRows-1 && gridModel[row][column] == gridModel[row+1][column]) | ||
+ | { | ||
+ | return true; | ||
+ | } | ||
+ | if(column > 0 && gridModel[row][column] == gridModel[row][column-1]) | ||
+ | { | ||
+ | return true; | ||
+ | } | ||
+ | if(column < numCols-1 && gridModel[row][column] == gridModel[row][column+1]) | ||
+ | { | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | return false; | ||
+ | |||
+ | } | ||
+ | |||
+ | function drawGridFromModel() | ||
+ | { | ||
+ | backgroundElement.innerHTML = ""; | ||
+ | |||
+ | for (var i = 0; i < numRows; i++) | ||
+ | { | ||
+ | |||
+ | for (var j = 0; j < numCols; j++) | ||
+ | { | ||
+ | |||
+ | var tile = document.createElement("div"); | ||
+ | tile.style.position = "absolute"; | ||
+ | tile.style.top = i * (120) + gap; | ||
+ | tile.style.left = j * (120) + gap; | ||
+ | tile.style.width = 100; | ||
+ | tile.style.height = 100; | ||
+ | tile.style.fontSize = 48; | ||
+ | tile.style.textAlign = "center"; | ||
+ | tile.style.transition = "all .15s"; | ||
+ | tile.setAttribute("id",i + " " + j); | ||
+ | |||
+ | var cellValue = gridModel[i][j]; | ||
+ | tile.innerHTML = cellValue; | ||
+ | if (cellValue == "") | ||
+ | { | ||
+ | tile.style.backgroundColor = "#eeeeee"; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | var numDivisions = 1; | ||
+ | var curr = cellValue; | ||
+ | while (curr > 1) | ||
+ | { | ||
+ | curr /= 2; | ||
+ | numDivisions++; | ||
+ | } | ||
+ | tile.style.backgroundColor = colors[numDivisions-2]; | ||
+ | tile.style.color = "white"; | ||
+ | } | ||
+ | backgroundElement.appendChild(tile); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | function animateDivFromPointToPoint(div,leftPoint,finalLeft,currTop,finalTop) | ||
+ | { | ||
+ | drawEmptyTile(leftPoint,currTop); | ||
+ | div.style.zIndex = 2; | ||
+ | setTimeout(function(){ | ||
+ | div.style.left = finalLeft + "px"; | ||
+ | div.style.top = finalTop + "px"; | ||
+ | },10); | ||
+ | } | ||
+ | |||
+ | function drawEmptyTile(leftPoint,topPoint) | ||
+ | { | ||
+ | var tile = document.createElement("div"); | ||
+ | tile.style.position = "absolute"; | ||
+ | tile.style.top = topPoint; | ||
+ | tile.style.left = leftPoint; | ||
+ | tile.style.width = 100; | ||
+ | tile.style.height = 100; | ||
+ | tile.style.backgroundColor = "#eeeeee"; | ||
+ | backgroundElement.appendChild(tile); | ||
+ | } | ||
+ | |||
+ | function collapseUp() | ||
+ | { | ||
+ | var tilesHaveMoved = false; | ||
+ | |||
+ | for (var column = 0; column < numCols; column++) | ||
+ | { | ||
+ | for (var row = 0; row < numRows; row++) | ||
+ | { | ||
+ | var currentValue = gridModel[row][column]; | ||
+ | if (currentValue != "") | ||
+ | { | ||
+ | var currTop = row * (120) + gap; | ||
+ | var finalTop; | ||
+ | |||
+ | var cellIterator = row; | ||
+ | var nextValue = ""; | ||
+ | while(cellIterator > 0 && nextValue == "") | ||
+ | { | ||
+ | cellIterator--; | ||
+ | nextValue = gridModel[cellIterator][column] | ||
+ | } | ||
+ | if (nextValue == currentValue && nextValue != "") | ||
+ | { | ||
+ | gridModel[row][column] = ""; | ||
+ | gridModel[cellIterator][column] = currentValue * 2; | ||
+ | finalTop = cellIterator * 120 + gap; | ||
+ | } | ||
+ | else if (nextValue == "") | ||
+ | { | ||
+ | gridModel[row][column] = ""; | ||
+ | gridModel[0][column] = currentValue; | ||
+ | finalTop = 0 * 120 + gap; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | gridModel[row][column] = ""; | ||
+ | gridModel[cellIterator+1][column] = currentValue; | ||
+ | finalTop = (cellIterator+1) * 120 + gap; | ||
+ | } | ||
+ | |||
+ | var leftPoint = column * (120) + gap; | ||
+ | divToMove = document.getElementById(row + " " + column); | ||
+ | animateDivFromPointToPoint(divToMove,leftPoint,leftPoint,currTop,finalTop) | ||
+ | if (currTop != finalTop) tilesHaveMoved = true; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return tilesHaveMoved; | ||
+ | } | ||
+ | |||
+ | function collapseDown() | ||
+ | { | ||
+ | var tilesHaveMoved = false; | ||
+ | |||
+ | for (var column = 0; column < numCols; column++) | ||
+ | { | ||
+ | for (var row = numRows-1; row >= 0; row--) | ||
+ | { | ||
+ | var currentValue = gridModel[row][column]; | ||
+ | if (currentValue != "") | ||
+ | { | ||
+ | var currTop = row * (120) + gap; | ||
+ | var finalTop; | ||
+ | |||
+ | var cellIterator = row; | ||
+ | var nextValue = ""; | ||
+ | while(cellIterator < numRows-1 && nextValue == "") | ||
+ | { | ||
+ | cellIterator++; | ||
+ | nextValue = gridModel[cellIterator][column]; | ||
+ | } | ||
+ | if (nextValue == currentValue && nextValue != "") | ||
+ | { | ||
+ | gridModel[row][column] = ""; | ||
+ | gridModel[cellIterator][column] = currentValue * 2; | ||
+ | finalTop = cellIterator * 120 + gap; | ||
+ | } | ||
+ | else if (nextValue == "") | ||
+ | { | ||
+ | gridModel[row][column] = ""; | ||
+ | gridModel[numRows-1][column] = currentValue; | ||
+ | finalTop = (numRows-1)* 120 + gap; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | gridModel[row][column] = ""; | ||
+ | gridModel[cellIterator-1][column] = currentValue; | ||
+ | finalTop = (cellIterator-1) * 120 + gap; | ||
+ | } | ||
+ | |||
+ | var leftPoint = column * (120) + gap; | ||
+ | divToMove = document.getElementById(row + " " + column); | ||
+ | animateDivFromPointToPoint(divToMove,leftPoint,leftPoint,currTop,finalTop) | ||
+ | if (currTop != finalTop) tilesHaveMoved = true; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return tilesHaveMoved; | ||
+ | } | ||
+ | |||
+ | function collapseRight() | ||
+ | { | ||
+ | var tilesHaveMoved = false; | ||
+ | |||
+ | for (var row = 0; row < numRows; row++) | ||
+ | { | ||
+ | for (var col = numCols-1; col >= 0; col--) | ||
+ | { | ||
+ | var currentValue = gridModel[row][col]; | ||
+ | if (currentValue != "") | ||
+ | { | ||
+ | var currLeft = col * (120) + gap; | ||
+ | var finalLeft; | ||
+ | |||
+ | var cellIterator = col; | ||
+ | var nextValue = ""; | ||
+ | while(cellIterator < numCols-1 && nextValue == "") | ||
+ | { | ||
+ | cellIterator++; | ||
+ | nextValue = gridModel[row][cellIterator]; | ||
+ | } | ||
+ | if (nextValue == currentValue && nextValue != "") | ||
+ | { | ||
+ | gridModel[row][col] = ""; | ||
+ | gridModel[row][cellIterator] = currentValue * 2; | ||
+ | finalLeft = cellIterator * 120 + gap; | ||
+ | } | ||
+ | else if (nextValue == "") | ||
+ | { | ||
+ | gridModel[row][col] = ""; | ||
+ | gridModel[row][numCols-1] = currentValue; | ||
+ | finalLeft = (numCols-1)* 120 + gap; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | gridModel[row][col] = ""; | ||
+ | gridModel[row][cellIterator-1] = currentValue; | ||
+ | finalLeft = (cellIterator-1) * 120 + gap; | ||
+ | } | ||
+ | |||
+ | var topPoint = row * (120) + gap; | ||
+ | divToMove = document.getElementById(row + " " + col); | ||
+ | animateDivFromPointToPoint(divToMove,currLeft,finalLeft,topPoint,topPoint); | ||
+ | if (currLeft != finalLeft) tilesHaveMoved = true; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return tilesHaveMoved; | ||
+ | } | ||
+ | |||
+ | function collapseLeft() | ||
+ | { | ||
+ | var tilesHaveMoved = false; | ||
+ | |||
+ | for (var row = 0; row < numRows; row++) | ||
+ | { | ||
+ | for (var col = 0; col < numCols; col++) | ||
+ | { | ||
+ | var currentValue = gridModel[row][col]; | ||
+ | if (currentValue != "") | ||
+ | { | ||
+ | var currLeft = col * (120) + gap; | ||
+ | var finalLeft; | ||
+ | |||
+ | var cellIterator = col; | ||
+ | var nextValue = ""; | ||
+ | while(cellIterator > 0 && nextValue == "") | ||
+ | { | ||
+ | cellIterator--; | ||
+ | nextValue = gridModel[row][cellIterator]; | ||
+ | } | ||
+ | if (nextValue == currentValue && nextValue != "") | ||
+ | { | ||
+ | gridModel[row][col] = ""; | ||
+ | gridModel[row][cellIterator] = currentValue * 2; | ||
+ | finalLeft = cellIterator * 120 + gap; | ||
+ | } | ||
+ | else if (nextValue == "") | ||
+ | { | ||
+ | gridModel[row][col] = ""; | ||
+ | gridModel[row][0] = currentValue; | ||
+ | finalLeft = (0)* 120 + gap; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | gridModel[row][col] = ""; | ||
+ | gridModel[row][cellIterator+1] = currentValue; | ||
+ | finalLeft = (cellIterator+1) * 120 + gap; | ||
+ | } | ||
+ | |||
+ | var topPoint = row * (120) + gap; | ||
+ | divToMove = document.getElementById(row + " " + col); | ||
+ | animateDivFromPointToPoint(divToMove,currLeft,finalLeft,topPoint,topPoint); | ||
+ | if (currLeft != finalLeft) tilesHaveMoved = true; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return tilesHaveMoved; | ||
+ | } | ||
+ | |||
+ | |||
+ | </script> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </script> | ||
+ | <div id= "gridBackground" style="top:0;left:0;position:absolute;height:500;width:500;background-color | ||
+ | :#cccccc"></div> | ||
+ | |||
+ | </html> |
Версия 14:08, 1 июня 2020
2048 (JavaScript)
Описание
Реализация игры 2048 на языке программирования JavaScript
Исполнители: Доленко М.А. ; Овчинников А.А.
Группа 3630103/90001 Кафедра Теоретической механики
Код программы
<html> <script> var gridModel = []; var numRows = 4; var numCols = 4; var backgroundElement; var gap = 20;
var colors = [ "orange", "red", "magenta", "green", "blue", "cyan", "purple", "midnightblue", "lime", "pink", "black" ];
window.onkeydown = function(e){ if (e.keyCode == 38) { if (collapseUp()) addTile(); } else if (e.keyCode == 37) { if (collapseLeft()) addTile(); } else if (e.keyCode == 39) { if (collapseRight()) addTile(); } else if (e.keyCode == 40) { if (collapseDown()) addTile(); }
setTimeout(function(){ drawGridFromModel(); },150); }
window.onload = function() { backgroundElement = document.getElementById("gridBackground");
initializeGridModel(); drawGridFromModel(); }
function initializeGridModel() { var counter = 0;
for (var i = 0; i < numRows; i++) { var aRow = []; for (var j = 0; j < numCols; j++) { var value = ""; if (Math.random() < .3 & counter < 2) { value = 2; counter++; } aRow.push(value); } gridModel.push(aRow); } }
function addTile()
{
var randRow = Math.floor(Math.random()*numRows);
var randCol = Math.floor(Math.random()*numCols);
while (gridModel[randRow][randCol] != "")
{
randRow = Math.floor(Math.random()*numRows);
randCol = Math.floor(Math.random()*numCols);
}
gridModel[randRow][randCol] = (Math.random() > .1) ? 2 :4;
checkGameOver(); }
function checkGameOver() { for (var i = 0; i < numRows; i++) { for (var j = 0; j < numCols; j++) { if (gridModel[i][j] == 2048) { alert("Win!"); }
if (gridModel[i][j] == "" || canCollapseWithNeighbor(i,j)) { return false; } } } alert("Game Over"); gameOver = true; return true; }
function canCollapseWithNeighbor(row,column) { if(row > 0 && gridModel[row][column] == gridModel[row-1][column]) { return true; } if(row < numRows-1 && gridModel[row][column] == gridModel[row+1][column]) { return true; } if(column > 0 && gridModel[row][column] == gridModel[row][column-1]) { return true; } if(column < numCols-1 && gridModel[row][column] == gridModel[row][column+1]) { return true; }
return false;
}
function drawGridFromModel() { backgroundElement.innerHTML = "";
for (var i = 0; i < numRows; i++) {
for (var j = 0; j < numCols; j++) {
var tile = document.createElement("div"); tile.style.position = "absolute"; tile.style.top = i * (120) + gap; tile.style.left = j * (120) + gap; tile.style.width = 100; tile.style.height = 100; tile.style.fontSize = 48; tile.style.textAlign = "center"; tile.style.transition = "all .15s"; tile.setAttribute("id",i + " " + j);
var cellValue = gridModel[i][j]; tile.innerHTML = cellValue; if (cellValue == "") { tile.style.backgroundColor = "#eeeeee"; } else { var numDivisions = 1; var curr = cellValue; while (curr > 1) { curr /= 2; numDivisions++; } tile.style.backgroundColor = colors[numDivisions-2]; tile.style.color = "white"; } backgroundElement.appendChild(tile);
} }
}
function animateDivFromPointToPoint(div,leftPoint,finalLeft,currTop,finalTop) { drawEmptyTile(leftPoint,currTop); div.style.zIndex = 2; setTimeout(function(){ div.style.left = finalLeft + "px"; div.style.top = finalTop + "px"; },10); }
function drawEmptyTile(leftPoint,topPoint) { var tile = document.createElement("div"); tile.style.position = "absolute"; tile.style.top = topPoint; tile.style.left = leftPoint; tile.style.width = 100; tile.style.height = 100; tile.style.backgroundColor = "#eeeeee"; backgroundElement.appendChild(tile); }
function collapseUp() { var tilesHaveMoved = false;
for (var column = 0; column < numCols; column++) { for (var row = 0; row < numRows; row++) { var currentValue = gridModel[row][column]; if (currentValue != "") { var currTop = row * (120) + gap; var finalTop;
var cellIterator = row; var nextValue = ""; while(cellIterator > 0 && nextValue == "") { cellIterator--; nextValue = gridModel[cellIterator][column] } if (nextValue == currentValue && nextValue != "") { gridModel[row][column] = ""; gridModel[cellIterator][column] = currentValue * 2; finalTop = cellIterator * 120 + gap; } else if (nextValue == "") { gridModel[row][column] = ""; gridModel[0][column] = currentValue; finalTop = 0 * 120 + gap; } else { gridModel[row][column] = ""; gridModel[cellIterator+1][column] = currentValue; finalTop = (cellIterator+1) * 120 + gap; }
var leftPoint = column * (120) + gap; divToMove = document.getElementById(row + " " + column); animateDivFromPointToPoint(divToMove,leftPoint,leftPoint,currTop,finalTop) if (currTop != finalTop) tilesHaveMoved = true; } } } return tilesHaveMoved; }
function collapseDown() { var tilesHaveMoved = false;
for (var column = 0; column < numCols; column++) { for (var row = numRows-1; row >= 0; row--) { var currentValue = gridModel[row][column]; if (currentValue != "") { var currTop = row * (120) + gap; var finalTop;
var cellIterator = row; var nextValue = ""; while(cellIterator < numRows-1 && nextValue == "") { cellIterator++; nextValue = gridModel[cellIterator][column]; } if (nextValue == currentValue && nextValue != "") { gridModel[row][column] = ""; gridModel[cellIterator][column] = currentValue * 2; finalTop = cellIterator * 120 + gap; } else if (nextValue == "") { gridModel[row][column] = ""; gridModel[numRows-1][column] = currentValue; finalTop = (numRows-1)* 120 + gap; } else { gridModel[row][column] = ""; gridModel[cellIterator-1][column] = currentValue; finalTop = (cellIterator-1) * 120 + gap; }
var leftPoint = column * (120) + gap; divToMove = document.getElementById(row + " " + column); animateDivFromPointToPoint(divToMove,leftPoint,leftPoint,currTop,finalTop) if (currTop != finalTop) tilesHaveMoved = true; } } } return tilesHaveMoved; }
function collapseRight() { var tilesHaveMoved = false;
for (var row = 0; row < numRows; row++) { for (var col = numCols-1; col >= 0; col--) { var currentValue = gridModel[row][col]; if (currentValue != "") { var currLeft = col * (120) + gap; var finalLeft;
var cellIterator = col; var nextValue = ""; while(cellIterator < numCols-1 && nextValue == "") { cellIterator++; nextValue = gridModel[row][cellIterator]; } if (nextValue == currentValue && nextValue != "") { gridModel[row][col] = ""; gridModel[row][cellIterator] = currentValue * 2; finalLeft = cellIterator * 120 + gap; } else if (nextValue == "") { gridModel[row][col] = ""; gridModel[row][numCols-1] = currentValue; finalLeft = (numCols-1)* 120 + gap; } else { gridModel[row][col] = ""; gridModel[row][cellIterator-1] = currentValue; finalLeft = (cellIterator-1) * 120 + gap; }
var topPoint = row * (120) + gap; divToMove = document.getElementById(row + " " + col); animateDivFromPointToPoint(divToMove,currLeft,finalLeft,topPoint,topPoint); if (currLeft != finalLeft) tilesHaveMoved = true; } } } return tilesHaveMoved; }
function collapseLeft() { var tilesHaveMoved = false;
for (var row = 0; row < numRows; row++) { for (var col = 0; col < numCols; col++) { var currentValue = gridModel[row][col]; if (currentValue != "") { var currLeft = col * (120) + gap; var finalLeft;
var cellIterator = col; var nextValue = ""; while(cellIterator > 0 && nextValue == "") { cellIterator--; nextValue = gridModel[row][cellIterator]; } if (nextValue == currentValue && nextValue != "") { gridModel[row][col] = ""; gridModel[row][cellIterator] = currentValue * 2; finalLeft = cellIterator * 120 + gap; } else if (nextValue == "") { gridModel[row][col] = ""; gridModel[row][0] = currentValue; finalLeft = (0)* 120 + gap; } else { gridModel[row][col] = ""; gridModel[row][cellIterator+1] = currentValue; finalLeft = (cellIterator+1) * 120 + gap; }
var topPoint = row * (120) + gap; divToMove = document.getElementById(row + " " + col); animateDivFromPointToPoint(divToMove,currLeft,finalLeft,topPoint,topPoint); if (currLeft != finalLeft) tilesHaveMoved = true; } } } return tilesHaveMoved; }
</script>
</script>
</html>