Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.07.2017, 17:40
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

двухмерный массив(2)
привет, есть поле в канвасе, и 2 функции образующих это поле(?), не пойму как они связаны с самим полем. Я понимаю это так, первая функция canvas.onclick - в ней мы делим поле на 30 частей по горизонтали и вертикали, и туда куда мы нажимаем мышкой, ставится единица. Но совсем не понимаю, как функция goLife() связывается с этим полем, как она его делит и как она к нему относится
В html-run почему-то не рисуется квадрат.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
<style type="text/css">
 #c1 {
	width: 300px;
	height: 300px;
	border: 3px solid black;
	margin: 40px;
}
</style>
</head>
<body>

<canvas id="c1" width="300" height="300"></canvas>


<script>
var canvas = document.getElementById('c1');
var ctx = canvas.getContext('2d');
var mas =[];
canvas.onclick = function(event){
	var x = event.offsetX;
	var y = event.offsetY;
	console.log(x);
	console.log(y);
	x = Math.floor(x/10); //300 /10 = 30
	y = Math.floor(y/10); //300 /10 = 
	mas[y][x]=1;
	console.log(mas);
}
function goLife(){
	var n=30, m=30;
	for (var i=0; i<m; i++){
		mas[i]=[];
		for (var j=0; j<n; j++){
			mas[i][j]=0;
		}
	}
}
goLife();
</script
</body>
</html>

Последний раз редактировалось shoopik, 25.07.2017 в 18:18.
Ответить с цитированием
  #2 (permalink)  
Старый 25.07.2017, 18:09
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

shoopik,
Массив mas предварительно стоило бы объявить - смотрите ошибки в консоли.
Сообщение от shoopik
В html-run почему-то не рисуется квадрат.
Что-то в коде незаметно никакого рисования
Ответить с цитированием
  #3 (permalink)  
Старый 25.07.2017, 18:14
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от Dilettante_Pro Посмотреть сообщение
shoopik,
Массив mas предварительно стоило бы объявить - смотрите ошибки в консоли.

Что-то в коде незаметно никакого рисования
Исправил ) Я имел ввиду там квадрат канваса, рисования пока здесь нет, стили забыл

Последний раз редактировалось shoopik, 25.07.2017 в 18:19.
Ответить с цитированием
  #4 (permalink)  
Старый 25.07.2017, 22:00
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

подумал немного, получается, что при клике x и y координаты передаются в значения [i][j] и ставится значение 1, которое по умолчанию ноль, понимаю как делит квадрат этот х и у, но не понимаю каким образом его делит массив [i] и [j], т.е. каким вобще образом этот массив заносится в это поле
Ответить с цитированием
  #5 (permalink)  
Старый 25.07.2017, 23:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

canvas сохранение только отмеченных клеток
shoopik,
... для примера
отмеченный квадрат можно стереть повторным кликом.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
<style type="text/css">
 #c1 {
  width: 300px;
  height: 300px;
  border: 3px solid black;
  margin: 40px;
}
</style>
</head>
<body>

<canvas id="c1" width="300" height="300"></canvas>


<script>
var canvas = document.getElementById('c1');
var ctx = canvas.getContext('2d');
var mas = {};
canvas.onclick = function(event){
  var x = event.offsetX;
  var y = event.offsetY;
  console.log(x);
  console.log(y);
  x = Math.floor(x/10)*10;
  y = Math.floor(y/10)*10;
  (mas[y]= mas[y]||{}) && mas[y][x]==1 ?  (delete mas[y][x],!Object.keys(mas[y]).length && delete mas[y],ctx.clearRect(x,y,10,10)) : (mas[y][x]=1,ctx.fillRect(x,y,10,10));
  console.log(mas);
}


