Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 07.01.2022, 13:47
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Рони, с Рождеством!
Сообщение от рони
код можно сделать ещё интереснее
Следуя вашему совету, малость "поигрался" с последним кодом и обнаружил, что при увеличении количества ячеек в таблице перемешивание осуществляется не в полной мере... например, при таком варианте таблицы:
<table align="center" cellspacing="0" cellpadding="0">
            <tr>
                <td data-id="red"></td>
                <td data-id="red"></td>
                <td data-id="red"></td>
                <td data-id="red"></td>
            </tr>
            <tr>
                <td data-id="blue"></td>
                <td data-id="blue"></td>
                <td data-id="blue"></td>
                <td data-id="blue"></td>
            </tr>
            <tr>
                <td data-id="orange"></td>
                <td data-id="orange"></td>
                <td data-id="orange"></td>
                <td data-id="orange"></td>
            </tr>
            <tr>
                <td data-id="green"></td>
                <td data-id="green"></td>
                <td data-id="green"></td>
                <td data-id="green"></td>
            </tr>
        </table>

Может быть, возможен какой-нибудь другой код для shuffle?)
Ответить с цитированием
  #12 (permalink)  
Старый 07.01.2022, 14:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Борис К,
сделайте цикл для shuffle равный количеству клеток.
Ответить с цитированием
  #13 (permalink)  
Старый 07.01.2022, 14:16
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Борис К,
или так ...
if ( event.random ||(x == 0 && y == 1) || (x == 1 && y == 0) || td === temp[0] )
Ответить с цитированием
  #14 (permalink)  
Старый 07.01.2022, 14:34
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Сообщение от рони
сделайте цикл для shuffle равный количеству клеток
Сделал так (может, и неправильно):
for (i = 0; i < 16; i++) {
            tds.slice(0).sort(_ => Math.random() - .5)
                .forEach(target => exch({
                    target,
                    random: true
                }));
            temp = [];
}

Заметно лучше!))
Сообщение от рони
или так ...
if ( event.random ||(x == 0 && y == 1) || (x == 1 && y == 0) || td === temp[0] )
И так попробовал... но через цикл для shuffle показалось лучше)
Рони, благодарю!
Ответить с цитированием
  #15 (permalink)  
Старый 07.01.2022, 14:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Борис К,
let arr = tds.slice(0);
           for (var i = 0; i < tds.length; i++) {
             arr.sort(_ => Math.random() - .5)
                .forEach(target => exch({
                    target,
                    random: true
                }));
            }
            temp = [];
Ответить с цитированием
  #16 (permalink)  
Старый 07.01.2022, 14:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Борис К,
на всякий случай https://javascript.ru/forum/events/8...tml#post541463

и вместо sort лучше менять пары при перемешивании, более равномерное перемешивание.

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <style type="text/css">
        [data-id="red"] {
            background-color: #ff0000;
            width: 100px;
            height: 100px;
        }

        [data-id="orange"] {
            background-color: #ff9900;
            width: 100px;
            height: 100px;
        }

        [data-id="green"] {
            background-color: #006600;
            width: 100px;
            height: 100px;
        }

        [data-id="blue"] {
            background-color: #0000ff;
            width: 100px;
            height: 100px;
        }
    </style>
    <script type="text/javascript">
        document.addEventListener("DOMContentLoaded", function() {
            let temp = [];
            let form = document.querySelector(".game");
            let tds = Array.from(form.querySelectorAll("[data-id]"));
            let idEnd = tds.map(({
                dataset: {
                    id
                }
            }) => id);
            let win;

            function exch(event) {
                if (win) return;
                let td = event.target.closest("[data-id]");
                if (td) {
                    let cellIndex = td.cellIndex;
                    let rowIndex = td.closest("tr").rowIndex;
                    if (temp.length) {
                        let x = Math.abs(cellIndex - temp[1]);
                        let y = Math.abs(rowIndex - temp[2]);
                        if (event.random || (x == 0 && y == 1) || (x == 1 && y == 0) || td === temp[0]) {
                            [td.dataset.id, temp[0].dataset.id] = [temp[0].dataset.id, td.dataset.id]
                            temp = [];
                        }
                    } else {
                        temp = [td, cellIndex, rowIndex];
                    }
                    if (!event.random) win = tds.every(({
                        dataset: {
                            id
                        }
                    }, i) => id === idEnd[i]);
                    if (win) alert("Hello world!");
                }
            }
            form.addEventListener("click", exch);
            let arr = tds.slice(0), len = arr.length;
            arr.forEach((_, i) => {
                let a = Math.trunc(Math.random() * len);
                [arr[i], arr[a]] = [arr[a], arr[i]];
            });
            arr.forEach(target => exch({
                target,
                random: true
            }));
            temp = [];
        });
    </script>
</head>

<body>
    <form class="game">
        <table align="center" cellspacing="0" cellpadding="0">
            <tr>
                <td data-id="red"></td>
                <td data-id="red"></td>
                <td data-id="red"></td>
                <td data-id="red"></td>
            </tr>
            <tr>
                <td data-id="blue"></td>
                <td data-id="blue"></td>
                <td data-id="blue"></td>
                <td data-id="blue"></td>
            </tr>
            <tr>
                <td data-id="orange"></td>
                <td data-id="orange"></td>
                <td data-id="orange"></td>
                <td data-id="orange"></td>
            </tr>
            <tr>
                <td data-id="green"></td>
                <td data-id="green"></td>
                <td data-id="green"></td>
                <td data-id="green"></td>
            </tr>
        </table>
    </form>
</body>

</html>
Ответить с цитированием
  #17 (permalink)  
Старый 07.01.2022, 15:07
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Все варианты отлично работают!)))
Сообщение от рони
на всякий случай https://javascript.ru/forum/events/8...tml#post541463

и вместо sort лучше менять пары при перемешивании, более равномерное перемешивание.
Спасибо!
Рони, берегите, лелейте и цените себя!
Мои искренняя огромная благодарность, безграничное восхищение и глубокое уважение Вам!!!

Последний раз редактировалось Борис К, 07.01.2022 в 15:10.
Ответить с цитированием
  #18 (permalink)  
Старый 07.01.2022, 15:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Борис К,
убрал "лишнее"
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <style type="text/css">
        [data-id="red"] {
            background-color: #ff0000;
            width: 100px;
            height: 100px;
        }

        [data-id="orange"] {
            background-color: #ff9900;
            width: 100px;
            height: 100px;
        }

        [data-id="green"] {
            background-color: #006600;
            width: 100px;
            height: 100px;
        }

        [data-id="blue"] {
            background-color: #0000ff;
            width: 100px;
            height: 100px;
        }
    </style>
    <script type="text/javascript">
        document.addEventListener("DOMContentLoaded", function() {
            let temp = [];
            let form = document.querySelector(".game");
            let tds = Array.from(form.querySelectorAll("[data-id]"));
            let idEnd = tds.map(({
                dataset: {
                    id
                }
            }) => id);
            let win;

            function exch(event) {
                if (win) return;
                let td = event.target.closest("[data-id]");
                if (td) {
                    let cellIndex = td.cellIndex;
                    let rowIndex = td.closest("tr").rowIndex;
                    if (temp.length) {
                        let x = Math.abs(cellIndex - temp[1]);
                        let y = Math.abs(rowIndex - temp[2]);
                        if ((x == 0 && y == 1) || (x == 1 && y == 0) || td === temp[0]) {
                            [td.dataset.id, temp[0].dataset.id] = [temp[0].dataset.id, td.dataset.id]
                            temp = [];
                        }
                    } else {
                        temp = [td, cellIndex, rowIndex];
                    }
                    win = tds.every(({
                        dataset: {
                            id
                        }
                    }, i) => id === idEnd[i]);
                    if (win) alert("Hello world!");
                }
            }
            form.addEventListener("click", exch);
            let color = idEnd.slice(0), len = color.length;
            color.forEach((_, i) => {
                let a = Math.trunc(Math.random() * len);
                [color[i], color[a]] = [color[a], color[i]];
            });
            tds.forEach(({dataset}, i) => dataset.id = color[i]);
        });
    </script>
</head>

