С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
Записей в блоге: 1

Игра "Убей крота"

11.01.2023, 17:31. Показов 4454. Ответов 5

Студворк — интернет-сервис помощи студентам
Здраствуйте!
Необходимо реализовать игру по известной "Убей крота"
Проблема в том, что скрипт не работает, и я никак не могу найти где ошибка. Подскажите, пожалуйста
Ниже код html, js и gif работы игры

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">    
    <link rel="stylesheet" href="../../assets/css/style.css" />
    <link rel="stylesheet" href="task.css">
    <title>Mole Game</title>    
</head>
<body>
    <header class="header">
        <div class="logo__container">
          <a href="https://netology.ru/" class="logo__link"></a>
        </div>
        <h1 class="header__title">
            Домашнее задание к занятию 1.1 «Возможности JavaScript в браузере». Игра «Убей кротов»
        </h1>
    </header>
    <main class="content">
        <div class="card">
            <div id="status" class="status">
                Убито кротов: <span id="dead">0</span><br>
                Промахов: <span id="lost">0</span><br>
            </div>
            <div class="hole-game">
                <div class="hole hole_has-mole" id="hole1"></div>
                <div class="hole" id="hole2"></div>
                <div class="hole" id="hole3"></div>
                <div class="hole" id="hole4"></div>
                <div class="hole" id="hole5"></div>
                <div class="hole" id="hole6"></div>
                <div class="hole" id="hole7"></div>
                <div class="hole" id="hole8"></div>
                <div class="hole" id="hole9"></div>
            </div>
        </div>
    </main>    
    <script src="base.js"></script>
    <script src="task.js"></script>
</body>
</html>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const dead = document.getElementById('dead').innerHTML;
const lost = document.getElementById('lost').innerHTML;
let counterDead = 0;
let counterLost = 0;
getHole = index => document.getElementById(hole$,{index});// выбор дыры по index
for (holeIndex = 1; holeIndex < 10; holeIndex++) {
let hole = getHole(holeIndex);
// holeHandler - функция, которая запустится по клику
hole.addEventListener( 'click', function() {
if ( hole.classList.contains( 'hole_has-mole')){
counterDead++;
dead.textContent = counterDead;
} else {
counterLost++;
lost.textContent = counterLost;
}
 
if (counterDead == 3) {
//dead.textContent = counterDead; //?
// playing = false;
alert ('win');
counterDead = 0;
counterLost = 0;
dead.textContent = counterDead;
}
});
}

Условия победы и поражения

Случайным образом у одной из лунок добавляется класс hole_has-mole, что значит, что в лунке есть крот.
Только если при клике на лунку с классом hole_has-mole вы должны засчитать +1 к победе. В ином случае - поражение.

Используйте цикл для задания обработчика для каждой лунки.
Для проверки на наличие того или иного класса, используйте метод includes:
Миниатюры
Игра "Убей крота"  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2023, 17:31
Ответы с готовыми решениями:

Как правильно развести "крота" для смывания фоторезиста?
Уважаемые знатоки! У топикстартера есть аэрозольный фоторезист-позитив, а так же жидкость для прочистки труб &quot;крот&quot;. ...

Убей скуку!
Представляю вашему вниманию веселые флэшки, которые помогут развеять офисную скуку Матрица - Классная флешка! Музыкальные квадратики....

Вылетает с Ошибкой, и хоть ты убей.
FValue: array of array of Boolean; ... //FValue:=Nil; SetLength(FValue,X); for I := 0 to X-1 do try ...

5
 Аватар для klyapa
3503 / 1267 / 429
Регистрация: 24.07.2016
Сообщений: 1,890
11.01.2023, 18:41
Три года задачку решаете что ли? Уже бы и css c другого сайта с аналогичной задачей притащили, для визуализации.
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
.hole-game {
  width: 800px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-around;
}
 
.status {
  margin-bottom: 20px;
}
.hole {
  width: 200px;
  height: 200px;
  margin-bottom: 30px;
  margin-right: 30px;
  background: gray;
  border-radius: 50%;
}
 
