Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Прошу советов и критики по игре (https://javascript.ru/forum/project/73961-proshu-sovetov-i-kritiki-po-igre.html)

Amedeo Avogadro 31.05.2018 18:06

Прошу советов и критики по игре
 
Добрый день, случайно наткнулся на соседнюю темку (игра крестики нолики) и решил сделать нечто похожее на игру "Пятнашки".
Сейчас понемногу осваиваю JS по Фленегану и заодно вспоминаю html & css из ВУЗовской программы обучения, хотя чисто интуитивно сегодня пришлось понять как работает this и dataset, хотя возможно я их и не правильно и не к месту применил))))

Сразу скажу что есть один существенный баг - фишки можно переставлять по горизонтали или вертикали на 1, чего в оригинале естественно делать нельзя, но я об этом вспомнил только когда все было готово :lol: , а за день написания кода уже мозг не варит (возможно завтра исправлю)

https://jsfiddle.net/Amedeo_Avogadro/axbprxu5/

P.S. Сейчас прохожу объекты, но как-то на практике в данном примере вообще ума не приложу где использовать объекты.....
P.S.S. В общем хочу объективной/субъективной критики по коду:thanks:

рони 31.05.2018 19:22

Amedeo Avogadro,
может по первому клику и менять, а не по двум?

Amedeo Avogadro 31.05.2018 22:28

Цитата:

Сообщение от рони (Сообщение 486441)
Amedeo Avogadro,
может по первому клику и менять, а не по двум?

так и необходимо)) Получаем индекс дырки и сдвигаем в нее близлежащую ячейку, но я писал что ошибся с правилами игры и по сути можно переставлять любые две клетки:dance: , что неправильно

Amedeo Avogadro 31.05.2018 22:29

Цитата:

Сообщение от Rise (Сообщение 486446)
Ты их уже используешь, вот это cell[i] и this это всё объекты.

Ну это DOM как я понимаю, а вот именно создать пользовательский объект

рони 31.05.2018 22:32

Цитата:

Сообщение от Amedeo Avogadro
Получаем индекс дырки и сдвигаем в нее близлежащую ячейку

ищем возле кликнутой ячейки, пустую, и если такая есть, меняем содержимое этой пары, как-то так...

Amedeo Avogadro 31.05.2018 23:20

Цитата:

Сообщение от рони (Сообщение 486456)
ищем возле кликнутой ячейки, пустую, и если такая есть, меняем содержимое этой пары, как-то так...

да, я это и имел ввиду.

исправил все:

https://jsfiddle.net/Amedeo_Avogadro/axbprxu5/10/

Кода стало намного меньше:haha:

рони 31.05.2018 23:28

Amedeo Avogadro,
на всякий случай, в половине(условно) комбинаций "миссия будет не выполнима"

Amedeo Avogadro 31.05.2018 23:35

Цитата:

Сообщение от рони (Сообщение 486458)
Amedeo Avogadro,
на всякий случай, в половине(условно) комбинаций "миссия будет не выполнима"

всмысле? почему?

P.S. Есть баг .cell_game:hover не срабатывает на тех ячейках где из скрипта ( move_value() ) был применен фоновый цвет(

рони 31.05.2018 23:56

Цитата:

Сообщение от Amedeo Avogadro
всмысле? почему?

потому что не все комбинации можно упорядочить,
можно гонять пустую ячейку рандомно из начального "правильного" положения.

j0hnik 01.06.2018 00:20

На кодварсах сегодня в ленте задание всплывало, нужно бота к это игре написать, который выводит массив всех матриц от стартового состояния до финишного, если задача не решaема, вернуть null.

Amedeo Avogadro 01.06.2018 00:23

Цитата:

Сообщение от рони (Сообщение 486460)
потому что не все комбинации можно упорядочить,
можно гонять пустую ячейку рандомно из начального "правильного" положения.

ну гонять ее долго можно/очень долго/ но в итоге должна же собраться:-?

j0hnik 01.06.2018 00:29

Amedeo Avogadro,
Такая игра раньше в карманном варианте была, была всегда решаема, а если не решалась, человек отходил в сторонку и каким то загадочным образом находил решение.

Amedeo Avogadro 01.06.2018 00:45

Цитата:

Сообщение от j0hnik (Сообщение 486465)
Amedeo Avogadro,
Такая игра раньше в карманном варианте была, была всегда решаема, а если не решалась, человек отходил в сторонку и каким то загадочным образом находил решение.

но включаем игру по первой ссылке)

Всем спасибо за обсуждение)

Проблема с ховером решилась, в move_value() нужно убрать #dddddd и присваивать просто пустую строку, но это все равно странно, .cell_game:hover это же никак не затрагивает....