<body>
    <form class="game">
        <table align="center" cellspacing="0" cellpadding="0">
            <tr>
                <td data-id="red"></td>
                <td data-id="red"></td>
                <td data-id="red"></td>
                <td data-id="red"></td>
            </tr>
            <tr>
                <td data-id="blue"></td>
                <td data-id="blue"></td>
                <td data-id="blue"></td>
                <td data-id="blue"></td>
            </tr>
            <tr>
                <td data-id="orange"></td>
                <td data-id="orange"></td>
                <td data-id="orange"></td>
                <td data-id="orange"></td>
            </tr>
            <tr>
                <td data-id="green"></td>
                <td data-id="green"></td>
                <td data-id="green"></td>
                <td data-id="green"></td>
            </tr>
        </table>
    </form>
</body>

</html>
Ответить с цитированием
  #19 (permalink)  
Старый 07.01.2022, 15:40
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Сообщение от рони
убрал "лишнее"
Я обязательно изучу изменения - это самый лучший способ учиться чему-то новому (никогда не поздно!)))
Роничка, СПАСИБО!!!
Ответить с цитированием
  #20 (permalink)  
Старый 12.01.2022, 14:19
Кандидат Javascript-наук
Отправить личное сообщение для Борис К Посмотреть профиль Найти все сообщения от Борис К
 
Регистрация: 22.02.2017
Сообщений: 145

Рони, а возможно сделать, чтобы в стилях были не ссылки на изображения, а текстовый контент в самом коде?
Я немного упростил код для удобства:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <style type="text/css">
        [data-id="red"] {
            background-image:url(https://placehold.co/200x100/ff0000/EEE?font=playfair-display&text=Hello); 
            width: 200px;
            height: 100px;
 }
 
        [data-id="orange"] {
            background-image:url(https://placehold.co/200x100/ff9900/EEE?font=playfair-display&text=Java);
            width: 200px;
            height: 100px;
        }

        [data-id="green"] {
            background-image:url(https://placehold.co/200x100/006600/EEE?font=playfair-display&text=script!);
            width: 200px;
            height: 100px;
        }         
    </style>
    <script type="text/javascript">
        document.addEventListener("DOMContentLoaded", function() {
            let temp = [];
            let form = document.querySelector(".game");
            let tds = Array.from(form.querySelectorAll("[data-id]"));
            let idEnd = tds.map(({
                dataset: {
                    id
                }
            }) => id);
            let win;

            function exch(event) {
                if (win) return;
                let td = event.target.closest("[data-id]");
                if (td) {
                    let cellIndex = td.cellIndex;
                    let rowIndex = td.closest("tr").rowIndex;
                    if (temp.length) {
                        let x = Math.abs(cellIndex - temp[1]);
                        let y = Math.abs(rowIndex - temp[2]);
                        if ((x == 0 && y == 1) || (x == 1 && y == 0) || td === temp[0]) {
                            [td.dataset.id, temp[0].dataset.id] = [temp[0].dataset.id, td.dataset.id]
                            temp = [];
                        }
                    } else {
                        temp = [td, cellIndex, rowIndex];
                    }
                    win = tds.every(({
                        dataset: {
                            id
                        }
                    }, i) => id === idEnd[i]);
                    if (win) alert("Hello JavaScript!");
                }
            }
            form.addEventListener("click", exch);
            let color = idEnd.slice(0), len = color.length;
            color.forEach((_, i) => {
                let a = Math.trunc(Math.random() * len);
                [color[i], color[a]] = [color[a], color[i]];
            });
            tds.forEach(({dataset}, i) => dataset.id = color[i]);
        });
    </script>
</head>
<body>
<div class="block">
    <form class="game">
        <table align="center" cellspacing="0" cellpadding="0">
            <tr>
                <td data-id="red"></td>
                <td data-id="orange"></td> 
                <td data-id="green"></td> 
            </tr>
        </table>
    </form> 
</div> 
</body>
</html>
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в цикле for переходить к следующей итерации после завершения предыдущей? FRIE jQuery 5 30.07.2014 19:03
Как запустить функцию после завершения другой функции? Hurray Элементы интерфейса 2 12.05.2014 14:38
Выполнение после таймера hoax Элементы интерфейса 4 24.11.2013 11:23
Возврат значения функции после завершения анимации (затухания) grego jQuery 5 16.04.2013 22:25
Как обнулить переменные после завершения скрипта QRS jQuery 3 07.07.2010 03:08