Редактирование: 2048 (java script)

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 +
2048 (JavaScript)
 +
 
==Описание==
 
==Описание==
  
Реализация игры 2048 на языке программирования JavaScript
+
Реализация копьютерной игры тетрис на языке программирования JavaScript
  
Исполнители: Доленко М.А. ; Овчинников А.А.
+
Исполнитель: [[Доленко Михаил|Доленко Михаил]]
  
 
Группа 3630103/90001 Кафедра Теоретической механики
 
Группа 3630103/90001 Кафедра Теоретической механики
  
 
{{#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}}
 
==Код программы==
 
<div class="mw-collapsible mw-collapsed">
 
'''Код программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
<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>
 
 
 
<div id= "gridBackground" style="top:0;left:0;position:absolute;height:500;width:500;background-color
 
:#cccccc"></div>
 
 
</html>
 
 
</syntaxhighlight>
 
</div>
 
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)
Источник — «http://tm.spbstu.ru/2048_(java_script)»