Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2021, 19:37   #1
mariya22
Новичок
Джуниор
 
Регистрация: 17.05.2021
Сообщений: 3
По умолчанию Ошибка при максимальном размере

нужна помощь. пытаюсь написать игру "Жизнь", столкнулся с проблемой: игра падает из-за ошибки по памяти, если создать поле например 1000000 на 1000000. поэтому хочу создать максимально возможно задаваемый размер и показывать предупреждение, что такой размер нельзя создать. Как это сделать?
Код:
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="life.css" />
    <title>life</title>
    <style>
  #canvas {
  width: 300;
  height: 300;
  border: 2px solid black;
  margin: 40px;
}
  </style>
  </head>
  <body>
    <canvas id="canvas" width="300" height="300"></canvas><br>
 
    <label>Высота:</label>
    <input type="text" id="heightInput" value="300" />
    <label>Ширина:</label>
    <input type="text" id="widthInput" value="300" />
    <input type="button" value="Создать поле" id="create" />
    <p>Таймер: <span id="count">0</span></p>
    <button id="start">Start</button>
    <button id="pause">Pause</button>
    <button id="stop">Stop</button>

  </body>
</html>
Код:
const canvas = document.getElementById("canvas");
    const ctx = canvas.getContext("2d");
    const widthInput = document.getElementById("widthInput");
    const heightInput = document.getElementById("heightInput");
    const count = document.getElementById('count');
    let width, height, sizeFieldWidth, sizeFieldHeight;

    const sizeCellwidth = 10;
    const sizeCellheight = 10;

    let mas = [];
    let timer;

    canvas.onclick = function(event) {
        let x = event.offsetX;
        let y = event.offsetY;
        x = Math.floor(x / sizeCellwidth);
        y = Math.floor(y / sizeCellheight);
        mas[y][x] = 1;
        drawField();
    };

    function resizeCanvas() {
        canvas.width = widthInput.value;
        canvas.height = heightInput.value;
        width = canvas.width;
        height = canvas.height;
        sizeFieldWidth = width / sizeCellwidth;
        sizeFieldHeight = height / sizeCellheight;
        goLife();
    }

    function goLife() {
        for (let i = 0; i < sizeFieldHeight; i++) {
            mas[i] = [];
            for (let j = 0; j < sizeFieldWidth; j++) {
                mas[i][j] = 0;
            }
        }
    }
    resizeCanvas();

    function drawField() {

        ctx.clearRect(0, 0, width, height);
        for (let i = 0; i < sizeFieldHeight; i++) {
            for (let j = 0; j < sizeFieldWidth; j++) {

                if (mas[i][j] === 1) {
                    ctx.fillRect(j * sizeCellwidth, i * sizeCellheight, sizeCellwidth, sizeCellheight);
                }
            }
        }
    }

    function startLife() {
        let mas2 = [];
        for (let i = 0; i < sizeFieldHeight; i++) {
            mas2[i] = [];
            for (let j = 0; j < sizeFieldWidth; j++) {
                let neighbors = [-1, 1].reduce((a, b) => {
                    b = mas[i + b];
                    if (b === undefined)
                        return a;
                    let num = b[j];
                    if (b[j + 1] !== undefined) {
                        num += b[j + 1]
                    }
                    if (b[j - 1] !== undefined) {
                        num += b[j - 1]
                    }
                    return a + num;
                }, 0);
                neighbors = [-1, 1].reduce((a, b) => a += mas[i][j + b] !== undefined && mas[i][j + b], neighbors);
                mas2[i][j] = +(neighbors === 2 || neighbors === 3)



            }
        }
        mas = mas2;
        drawField();
        count.innerHTML++;
        timer = setTimeout(startLife, 300);
    }

    function pauseLife() {
        clearInterval(timer)
    }

    function stopLife() {
        pauseLife();
        goLife();
        drawField();
        count.innerHTML = 0;
    }

    document.getElementById("create").onclick = resizeCanvas;
    document.getElementById("start").onclick = startLife;
    document.getElementById("pause").onclick = pauseLife;
    document.getElementById("stop").onclick = stopLife;
mariya22 вне форума Ответить с цитированием
Старый 18.05.2021, 17:52   #2
mariya22
Новичок
Джуниор
 
Регистрация: 17.05.2021
Сообщений: 3
По умолчанию

уже не нужно
mariya22 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача о максимальном потоке ElenaChest Общие вопросы Delphi 4 15.12.2014 17:03
Где ошибка? При билдинге ошибок 0, но при запуске вылетает ошибка. Visual C nikitabool Помощь студентам 0 08.01.2014 17:19
Печать изображений в правильном размере. Человек_Борща Общие вопросы Delphi 2 03.08.2013 10:27
Загадка о размере файла .xls Jockernsk Microsoft Office Excel 10 23.10.2010 00:58
Алгоритм Форда-Фалкерсона (о максимальном потоке в графе) Chudo4258 Помощь студентам 1 30.06.2010 10:21