Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   двухмерный массив(2) (https://javascript.ru/forum/misc/69889-dvukhmernyjj-massiv-2-a.html)

shoopik 25.07.2017 17:40

двухмерный массив(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>

Dilettante_Pro 25.07.2017 18:09

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

Сообщение от shoopik
В html-run почему-то не рисуется квадрат.

Что-то в коде незаметно никакого рисования

shoopik 25.07.2017 18:14

Цитата:

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

Что-то в коде незаметно никакого рисования

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

shoopik 25.07.2017 22:00

подумал немного, получается, что при клике x и y координаты передаются в значения [i][j] и ставится значение 1, которое по умолчанию ноль, понимаю как делит квадрат этот х и у, но не понимаю каким образом его делит массив [i] и [j], т.е. каким вобще образом этот массив заносится в это поле

рони 25.07.2017 23:41

canvas сохранение только отмеченных клеток
 
shoopik,
:write: ... для примера
отмеченный квадрат можно стереть повторным кликом.
<!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>

shoopik 26.07.2017 00:48

Цитата:

Сообщение от рони (Сообщение 459612)
(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] в массиве равен самому себе или хоть чему ? :help:
и 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] и очищаем этот квадратик
или же если условие не выполняется, мы присваиваем квадратику единичку и заполняем его :D

рони 26.07.2017 01:08

Цитата:

Сообщение от 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] , так как он пуст.

shoopik 26.07.2017 10:42

Цитата:

Сообщение от рони (Сообщение 459616)
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))
-вот эту часть не понял, по отдельности то понял, как они вместе работают я не понял :D
например есть mas[150][50]

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

В классическом программировании И возвращает true, если оба аргумента истинны, а иначе – false:
3) очищает квадратик, ну это понял

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

рони 26.07.2017 11:51

Цитата:

Сообщение от 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 .

shoopik 26.07.2017 12:32

спасибо за объяснение, теперь понял :thanks:


Часовой пояс GMT +3, время: 19:02.