.hole_has-mole {
  background-image: url(images/mole.png);
  background-position: center center;
  background-repeat: no-repeat;
  background-size: contain;
  background-color: brown;
}
1
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
Записей в блоге: 1
12.01.2023, 03:58  [ТС]
вообще только тут написала про задачу. не тащила с других сайтов ничего. файлы html и css уже прописаны.
а js сама я писала и не копировала
0
88 / 40 / 10
Регистрация: 28.10.2022
Сообщений: 55
12.01.2023, 08:10
Лучший ответ Сообщение было отмечено Anna_Batuk как решение

Решение

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    const dead = document.getElementById('dead');
    const lost = document.getElementById('lost');
    var time = 1000;
    var place = 1;
    var replaceMole = () => {
        let newPlace = Math.floor( Math.random() * 5 )+1;
        if ( newPlace == place ) {
            replaceMole();
            return;
        }
        //console.log(newPlace);
        document.getElementById(`hole${place}`).classList.remove('hole_has-mole');
        document.getElementById(`hole${newPlace}`).classList.add('hole_has-mole');
        place = newPlace;
        setTimeout( function(){replaceMole();}, time );
    };
 
    let counterDead = 0;
    let counterLost = 0;
    getHole = index => document.getElementById(`hole${index}`);// выбор дыры по index
    for ( holeIndex = 1; holeIndex < 10; holeIndex++ ) {
        let hole = getHole(holeIndex);
        // holeHandler - функция, которая запустится по клику
        hole.addEventListener( 'click', function() {
            if ( hole.classList.contains( 'hole_has-mole')){
                counterDead++;
                dead.textContent = counterDead;
            } else {
                counterLost++;
                lost.textContent = counterLost;
            }
 
            if (counterDead == 3) {
                //dead.textContent = counterDead; //?
                // playing = false;
                alert ('win');
                counterDead = 0;
                counterLost = 0;
                dead.textContent = counterDead;
            }
        });
 
    }
    replaceMole();
добавил рекурсивную функцию смены крота, можете дальше её под своё усмотрение адаптировать или на свой лад

Добавлено через 13 минут
let newPlace = Math.floor( Math.random() * 8 )+1; - в 6 строчке надо 5 на 8 поменять чтобы все 9 кругов проходка была
1
 Аватар для klyapa
3503 / 1267 / 429
Регистрация: 24.07.2016
Сообщений: 1,890
12.01.2023, 12:48
Цитата Сообщение от Anna_Batuk Посмотреть сообщение
вообще только тут написала про задачу. не тащила с других сайтов ничего. файлы html и css уже прописаны.
а js сама я писала и не копировала
Ну тогда ладно, а то я ваш html очень быстро нашёл...
=> [del]

В принципе, это детская задача, которая буквально на коленке решается. ... ща распишу, от нх делать, как я вижу, пошагово...

Добавлено через 2 минуты
таким вижу html и css
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div>Убито кротов: <span id="dead">0</span></div>
<div>Промахов: <span id="lost">0</span></div>
<table id="table">
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
</table>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
table {
    border: 1px solid #ddd;
    border-spacing: 40px;
}
 
td {
    width: 70px;
    height: 70px;
}
 
.hole {
    background-color: #808080;
    background-image: url(images/4-3.png); /* здесь свой адрес крота */
    background-position: center;
    background-size: contain;
}
Добавлено через 29 секунд
дальше будет js ...

Добавлено через 2 минуты
таблица table, два счётчика dead и lost, коллекция ячеек cells (или "дырок", по вашему, где будет появляться "крот") и айдишник интервала idInterval, для остановки игры
JavaScript
1
2
3
4
const [table, dead, lost] = ['table', 'dead', 'lost'].map(id => document.getElementById(id));
const cells = table.querySelectorAll('td');
 
let idInterval = null;
Добавлено через 2 минуты
функция rand возвращает рандомное число от 0 (включительно) до n (не включая n)
JavaScript
1
2
3
function rand(n) {
    return Math.floor(Math.random() * n);
}
Добавлено через 47 секунд
такая конструкция возвратит рандомную ячейку
JavaScript
1
cells[rand(cells.length)]
Добавлено через 2 минуты
функция cls принимает элемент, устанавливает ему класс hole и через 0.5 сек. удаляет этот класс
JavaScript
1
2
3
4
function cls(elem) {
    elem.classList.add('hole');
    setTimeout(() => elem.classList.remove('hole'), 500);
}
Добавлено через 6 минут
функция shot - обработчик клика. считает клики (промах/попадание) и проверяет счетчики.
в зависимости от результата вызывает функцию stop, с соотв. аргументом

