на игровом поле находится робот
На игровом поле находится робот
Система команд исполнителя РОБОТ, «живущего» в прямоугольном лабиринте на клетчатой плоскости, включает в себя 4 команды-приказа и 4 команды проверки условия. Команды-приказы: вверх, вниз, влево, вправо. При выполнении любой из этих команд РОБОТ перемещается на одну клетку соответственно: вверх ↑, вниз ↓, влево ←, вправо →. Если РОБОТ начнёт движение в сторону находящейся рядом с ним стены, то он разрушится, и программа прервётся.
Другие 4 команды проверяют истинность условия отсутствия стены у каждой стороны той клетки, где находится РОБОТ: сверху свободно, снизу свободно, слева свободно, справа свободно. Цикл
выполняется, пока условие истинно. В конструкции
выполняется команда1 (если условие истинно) или команда2 (если условие ложно). В конструкциях ПОКА и ЕСЛИ условие может содержать команды проверки, а также слова И, ИЛИ, НЕ.
Сколько клеток лабиринта соответствуют требованию, что, начав движение в ней и выполнив предложенную программу, РОБОТ уцелеет и остановится в закрашенной клетке (клетка F6)?
При данной программе РОБОТ поступает следующим образом: сперва РОБОТ проверяет, свободна ли клетка справа или снизу от него. Если это так, то РОБОТ переходит к первому действию внутри цикла. В этом цикле пока у правой стороны клетки, в которой находится РОБОТ, нет стены, он продолжает двигаться вправо. Как только это условие перестанет выполняться, он переходит ко второму действию внутри цикла. Второе действие, заключается в следующем: РОБОТ проверяет, есть ли стена у нижней стороны клетки, в которой он находится, и если снизу свободно, РОБОТ передвигается на одну клетку вниз. После чего возвращается к началу внешнего цикла. Проанализировав эту программу, приходим к выводу, что РОБОТ будет двигаться вправо или вниз, пока у него есть такая возможность. РОБОТ при данной программе никогда не разобьётся.
Проверив все клетки по выведенному нами правилу движения РОБОТА выясняем, что число клеток, удовлетворяющих условию задачи, равно 18.
Система команд исполнителя РОБОТ, «живущего» в прямоугольном лабиринте на клетчатой плоскости, включает в себя 4 команды-приказа и 4 команды проверки условия.
вверх | вниз | влево | вправо |
При выполнении любой из этих команд РОБОТ перемещается на одну клетку соответственно: вверх ↑, вниз ↓, влево ←, вправо →.
Если РОБОТ начнёт движение в сторону находящейся рядом с ним стены, то он разрушится, и программа прервётся.
Другие 4 команды проверяют истинность условия отсутствия стены у каждой стороны той клетки, где находится РОБОТ:
сверху свободно | снизу свободно | слева свободно | справа свободно |
выполняется, пока условие истинно.
выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
Сколько клеток лабиринта соответствуют требованию, что, начав движение в ней и выполнив предложенную программу, РОБОТ уцелеет и остановится в закрашенной клетке (клетка А1)?
Один из главных приёмов в решении этой задачи — проверять клетки группами а не по одной.
При данной программе РОБОТ поступает следующим образом: сперва РОБОТ проверяет свободна ли клетка слева или сверху от него, если это так, то РОБОТ переходит к первому действию внутри цикла. Проверяется свободна клетка слева, если свободна — то РОБОТ делает шаг влево, иначе — шаг вверх. После возвращается к началу цикла ПОКА. В этом цикле пока слева клетки в которой находится РОБОТ нет стены он продолжает двигаться влево. В противном случае он двигается вверх.
Проверив все клетки группами выясняем, что число клеток, удовлетворяющих условию задачи, равно 21.
вверх | вниз | влево | вправо |
При выполнении любой из этих команд РОБОТ перемещается на одну клетку соответственно: вверх , вниз
, влево
, вправо
.
Четыре команды проверяют истинность условия отсутствия стены у каждой стороны той клетки, где находится РОБОТ:
сверху свободно | снизу свободно | слева свободно | справа свободно |
выполняется, пока условие истинно
выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
В конструкциях ПОКА и ЕСЛИ условие может содержать команды проверки, а также слова И, ИЛИ, НЕ, обозначающие логические операции. Если РОБОТ начнёт движение в сторону находящейся рядом с ним стены, то он разрушится и программа прервётся.
Сколько клеток лабиринта соответствуют требованию, что, начав движение в ней и выполнив предложенную программу, РОБОТ уцелеет и остановится в закрашенной клетке (клетка F6)?
ПОКА снизу свободно ИЛИ справа свободно
ЕСЛИ снизу свободно
ЕСЛИ справа свободно
При данной программе РОБОТ поступает следующим образом: сперва РОБОТ проверяет свободна ли клетка справа или снизу от него, если это так, то РОБОТ переходит к первому условию. По этому условию, если у нижней стороны клетки нет стены, то он делает шаг вниз, затем, если у правой стороны клетки нет стены делает шаг вправо.
Проанализировав эту программы приходим к выводу, что РОБОТ будет двигаться вправо или вниз, пока у него есть такая возможность. РОБОТ при данной программе никогда не разобьётся.
Видно, что существует всего 2 места, в которых робот может остановиться: нужная нам 6F и 3F. Робот может прийти в клетку 3F только если он находится в области 1B:3F и клетках 1A и 2A, количество клеток в этой области равно 17. Общее количество клеток лабиринта равна 36, следовательно, 36 − 17 = 19.
Мне кажется, что робот может попасть в клетку F6 из клеток A1-A6 и B4-F6. В таком случае в сумме их 21.
Из клеток А1 и А2 он попадёт в клетку F3. Для клетки А1: снизу свободно, Робот делает один шаг вниз, далее проверяет свободно ли справа. Поскольку в клетке А2 справа свободно, Робот выполняет команду вправо и оказывается в клетке В2. Далее цикл повторяется. На рисунке приведена траектория движения робота после выполнения цикла первый раз. Аналогично для клетки А2.
вверх | вниз | влево | вправо |
При выполнении любой из этих команд РОБОТ перемещается на одну клетку соответственно: вверх , вниз
, влево
, вправо
.
Четыре команды проверяют истинность условия отсутствия стены у каждой стороны той клетки, где находится РОБОТ:
сверху свободно | снизу свободно | слева свободно | справа свободно |
выполняется, пока условие истинно.
выполняется команда1 (если условие истинно) или команда2 (если условие ложно)
В конструкциях ПОКА и ЕСЛИ условие может содержать команды проверки, а также слова И, ИЛИ, НЕ, обозначающие логические операции.
Если РОБОТ начнёт движение в сторону находящейся рядом с ним стены, то он разрушится и программа прервётся.
Сколько клеток лабиринта соответствуют требованию, что, начав движение в ней и выполнив предложенную программу, РОБОТ уцелеет и остановится в закрашенной клетке (клетка F6)?
ПОКА снизу свободно ИЛИ справа свободно
ПОКА справа свободно
ЕСЛИ снизу свободнo
При данной программе РОБОТ поступает следующим образом: сперва РОБОТ проверяет свободна ли клетка справа или снизу от него, если это так, то РОБОТ переходит к первому условию. По этому условию, пока у правой стороны клетки в которой находится РОБОТ нет стены, он продолжает двигаться вправо. Как только это условие перестанет выполняться, он переходит ко второму условию. Это условие аналогично первому, только теперь проверяется отсутствие стены у нижней стороны клетки.
Проанализировав эту программы приходим к выводу, что РОБОТ будет двигаться вправо или вниз, пока у него есть такая возможность. РОБОТ при данной программе никогда не разобьётся.
Видно, что существует всего 2 места, в которых робот может остановиться: нужная нам 6F и 6C. Робот может прийти в клетку 6С, только если он находится в области 2А:6С, количество клеток в этой области равно 15. Общее количество клеток лабиринта равно 36, следовательно, 36 − 15 = 21.
вверх | вниз | влево | вправо |
При выполнении любой из этих команд РОБОТ перемещается на одну клетку соответственно: вверх вниз
влево
вправо
Четыре команды проверяют истинность условия отсутствия стены у каждой стороны той клетки, где находится РОБОТ:
сверху свободно | снизу свободно | слева свободно | справа свободно |
выполняется, пока условие истинно.
выполняется команда1 (если условие истинно) или команда2 (если условие ложно)
В конструкциях ПОКА и ЕСЛИ условие может содержать команды проверки, а также слова И, ИЛИ, НЕ, обозначающие логические операции.
Если РОБОТ начнёт движение в сторону находящейся рядом с ним стены, то он разрушится и программа прервётся.
Сколько клеток лабиринта соответствуют требованию, что, начав движение в данной клетке и выполнив предложенную программу, РОБОТ уцелеет и остановится в закрашенной клетке (клетка F6)?
ПОКА снизу свободно ИЛИ справа свободно
ПОКА снизу свободно
ЕСЛИ справа свободно
Один из главных приёмов в решении этой задачи — проверять клетки группами, а не по одной.
При данной программе РОБОТ поступает следующим образом: сперва РОБОТ проверяет, свободна ли клетка справа или снизу от него. Если это так, то РОБОТ переходит к первому действию внутри цикла. В этом цикле пока у нижней стороны клетки, в которой находится РОБОТ, нет стены, он продолжает двигаться вниз. Как только это условие перестанет выполняться, он переходит ко второму действию внутри цикла. Второе действие, заключается в следующем: РОБОТ проверяет, есть ли стена у правой стороны клетки, в которой он находится, и если справа свободно, РОБОТ передвигается на одну клетку вправо. После чего возвращается к началу внешнего цикла.
Проанализировав эту программу, приходим к выводу, что РОБОТ будет двигаться вниз или вправо, пока у него есть такая возможность. РОБОТ при данной программе никогда не разобьётся.
Проверив все клетки по выведенному нами правилу движения РОБОТА выясняем, что число клеток, удовлетворяющих условию задачи, равно 30 (все клетки за исключением E1:F3).
На игровом поле находится робот
Выберите ОДНО из предложенных ниже заданий: 15.1 или 15.2.
15.1. Исполнитель Робот умеет перемещаться по лабиринту, начерченному на плоскости, разбитой на клетки. Между соседними (по сторонам) клетками может стоять стена, через которую Робот пройти не может. У Робота есть девять команд. Четыре команды — это команды-приказы:
вверх вниз влево вправо
При выполнении любой из этих команд Робот перемещается на одну клетку соответственно: вверх ↑, вниз ↓, влево ←, вправо →. Если Робот получит команду передвижения сквозь стену, то он разрушится.
Также у Робота есть команда закрасить, при которой закрашивается клетка, в которой Робот находится в настоящий момент.
Ещё четыре команды — это команды проверки условий. Эти команды проверяют, свободен ли путь для Робота в каждом из четырёх возможных направлений:
сверху свободно снизу свободно слева свободно справа свободно
Эти команды можно использовать вместе с условием «eсли», имеющим следующий вид:
Здесь условие — одна из команд проверки условия. Последовательность команд — это одна или несколько любых команд-приказов. Например, для передвижения на одну клетку вправо, если справа нет стенки, и закрашивания клетки можно использовать такой алгоритм:
если справа свободно то
В одном условии можно использовать несколько команд проверки условий, применяя логические связки и, или, не, например:
если (справа свободно) и (не снизу свободно) то
Для повторения последовательности команд можно использовать цикл «пока», имеющий следующий вид:
Например, для движения вправо, пока это возможно, можно использовать следующий алгоритм:
нц пока справа свободно
Выполните задание.
Робот находится в левом верхнем углу огороженного пространства, имеющего форму прямоугольника. Размеры прямоугольника неизвестны. Где-то посередине прямоугольника есть вертикальная стена, разделяющая прямоугольник на две части. В этой стене есть проход, при этом проход не является самой верхней или самой нижней клеткой стены. Точное расположение прохода также неизвестно. Одно из возможных расположений стены и прохода в ней приведено на рисунке (робот обозначен буквой «Р»):
Напишите для Робота алгоритм, перемещающий робота в правый нижний угол прямоугольника (см. рисунок):
Алгоритм должен решать задачу для произвольного размера поля и любого допустимого расположения стен внутри прямоугольного поля. При исполнении алгоритма Робот не должен разрушиться. Алгоритм может быть выполнен в среде формального исполнителя или записан в текстовом редакторе. Сохраните алгоритм в формате программы Кумир или в текстовом файле. Название файла и каталог для сохранения Вам сообщат организаторы экзамена.
Robocode
Хабрасообщество поддержало идею написания обзоров игр для программистов, поэтому я продолжаю эту серию статей. Напомню, в прошлый раз я рассказал Вам про игры Colobot и Ceebot.
Сегодня Вы узнаете про отличную игру Robocode. Она предназначена для продвинутому обучения Java, и имеет большие функциональные возможности, несмотря на кажущуюся внешнюю простоту.
Robocode — это обучающая игра с открытыми исходными кодами, разработанная Mathew Nelson и Flemming Larsen. Ее единственной целью было облегчение изучения языка программирования Java.
Основным движущим элементом в обучении должна была стать конкуренция. Каждый участник пишет код на Java, который управляет небольшим танчиком, и сражается с другими такими же танками.
Ваша цель — уничтожить все остальные танки на поле. Без компромиссов. Ваш танк должен достичь абсолютного превосходства, и показать какие жалкие неудачники Ваши друзья.
Разработчики настоятельно обращают Ваше внимание на то, что в Robocode нет крови, нет людей и нет политики. В игре есть взрывы, но если Вы заботитесь о собственном психическом здоровье — их можно легко отключить.
Естественно, какой-либо простой стратегии для выигрыша нет. Существует огромное количество различных тактик, у каждой из которых есть свои преимущества и недостатки. Размер кода у различных танков колеблется от десятка строк до нескольких тысяч. Некоторые даже умудряются прибегать к статистическому анализу и нейронному программированию.
Интересно подошли к написанию робота в СПБгУ ИТМО. Танк был разработан с использованием SWITCH-технологий(смесь автоматного и объектно-ориентированного программирования) и к проекту прилагается серьезная проектная документация.
Вы можете скачать ее и исходные коды танка абсолютно бесплатно на странице проекта.
Установка игры
На официальном сайте проекта находится огромное количество различных материалов. Если Вы хотите начать обучение — это лучшее место для старта.
Сама игра распространяется в виде jar-архива, который можно скачать со страницы скачивания игры.
Игра кроссплатформенная, так как она написана на Java. В нее можно играть на Windows, Linux, FreeBSD и в любой другой системе, на которую портирована Java-машина.
Перед установкой игры не забудьте установить Java.
Ваш первый робот
Готовы к созданию своего первого робота? Я уверен это будет легко, занимательно и просто интересно!
Создать робота очень просто. Но сделать его победителем — нет.
Встроенный редактор
Разработчики включили в игру собственный редактор. Поэтому у Вас уже есть готовая среда для разработки с подсветкой синтаксиса.
Вуаля! Теперь Вы видите набросок кода Вашего будущего робота.
Примечание: Если Вы хотите использовать Eclipse или другую IDE, то без труда найдете соответствующее руководство по интеграции с Robocode в Интернете.
Новый робот
В самом простом виде код должен выглядеть так:
// Используем пакет с Вашими инициалами. Это сделано для избежания конфликтов имен.
package v673;
// Указывает Java, что мы собираемся использовать объекты Robocode в нашей программе.
import robocode.*;
// Указывает Java: «Класс, описываемый ниже, является расширением класса Robot.
// И называется MyFirstRobot».
public class MyFirstRobot extends Robot
<
// Игры вызывает метод run(), когда начинается битва.
public void run()
<
// Здесь идет непосредственно код Вашего робота.
// Существует и другие методы, которые мы рассмотрим позже.
>
Пора уже что-нибудь делать!
Давайте заставим нашего робота что-нибудь делать. Добавьте в метод run() следующие строчки:
// while (true) означает то, что код в скобках будет выполнятся до тех пор, пока игра не прервется.
while ( true )
<
// Робот проедет вперед на 100 пикселей.
ahead(100);
// Робот повернет свою пушку на 360 градусов.
turnGunRight(360);
// Робот вернется назад на 100 пикселей.
back(100);
// Робот снова повернет свою пушку на 360 градусов.
turnGunRight(360);
// После чего код начинает выполняться снова.
>
Наш робот будет выполнять эти действия снова и снова, пока не умрет. Неплохо, да?
Огонь!
Когда радар танка находит вражеский робот, мы начинаем стрелять:
Как Вы можете заметить, в функцию отправляется объект ScannedRobotEvent, который содержит информацию о вражеском(или дружеском) роботе — сколько у него здоровья, где он находится, с какой скоростью передвигается и т.д.
Но так как у нас простой робот — мы не будем уделять этому много времени.
Компилирование робота
Запустите битву, нажав Start Battle.
Анатомия робота
Только что мы создали собственного робота. Давайте теперь чуть более подробно рассмотрим конструктивные особенности танков.
Танк состоит из трех частей: тело танка, пушка и радар.
Каждая из этих частей может двигаться независимо друг от друга. Медленнее всего движется танк, пушка движется быстрее, а радар является самым быстрым элементом робота.
Поле битвы
Поле битвы представляет из себя прямоугольник. Причем его размер устанавливается при создании битвы.
Заметьте, что даже если Вы выполните ahead(50000), команда остановит свое выполнение в тот момент, когда робот врежется в стену.
В RoboWiki Вы можете более подробней ознакомиться с игровой физикой.
Угол отклонения
Иногда удобно использовать относительный угол. Например, для поворота к другому роботу можно использовать следующую команду:
То есть getBearing() указывает на сколько градусов нужно отклонится от текущего положения, чтобы увидеть, к примеру, вражеский танк.
Примечание: Если Вы передадите в функцию turnRight() отрицательное значение, то робот повернется влево.
Чувства робота
Нет, мы не будем говорить о ранимой душе танка. Мы рассмотрим функции, по которым робот может узнавать влияние внешних факторов.
На основе этих функций построены все роботы в Robocode. Более подробно ознакомится со всеми функциями можно в API-документации.
Что дальше?
Больше всего учебного материала собрано на официальном сайте игры.
К сожалению, русских материалов про Robocode не так и много. Но я надеюсь, что английский язык для Вас не сильно большая проблема.
Рекомендую ознакомится с курсом по Robocode от Mark Whitley: CS 3230 — Robocode Project. Кстати, есть коллективный русский перевод благодаря проекту translated.by. Но он, к сожалению, еще не оформлен в отдельный PDF-файл, отсутствуют картинки. Поэтому я, на данный момент, советую изучать оригинал.
На RoboWiki собрано огромное количество высококачественного материала про RoboCode. Начиная от простых руководств, и заканчивая разъяснением различных тонких моментов.
Кроме того, на официальном сайте Вы найдете множество ссылок на другие отличные статьи про Robocode.
Можете даже ознакомится со статей про использование генетических алгоритмов в RoboCode.
В репозитории RoboCode находится огромное количество различных роботов. К некоторым выложены исходные коды.
Существует официальный блог разработчиков: robo-code.blogspot.com.
На этом наш обзор я бы хотел закончить.
Если Вам интересны мои статьи, то существует хак, позволяющий читать их до релиза на хабрахабре: подписаться на мой блог, ну или на твиттер.
Желаю успехов в постижении тонкостей Robocode!
На игровом поле находится робот
Выберите ОДНО из предложенных ниже заданий: 15.1 или 15.2.
15.1 Исполнитель Робот умеет перемещаться по лабиринту, начерченному на плоскости, разбитой на клетки. Между соседними (по сторонам) клетками может стоять стена, через которую Робот пройти не может. У Робота есть девять команд. Четыре команды — это команды-приказы:
вверх вниз влево вправо
Ещё четыре команды — это команды проверки условий. Эти команды проверяют, свободен ли путь для Робота в каждом из четырёх возможных направлений:
сверху свободно снизу свободно слева свободно справа свободно
Эти команды можно использовать вместе с условием «если», имеющим следующий вид:
Здесь условие — одна из команд проверки условия. Последовательность команд — это одна или несколько любых команд-приказов. Например, для передвижения на одну клетку вправо, если справа нет стенки, и закрашивания клетки можно использовать такой алгоритм:
если справа свободно то
В одном условии можно использовать несколько команд проверки условий, применяя логические связки и, или, не, например:
если (справа свободно) и (не снизу свободно) то
Для повторения последовательности команд можно использовать цикл «пока», имеющий следующий вид:
Например, для движения вправо, пока это возможно, можно использовать следующий алгоритм:
нц пока справа свободно
На бесконечном поле есть горизонтальная и вертикальная стены. Правый конец горизонтальной стены соединён с верхним концом вертикальной стены. Длины стен неизвестны. В каждой стене есть ровно один проход, точное место прохода и его ширина неизвестны. Робот находится в клетке, расположенной непосредственно под горизонтальной стеной у её левого конца. На рисунке указан один из возможных способов расположения стен и Робота (Робот обозначен буквой «Р»).
Напишите для Робота алгоритм, закрашивающий все клетки, расположенные непосредственно ниже горизонтальной стены и левее вертикальной стены. Проходы должны остаться незакрашенными. Робот должен закрасить только клетки, удовлетворяющие данному условию. Например, для приведённого выше рисунка Робот должен закрасить следующие клетки (см. рисунок).
При исполнении алгоритма Робот не должен разрушиться, выполнение алгоритма должно завершиться. Конечное расположение Робота может быть произвольным. Алгоритм должен решать задачу для любого допустимого расположения стен и любого расположения и размера проходов внутри стен. Алгоритм может быть выполнен в среде формального исполнителя или записан в текстовом редакторе. Сохраните алгоритм в текстовом файле.
15.2 Напишите программу, которая в последовательности натуральных чисел определяет максимальное число, кратное 5. Программа получает на вход количество чисел в последовательности, а затем сами числа. В последовательности всегда имеется число, кратное 5. Количество чисел не превышает 1000. Введённые числа не превышают 30 000. Программа должна вывести одно число — максимальное число, кратное 5.
Пример работы программы:
Входные данные | Выходные данные |
3 10 25 12 | 25 |
15.1 Следующий алгоритм выполнит требуемую задачу.