JavaScript. Учебник начального уровня - [9]

Шрифт
Интервал

В этой главе нам осталось поговорить о новом методе, который нам понадобился. Для его работы я ввёл небольшой вспомогательный метод hasMine:


>this.hasMine = function(i, j)

>{

>if ((i < 0) || (j < 0) || (i >= this.rowCount) || (j >= this.colCount))

>return 0;

>if (this.mines[i * this.rowCount + j] == 1)

>return 1;

>return 0;

>}


Этот метод принимает индекс строки и столбца для ячейки и возвращает ноль, если хотя бы один из индексов за пределами нашей таблицы (это проверяется в первой строке). Напомню, на всякий случай, что "||" соответствует логической операции «ИЛИ». Третья строка непосредственно проверяет, есть–ли в ячейке бомба и если она есть, мы возвращаем единичку. И, наконец в конце, если мы всё ещё не вышли из функции (ничего не вернули, так как ни одно из условий не выполнилось), мы тоже возвращаем ноль.

Ну и наконец последнее, сам метод checkCell. Он тоже принимает на вход номер строки и столбца. Давайте сперва посмотрим на его реализацию.


>this.checkCell = function(i, j)

>{

>if (this.hasMine(i, j))

>return '*';

>return this.hasMine(i - 1, j - 1) + this.hasMine(i - 1, j) + this.hasMine(i - 1, j + 1) +

>this.hasMine(i, j - 1) + this.hasMine(i, j + 1) +

>this.hasMine(i + 1, j - 1) + this.hasMine(i + 1, j) + this.hasMine(i + 1, j + 1);

>}


На самом деле он сдеан довольно–таки топорно и куда элегантней, да и правильней, наверное, было бы сделать вложенный цикл, но так мне показалось нагляднее. Можете поэкспериментировать если будет желание. Помните, от row, равной i - 1, до row <= i + 1 выполним от col = j - 1 до col <= j + 1, res += this.hasMine(row, col).

Ладно, вернёмся к тому, как это сделал я. Сначала мы проверяем наличие бомбы непосредственно для ячейки со строкой i и столбцом j, если она там есть, мы возвращаем "*". Если бомбы нет, мы возвращаем сумму результатов функции hasMine для всех соседей. Как вы помните, hasMine возвращает ноль, если бомбы нет и единицу, если она там есть, таким образом, мы вернём именно то, что хотели.

Уже можно играть

Продолжу серию статей про программирование для JavaScript. Сегодняшняя статья рискует закончить что–то вроде учебника по этому языку. В вашего сапёра после этой главы уже можно будет играть. Конечно, останется ещё ряд недоделок, например, стоит добавить сообщения при выигрыше и при проигрыше, нужно также сделать так, чтобы при открытие ячейки, рядом с которой нет бомб автоматически открывались также все её соседи. Ещё было бы не плохо сделать возможность выбирать размер поля и количество бомб на нём, добавить возможность помечать ячейки как ячейки с бомбами.

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

Сегодня впервые я решил не приводить весь код программы, так как изменения коснулись только функции initTable. Вот во что она превратилась:


>var mines = new minesClass(10, 10, 10);

>        function checkCell(i, j)

>        {var tbl = document.getElementById(«tbl»);

>              var cell = tbl.rows[i].cells[j];

>              var s = mines.checkCell(i, j);

>              cell.innerHTML = s;

>              if (s == "*")

>                    cell.bgColor = 'red';}


>        function initTable()

>        {var tbl = document.getElementById(«tbl»);

>              for (var i = 0; i < mines.rowCount; i++)

>              {var row = tbl.insertRow(i);

>                    for(var j = 0; j < mines.colCount; j++)

>                    {var cell = row.insertCell(j);

>                          cell.innerHTML = '?';

>                          function SetCellClick(i, j)

>                          {cell.onclick= function() {checkCell(i, j)};};

>                          SetCellClick(i, j);}}}

Давайте по порядку. Строчку «var mines = new minesClass(10, 10, 10);" я перенёс наверх, чтобы переменная mines стала доступна из других функций (напомню, что переменная, объявленная внутри функции доступна только внутри этой функции, а «внешние» переменные доступны также в других функциях). Нам потребуется использовать эту переменную в функции checkCell, которую мы выделили из функции initTable.