stop я ещё не допилил...
JavaScript
1
2
3
4
5
6
7
function shot(e) {
    if(e.target.classList.contains('hole')) dead.innerText = Number(dead.innerText) + 1;
    else lost.innerText = Number(lost.innerText) + 1;
    
    if(Number(dead.innerText) === 10) stop('выиграли');
    if(Number(lost.innerText) === 10) stop('проиграли');   
}
Добавлено через 6 минут
функция start запускает всю эту шнягу, устанавливает обработчик на всю таблицу (Делегирование событий) и ежесекундно вызывает функцию cls, передавая ей рандомную ячейку

на функции stop слегка подвис... )
JavaScript
1
2
3
4
function start() {
    idInterval = setInterval(() => cls(cells[rand(cells.length)]), 1000);
    table.addEventListener('click', shot);
}
Добавлено через 4 минуты
а вот и функция stop
обнуляет счётчики, останавливает игру, удаляет обработчик, предлагает повтор
JavaScript
1
2
3
4
5
6
7
8
function stop(m) {
    setTimeout(() => {
        if(confirm(`Вы ${m}. Ещё раз?`)) start();
        dead.innerText = lost.innerText = 0;
    });
    table.removeEventListener('click', shot);
    clearInterval(idInterval);
}
Добавлено через 3 минуты
всё в сборе ...
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
const [table, dead, lost] = ['table', 'dead', 'lost'].map(id => document.getElementById(id));
const cells = table.querySelectorAll('td');
 
let idInterval = null;
 
function rand(n) {
    return Math.floor(Math.random() * n);
} 
 
function cls(elem) {
    elem.classList.add('hole');
    setTimeout(() => elem.classList.remove('hole'), 500);
}
 
function shot(e) {
    if(e.target.classList.contains('hole')) dead.innerText = Number(dead.innerText) + 1;
    else lost.innerText = Number(lost.innerText) + 1;
    
    if(Number(dead.innerText) === 10) stop('выиграли');
    if(Number(lost.innerText) === 10) stop('проиграли');   
}
 
function start() {
    idInterval = setInterval(() => cls(cells[rand(cells.length)]), 1000);
    table.addEventListener('click', shot);
}
 
function stop(m) {
    setTimeout(() => {
        if(confirm(`Вы ${m}. Ещё раз?`)) start();
        dead.innerText = lost.innerText = 0;
    });
    table.removeEventListener('click', shot);
    clearInterval(idInterval);      
}
 
start();
3
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 62
Записей в блоге: 1
13.01.2023, 01:03  [ТС]
Цитата Сообщение от klyapa Посмотреть сообщение
у тогда ладно, а то я ваш html очень быстро нашёл...
=> [del]
В п
Просто обучение прохожу... есть уже готовы файлы, которые формируют основную структуру, так сказать. Все лежит в одной папке, файл js пустой, вот его и нужно заполнить
Видимо за три кода никто не парился и тупо одну задачу крутит и все

За Ваш Вариант спасибо! Я для общего развития его возьму для разбора, для себя и постараюсь все сделать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.01.2023, 01:03
Помогаю со студенческими работами здесь

Хоть убей, не могу придумать алгоритм
Картинка с задачей: https://www.cyberforum.ru/attachment.php?attachmentid=683473&amp;stc=1&amp;d=1461597765

Хоть убей не могу вставить элемент CheckBox
Мучился я мучился, все больше не могу, уже голова квадратная. 7 часов на вставку CheckBox это слишком. Прошу помощи, нужна свежая идея. Вот...

Не меняется фон в шаблоне для Joomla Хоть убей!
Здраствуйте погите пожалуйста в чем может быть дело скачал шаблон для joomlы поставил! фон не меняется хоть убей в body менял! потом вообще...

3, 4, 5 пункт меню программы не совсем коретно работает. Хоть убей но ошибку не вижу(
#include&lt;iostream&gt; #include&lt;string&gt; #include&lt;iomanip&gt; #include&lt;fstream&gt; #include &lt;stdlib.h&gt; #include &lt;windows.h&gt; #include...

Игра +1 - это современная, набирающая популярность игра на просторах интернета
Игра +1 - это современная, набирающая популярность игра на просторах интернета. Она завлекает всех своей простотой и желанием добиваться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru