Не работает счетчик мин вокруг

365
25 июля 2018, 02:00
function setCellState() {
    this.isMine = false;
    this.isOpen = false;
    this.mineAround = 0;
}
var game = {
    askStandartField: confirm(
        "Стандартные настройки? 10 ячеек х 10 ячеек, 10 мин"
    ),
    width: 10,
    height: 10,
    mineCount: 9,
    standartField: function() {
        if (!game.askStandartField) {
            // Если пользователь не хочет стандартные настройки
            game.width = prompt("Длина поля");
            game.height = prompt("Высота поля");
            game.mineCount = prompt("Кол-во мин:");
        }
    },
    openCount: 0,
    field: [],
    fillField: function() {
        for (var x = 0; x < game.width; x++) {
            var row = []; //Создаем массив row и заталкиваем в field
            game.field.push(row);
            for (var y = 0; y < game.height; y++) {
                row.push(new setCellState());
            }
        }
        for (var i = 0; i < game.mineCount; i++) {
            // Генерируем мины
            var xx = Math.floor(Math.random() * game.width);
            var yy = Math.floor(Math.random() * game.height);
            if (!game.field[xx][yy].isMine) {
                game.field[xx][yy].isMine = true;
            } else {
                i--;
            }
        }
    },
    countMineAround: function(x, y) {
        if (
            //Если клетка не крайняя
            x !== 0 ||
            y !== 0 ||
            x !== game.width - 1 ||
            y !== game.height - 1
        ) {
            if (game.field[x - 1][y - 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x][y - 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y - 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[y][x - 1].isMine) game.field[x][y].mineAround++;
        } else if (x === 0 || y === 0) {
            //Если клетка занимает одну из крайних позиций
            if (game.field[x + 1][y].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x][y + 1].isMine) game.field[x][y].mineAround++;
        }
        if (y === 0) {
            if (game.field[x + 1][y].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y].isMine) game.field[x][y].mineAround++;
        }
        if (x == game.width || y === 0) {
            if (game.field[x][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y].isMine) game.field[x][y].mineAround++;
        }
        if (x == game.width) {
            if (game.field[x][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y + 1].isMine) game.field[x][y].mineAround++;
        }
        if (x == game.width || y == game.height) {
            if (game.field[x - 1][y - 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x][y - 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y].isMine) game.field[x][y].mineAround++;
        }
        if (y == game.height) {
            if (game.field[x][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x - 1][y].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y + 1].isMine) game.field[x][y].mineAround++;
        }
        if (x === 0 || y == game.height) {
            if (game.field[x][y - 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y - 1].isMine) game.field[x][y].mineAround++;
        }
        if (x === 0) {
            if (game.field[x][y - 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y + 1].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y].isMine) game.field[x][y].mineAround++;
            if (game.field[x + 1][y - 1].isMine) game.field[x][y].mineAround++;
        }
    },
    drawField: function() {
        $("body").append("<table id = 'play-table'>");
        for (var x = 0; x < game.width; x++) {
            $("table").append("<tr>");
            for (var y = 0; y < game.height; y++) {
                $("tr:last-child").append(`<td>`);
            }
        }
    }
};
game.standartField();
game.fillField();
game.drawField();
$("td").click(function() {
    var x = this.cellIndex;
    var y = this.parentNode.rowIndex; //сохраняем координаты ячейки
    game.openCount++;
    game.field[x][y].countMineAround(x, y);
    if (!(game.field[x][y].mineAround = 0)) {
        $(this).text(game.field[x][y].mineAround);
    }
    if (game.field[y][x].isMine) {
        $(this).addClass("isMine");
        $("#info").text("Вы проиграли");
        for (var x0 = 0; x0 < game.width; x0++) {
            for (var y0 = 0; y0 < game.height; y0++) {
                if (game.field[y0][x0].isMine) {
                    $(
                        "#play-table tr:nth-child(" +
                            x0 +
                            ") td:nth-child(" +
                            y0 +
                            ")"
                    ).addClass("isMine"); //Если поле минное взрываем все мины
                }
            }
        }
    } else {
        $(this).addClass("isOpen"); // Если нет то открываем
    }
});

Кол-во мин вокруг каждой записывается game.field[x][y].mineAround

Answer 1

Умоляю! Разберитесь с индексированием строк и столбцов.

function setCellState() { 
        this.isMine = false; 
        this.isOpen = false; 
        this.mineAround = 0; 
    } 
    var game = { 
        askStandartField: confirm( 
            "Стандартные настройки? 10 ячеек х 10 ячеек, 10 мин" 
        ), 
        width: 10, 
        height: 10, 
        mineCount: 10, 
        standartField: function() { 
            if (!game.askStandartField) { 
                // Если пользователь не хочет стандартные настройки 
                game.width = prompt("Длина поля"); 
                game.height = prompt("Высота поля"); 
                game.mineCount = prompt("Кол-во мин:"); 
            } 
        }, 
        openCount: 0, 
        field: [], 
        fillField: function() { 
            for (var x = 0; x < game.width; x++) { 
                var row = []; //Создаем массив row и заталкиваем в field 
                game.field.push(row); 
                for (var y = 0; y < game.height; y++) { 
                    row.push(new setCellState()); 
                } 
            } 
            for (var i = 0; i < game.mineCount; i++) { 
                // Генерируем мины 
                var xx = Math.floor(Math.random() * game.width); 
                var yy = Math.floor(Math.random() * game.height); 
                if (!game.field[xx][yy].isMine) { 
                    game.field[xx][yy].isMine = true; 
                } else { 
                    i--; 
                } 
            } 
        }, 
        countMineAround: function(x, y) { 
          var x0 = Math.max(0, x - 1); 
          var x1 = Math.min(game.width - 1, x + 1); 
          var y0 = Math.max(0, y - 1); 
          var y1 = Math.min(game.height - 1, y + 1); 
          game.field[x][y].mineAround = 0; 
          for (var i = x0; i <= x1; i++) { 
            for (var j = y0; j <= y1; j++) { 
              if (i == x && j == y) 
                continue; 
              if (game.field[i][j].isMine) 
                game.field[x][y].mineAround++;   
            } 
          } 
        }, 
        drawField: function() { 
            $("body").append("<table id = 'play-table' border=1>"); 
            for (var x = 0; x < game.width; x++) { 
                $("table").append("<tr>"); 
                for (var y = 0; y < game.height; y++) { 
                game.countMineAround(y, x); 
                    $("tr:last-child").append('<td ' + (game.field[y][x].isMine? "class='grayMine'" : "") + '>' + game.field[y][x].mineAround + '</td>'); 
                } 
            } 
        } 
    }; 
    game.standartField(); 
    game.fillField(); 
    game.drawField(); 
    $("td").click(function() { 
        var x = this.cellIndex; 
        var y = this.parentNode.rowIndex; //сохраняем координаты ячейки 
        game.openCount++; 
        game.countMineAround(x, y); 
        if (game.field[x][y].mineAround) { 
            $(this).text(game.field[x][y].mineAround); 
        } 
        if (game.field[y][x].isMine) { 
            $(this).addClass("isMine"); 
            $("#info").text("Вы проиграли"); 
            for (var x0 = 0; x0 < game.width; x0++) { 
                for (var y0 = 0; y0 < game.height; y0++) { 
                    if (game.field[y0][x0].isMine) { 
                        $( 
                            "#play-table tr:nth-child(" + 
                                x0 + 
                                ") td:nth-child(" + 
                                y0 + 
                                ")" 
                        ).addClass("isMine"); //Если поле минное взрываем все мины 
                    } 
                } 
            } 
        } else { 
            $(this).addClass("isOpen"); // Если нет то открываем 
        } 
    }); 
 
//console.log(game.field);
td { 
  width:15px; 
  height:15px; 
  text-align:center; 
  font-size:12px; 
} 
.grayMine { 
  background-color:gray; 
} 
.isMine { 
  background-color:red; 
} 
.isOpen { 
  background-color:lightgreen; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

READ ALSO
Не могу задать стили элементу который имеется в двух классов

Не могу задать стили элементу который имеется в двух классов

Я использую такой код для классовregister,

155
Не двигается input

Не двигается input

Почему с помощью свойства margin-top: -Xpx не получается передвинуть поле ввода в вверх?

162
Качество видео в теге &lt;video&gt;

Качество видео в теге <video>

При встраивании видео через тег <video> качество меньше чем у оригинала который лежит на сервере

180
Перемещение фона мышкой

Перемещение фона мышкой

Всем добрый день, надо реализовать перемещение мышкой фона блока (изображение) курсор - moveКаким способом можно сделать?

144