По сути, в функции checkCell мы получаем из таблицы ячейку с i-ой строкой и j-ым столбцом и присваиваем ей текст, соответствующий количеству бомб рядом (раньше мы это делали непосредственно при инициализации таблицы). Для получения ссылки на ячейку, мы получаем ссылку на таблицу с помощью метода getElementById заранее предопределённой переменной document. Далее мы получаем ссылку на нужную строку, обращаясь к полю rows таблицы (это массив, поэтому после имени поля в квадратных скобках указываем индекс) и сразу же обращаемся к полю cells строки (это тоже массив) для получения искомой ссылки на ячейку.

Последующие строки функции checkCell мы перенесли из функции initTable без изменений.

Ну и последнее о чём осталось рассказать — функция initTable. Несколько строчек мы оттуда унесли и появилась, несколько добавили:


>                      cell.innerHTML = '?';

>                      function SetCellClick(i, j)


Еще от автора DarkGoodWIN
Рефакторинг. Зачем?

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Хорошо

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Тень иллюзии

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Рекомендуем почитать
Социология

Книга Н. Смелзера «Социология» представляет курс лекций по общей социологии для студентов высших учебных заведений.Достоинство книги в том, что она написана максимально доступным языком и полностью соответствует содержанию курса «Социология», как он отражён в государственном стандарте, а потому данное учебное пособие может быть базовым по этому курсу.Книга Смелзера также предназначена для широкого круга читателей и, в первую очередь, для предпринимателей и руководителей.На русском языке это уже второе издание.


Культура отечественного собаководства XX–XXI вв. (комментарии, реплики, размышления)

Сулимов Клим Тимофеевич, кандидат биологических наук, ведущий научный сотрудник РосНИИ культурного и природного наследия им. Д. С. Лихачева, член научно-координационного совета по отечественным породам собак России. Научный консультант отдела кинологического мониторинга ПАО «Аэрофлот». Материал, подготовленный К. Т. Сулимовым в области общей и прикладной кинологии, представляет собой собственные комментарии к двум альтернативным теориям происхождения домашней собаки, к фрагментам истории отечественного собаководства, реплики и размышления на тему о стандартах пород и практике полевых испытаний охотничьих и служебных собак второй половины XX столетия, о нетрадиционном использовании естественных пород и перспективах выведения новых в настоящем и обозримом будущем. Затронуты проблемы так называемых бесхозных дворняг. Значительная часть книги посвящена критическому рассмотрению породных признаков главных отечественных пород и отродий отечественного разведения, функциональным особенностям основных статей собаки и ее поведению. Может служить пособием для изучения становления пород, их преобразований в условиях отечественной культуры собаководства.


Как разбудить в себе Шекспира

«Однажды просыпаешься и понимаешь, что все это никуда не годится. Надо что-то менять». Драматург Юлия Тупикина предлагает простое и изящное решение для перемен в вашей жизни – попробуйте написать свою первую пьесу! Почему именно ее? Современный российский театр очень любит новичков, всегда открыт свежим именам и идеям. Вы сможете попробовать свои силы на одном из конкурсов, а там и до больших постановок и хороших гонораров недалеко. И даже если вы не станете великим писателем, процесс написания пьесы благодаря этой книге станет для вас увлекательным путешествием, полным творческих открытий. В книге много практических упражнений, которые можно выполнять одно за одним или выбирать те, что вам больше приглянулись.


Медицинская статистика

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


Коммерческое право

Конспект лекций, составленный в соответствии с Государственным образовательным стандартом высшего образования, поможет систематизировать полученные ранее знания и успешно сдать экзамен или зачет по дисциплине «Коммерческое право».Издание предназначено для студентов, преподавателей и аспирантов юридических вузов и факультетов.


История мировых религий

Данное издание представляет собой конспект лекций по предмету «История мировых религий». В книге изложены основные вопросы данного курса. Конспект лекций станет незаменимым помощником при подготовке к экзамену или зачету, предназначен для студентов высших и средних учебных заведений гуманитарных специальностей.