</script>
</body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 26.07.2017, 00:48
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от рони Посмотреть сообщение
(mas[y]= mas[y]||{}) && mas[y][x]==1 ?  (delete mas[y][x],!Object.keys(mas[y]).length && delete mas[y],ctx.clearRect(x,y,10,10)) : (mas[y][x]=1,ctx.fillRect(x,y,10,10));
Можно поподробней вот это место ? Сложновато для меня,
(mas[y]= mas[y]||{})
если значение [y] в массиве равен самому себе или хоть чему ?
и mas[y][x]==1 - значениям [y] и [x] - присвоена единица, тогда мы
delete mas[y][x] - удаляем это значение,
!Object.keys(mas[y]).length - длина массива Y, не понимаю что делает она и восклицательный знак перед ней)))
&& delete mas[y],ctx.clearRect(x,y,10,10)) - и удаляем массив [y] и очищаем этот квадратик
или же если условие не выполняется, мы присваиваем квадратику единичку и заполняем его
Ответить с цитированием
  #7 (permalink)  
Старый 26.07.2017, 01:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

Сообщение от shoopik
(mas[y]= mas[y]||{})
if(mas[y]=== null) mas[y] = {}
else mas[y] =mas[y]


Сообщение от shoopik
!Object.keys(mas[y]).length
нет ключей length = 0 , !0 === true.
условно if(mas[y] === {}) то удаляем mas[y] , так как он пуст.

Последний раз редактировалось рони, 26.07.2017 в 01:11.
Ответить с цитированием
  #8 (permalink)  
Старый 26.07.2017, 10:42
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от рони Посмотреть сообщение
if(mas[y]=== null) mas[y] = {}
else mas[y] =mas[y]
нет ключей length = 0 , !0 === true.
условно if(mas[y] === {}) то удаляем mas[y] , так как он пуст.
Спасибо, эт я понял, не совсем понял запись вида:
(mas[y]= mas[y]||{}) && mas[y][x]==1 ?  (delete mas[y][x],!Object.keys(mas[y]).length && delete mas[y],ctx.clearRect(x,y,10,10)) : (mas[y][x]=1,ctx.fillRect(x,y,10,10));

Получается здесь типа такого:
если выполняется условие
mas[y]= mas[y]||{}) && mas[y][x]==1

тогда жс делает
1) delete mas[y][x], 2)  !Object.keys(mas[y]).length && delete mas[y], 3)  ctx.clearRect(x,y,10,10))
-вот эту часть не понял, по отдельности то понял, как они вместе работают я не понял
например есть mas[150][50]

1) delete mas[150][50] - удаляет эти элементы, дальше идёт
2)мы же уже удалили, зачем опять ? он же пустой у нас
и всё равно не догоняю запись такую: !x && y - я понял что они по отдельности делают, не понял про &&, перечитал про логические операторы, не догоняю
Цитата:
В классическом программировании И возвращает true, если оба аргумента истинны, а иначе – false:
3) очищает квадратик, ну это понял

если условие не выполняется , тогда
(mas[y][x]=1,ctx.fillRect(x,y,10,10))

Последний раз редактировалось shoopik, 26.07.2017 в 10:47.
Ответить с цитированием
  #9 (permalink)  
Старый 26.07.2017, 11:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

Сообщение от shoopik
1) delete mas[150][50] - удаляет эти элементы, дальше идёт
удаляет один!!! элемент из обьекта(в одной строке может быть много элементов mas[150][49],mas[150][70], и т.д.)
Сообщение от shoopik
2)мы же уже удалили, зачем опять ? он же пустой у нас
если выше удалили последний элемент, то удалить и сам обьект (строку mas[150])

Сообщение от shoopik
(mas[y]= mas[y]||{}) && mas[y][x]==1 ? (delete mas[y][x],!Object.keys(mas[y]).length && delete mas[y],ctx.clearRect(x,y,10,10)) : (mas[y][x]=1,ctx.fillRect(x,y,10,10));
если строки нет то создать и если в этой строке есть ячейка по адресу x, то удалить ячейку, удалить строку если ячейка последняя была, стереть квадрат с поля с координатами x,y иначе создать ячейку, записать в неё 1 и нарисовать квадрат с координатами x,y .

Последний раз редактировалось рони, 26.07.2017 в 11:54.
Ответить с цитированием
  #10 (permalink)  
Старый 26.07.2017, 12:32
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

спасибо за объяснение, теперь понял
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двухмерный массив shoopik Общие вопросы Javascript 2 25.07.2017 12:58
Не получается задать двухмерный массив greatilya Общие вопросы Javascript 2 04.08.2010 11:01