Напишем полноценный Сокобан на JavaScript.
Особенности программы.
Карта уровня задается в массиве levelData в начале сценария.
Используемые символы:
'w' - стенка
'b' - ящик
's' или пробел - свободное место
'y' - игрок
Файл index.html
<body>
<div id="field"></div>
</body>
Файл index.css
.s { background: white; }
.w { background: black; }
.b { background: blue; }
.p { background: lightgray; }
.a { background: red; }
.y, .Y { background: green; }
#field div { width: 20px; height: 20px; float: left; }
#field {width: 160px; height: 160px; border: thin solid black;}
Файл index.js
(function() {
var levelData = [" wwwww ","www w ","w b w ww","w w p w","w w w","wwbwp w"," wy www"," wwwww "], level = [[], [] ,[] ,[] ,[] ,[] ,[] ,[]];
var x, y, dx, dy, cell, fwdCell, fwd2cell, field = document.getElementById('field');
for (var n = 0; n < levelData.length; n++)
for (var m = 0; m < levelData[n].length; m++) {
level[n].push(div = document.createElement('div'));
div.className = levelData[n][m] == ' ' ? 's' : levelData[n][m];
field.appendChild(div);
if (levelData[n][m] == 'y') x = m, y = n;
}
window.addEventListener('keydown', function(e) {
if (e.keyCode == 37) dx = -1, dy = 0;
else if (e.keyCode == 39) dx = 1, dy = 0;
else if (e.keyCode == 38) dx = 0, dy = -1;
else if (e.keyCode == 40) dx = 0, dy = 1;
else return;
if ((fwdCell = level[y + dy][x + dx]).className == 'w') return;
var cell = level[y][x];
if (fwdCell.className == 'b' || fwdCell.className == 'a') {
var fwd2cell = level[y + dy + dy][x + dx + dx];
if (fwd2cell.className == 'w' || fwd2cell.className == 'b' || fwd2cell.className == 'a')
return;
fwd2cell.className = fwd2cell.className == 'p' ? 'a' : 'b';
fwdCell.className = fwdCell.className == 'a' ? 'p' : 's';
}
if (fwdCell.className == 'w') return;
cell.className = cell.className == 'Y' ? 'p' : 's';
fwdCell.className = fwdCell.className == 'p' ? 'Y' : 'y';
x += dx; y += dy;
for (var n = 0; n < level.length; n++)
for (var m = 0; m < level[n].length; m++)
if (level[n][m].className == 'b') return;
alert('You win!');
});
})();
Комментариев нет:
Отправить комментарий