вторник, 19 ноября 2013 г.

Сокобан на JavaScript

Напишем полноценный Сокобан на 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!');
});
})();

Комментариев нет:

Отправить комментарий