void() 01.06.2018 00:50

Нужно решить вопрос с тем, что рони говорил - нерешаемые комбинации. А когда все будет готово, советую попробовать сделать те же пятнашки, только с анимированными плитками, чтоб они плавно переезжали с места на место. Вот там будут интересные подводные камни при работе с DOM и вообще - это веселая задачка)

рони 01.06.2018 01:01

Цитата:

Сообщение от Amedeo Avogadro
ну гонять ее долго можно

достаточно 20-30 сдвигов
Цитата:

Сообщение от Amedeo Avogadro
но в итоге должна же собраться

не понял.

j0hnik 01.06.2018 21:01

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
	.klet, .cl{
		width: 50px;
		height: 50px;
		background-color: #ddd;
		font-size: 42px;
		border: 5px solid #ccc;
		color: grey;
		text-align: center;
	}
	.cl{
		background-color: white;
		border: 0;
		color: white;
	}
	.green{
		background-color: #B6FF00FF;
	}
</style>
</head>
<body>
	<div id="game"></div>
	<script>
		var game = document.querySelector('#game'),
		table = document.createElement('table'), str = '';
		arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,'cl'].sort((a, b)=>Math.random() - 0.5);

		for(var i = 0; i<4; i++){
			str += '<tr>';
			for(var j = 0; j<4; j++)  str += '<td class="klet '+(arr[arr.length-1] == 'cl'&&'cl')+'">'+arr.pop();
		}

	table.innerHTML = str;
	game.append(table);
	var td = document.querySelectorAll('td');

	function fn2(t){
		var cl = document.querySelector('.cl'),
		text = t.textContent;
		t.textContent = 'cl';
		cl.textContent = text;
		cl.classList.remove('cl');
		t.classList.add('cl');
		fn1();
	}

	(fn1=()=>{
		var x = 0;
		for(var i = 0; i<15; i++){
			if(i+1 == td[i].textContent*1 && i==x) {
				td[i].classList.add('green');
				if(++x == 15) alert('Победа');
			}
			else td[i].classList.remove('green');
			}
	})();

	td.forEach((el,i) => el.onclick = function(){
		if ((i!=0 && i!=4 && i!=8 && i!=12 && td[i-1].matches('.cl')) || (i!=15 && i!=11 && i!=7 && i!=3 && td[i+1].matches('.cl')) || (i<12 && td[i+4].matches('.cl')) ||(i>3 && td[i-4].matches('.cl')) ) fn2(this);
});


</script>
</body>
</html>

Amedeo Avogadro 02.06.2018 12:06

Цитата:

Сообщение от j0hnik (Сообщение 486527)
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
	.klet, .cl{
		width: 50px;
		height: 50px;
		background-color: #ddd;
		font-size: 42px;
		border: 5px solid #ccc;
		color: grey;
		text-align: center;
	}
	.cl{
		background-color: white;
		border: 0;
		color: white;
	}
	.green{
		background-color: #B6FF00FF;
	}
</style>
</head>
<body>
	<div id="game"></div>
	<script>
		var game = document.querySelector('#game'),
		table = document.createElement('table'), str = '';
		arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,'cl'].sort((a, b)=>Math.random() - 0.5);

		for(var i = 0; i<4; i++){
			str += '<tr>';
			for(var j = 0; j<4; j++)  str += '<td class="klet '+(arr[arr.length-1] == 'cl'&&'cl')+'">'+arr.pop();
		}

	table.innerHTML = str;
	game.append(table);
	var td = document.querySelectorAll('td');

	function fn2(t){
		var cl = document.querySelector('.cl'),
		text = t.textContent;
		t.textContent = 'cl';
		cl.textContent = text;
		cl.classList.remove('cl');
		t.classList.add('cl');
		fn1();
	}

	(fn1=()=>{
		var x = 0;
		for(var i = 0; i<15; i++){
			if(i+1 == td[i].textContent*1 && i==x) {
				td[i].classList.add('green');
				if(++x == 15) alert('Победа');
			}
			else td[i].classList.remove('green');
			}
	})();

	td.forEach((el,i) => el.onclick = function(){
		if ((i!=0 && i!=4 && i!=8 && i!=12 && td[i-1].matches('.cl')) || (i!=15 && i!=11 && i!=7 && i!=3 && td[i+1].matches('.cl')) || (i<12 && td[i+4].matches('.cl')) ||(i>3 && td[i-4].matches('.cl')) ) fn2(this);
});


</script>
</body>
</html>

ого, я тут некоторые места не понял но все равно спасибо.:thanks:

рони 02.06.2018 15:52

Rise,
:thanks:


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