Змейка

Рекомендованный уровеньуровень
5+
Длинное змееобразное существо ползает по ограниченному полю, подчиняясь приказам игрока (право, лево, вниз, вверх). И нет никакой возможности остановить его движение. Только бы не коснуться краев поля, иначе гибель! Только бы не укусить себя, иначе… ну вы поняли. На пути у существа попадается еда, от которой оно становится ещё длиннее. От роста ему становиться всё теснее, и теснее, и теснее… Стоп машина! …Вы, вероятно, узнали в описанной выше шуточной драме сценарий знаменитой игры «Змейка». Эта игрушка берёт своё начало в 70-х годах прошлого столетия. Именно тогда она впервые появилась на аркадных автоматах. А в 21-м столетии её популяризатором выступила компания Nokia, которая предустанавливала «Змейку» едва ли не во все свои мобильные телефоны. Между этими двумя вехами были версии для Commodore VIC-20, MS-DOS, ZX Spectrum, Windows, Mac OS… Если вы залезете в Play Маркет или Apple Store, то, скорее всего, найдёте пару десятков вариантов различных «Змеек». Сложно представить себе платформу, на которой не было бы собственного варианта «Змейки». Почему так? Дело в том, что с одной стороны, это интересная игра, которая отлично помогает скоротать время. С другой стороны, «Змейку» достаточно просто создать самостоятельно. Давайте убедимся в этом сами, и напишем собственную версию приключений растущего пресмыкающегося на Java. Мы на JavaRush уже расписали все шаги, которые помогут начинающему игроку справиться с такой задачей без проблем. Вперёд!
Комментарии (330)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
SkyNet
Уровень 28
3 ноября, 19:10
Кто объяснит почему при выражении "return ((part.x==gameObject.x) && (part.y==gameObject.y))?true:false;" и "if ((part.x == gameObject.x) && (part.y == gameObject.y)) { return true;" }логика змейки меняется? Код всей функции: public boolean checkCollision(GameObject gameObject) { for (GameObject part:snakeParts) { // return ((part.x==gameObject.x) && (part.y==gameObject.y))?true:false; if ((part.x == gameObject.x) && (part.y == gameObject.y)) { return true; } } return false; }
Илья
Уровень 30
11 августа, 22:03
идея вообще не видит плагинБ что делать?
25 июля, 17:18
як зробить змейку 2 задачу питкажить.
Уляна Біла
Уровень 14
18 июля, 18:28
Не до конца понимаю что делает this в Этом примере :
private void createGame(){
        drawScene();
        Apple apple = new Apple(7,7);
        apple.draw(this);
    }
mka
Уровень 5
19 июля, 08:24
он передаёт ссыль на текущий объект класса Game
jar5000
Уровень 26
16 июля, 13:43
Предлагаю к Вашему вниманию свою реализацию Змейки. Тут все довольно просто, нужно съесть 20 яблочек, однако игра ускоряется с каждой секундой. Не теряйте времени зря!!! Бананы и грушиы помогут немного замедлить игру и набрать больше очков. Так же вы можете выходить ЗА границы уровня. А ещё, в игре присутстсвует скрытая концовка :) Змейка
Eddy Z
Уровень 37
30 июня, 23:57
Во время проверки возникла ошибка An error occurred: APP_PUBLISH_ERROR Что это значит?
S1ndr0m
Уровень 23
1 мая, 17:23
Нет отображения счета при игре в браузере. При запуске из Идеи все отображается. Как это можно пофиксить?
LuneFox System Administrator в BIFIT Expert
4 мая, 19:25
Можешь увеличить поле и вписывать цифры с информацией в клетки. Можешь выводить счёт в конце игры через сообщение.
S1ndr0m
Уровень 23
21 мая, 17:53
Можешь подробнее написать про первый вариант? Вывод в конце игры не так презентабелен 😞, да и два сообщения, одно под другим написать не получается. Один метод затирает другой, так как в этих методах нет параметров положения по x,y.
LuneFox System Administrator в BIFIT Expert
22 мая, 19:59
В первом случае увеличь размер поля при инициализации игры, и для самой игры задействуй, например, все клетки, кроме верхнего ряда или нескольких рядов, а эти ряды сделай чёрным и пиши туда любой текст, по одной букве на клеточку (можешь посмотреть мою змейку, я там так сделал). Во втором случае просто используй шрифт поменьше и используй перенос строки, выведи две строки одна под другой.
S1ndr0m
Уровень 23
22 мая, 21:15
я пробовал через перенос строки делать, но получается все равно в одну строку.
showMessageDialog(Color.NONE, "Game Over. \n Ваши очки " + score, Color.RED, 50);
Или нужно другим способом переносить(каким)?
LuneFox System Administrator в BIFIT Expert
22 мая, 23:26
Да нет, так и должно быть. У меня всё переносится через \n. Правда почему у тебя цвет фона и цвет шрифта перепутаны, непонятно. Рисуешь прозрачным по красному. У тебя точно нет второго метода, который выводит всё в одну строку нормальными цветами и перебивает этот?
S1ndr0m
Уровень 23
23 мая, 15:42
Вот я поэтому и затупил, вроде делаю правильно, но получается не то что нужно. По поводу цвета фона и цвета текста должно быть правильно: прозрачный фон и красный шрифт. вот вырезка из лекции
3. Диалоговые окна

В конце игры игроку нужно сообщить о победе или поражении. Для этого и других случаев у игрового движка JavaRush есть специальный метод
void showMessageDialog(Color cellColor, String message, Color textColor, int textSize), который выводит на игровой экран диалоговое окно с сообщением message. Параметры этого метода такие:

    cellColor – цвет фона диалогового окна
    message – текст сообщения
    textColor – цвет текста сообщения
    textSize – размер текста сообщения

Диалоговое окно закрывается само, если пользователь нажал пробел или кликнул по нему мышкой.
Cам метод проигрыша такой, никаких лишних методов тоже нет. Пробовал писать один метод за другим, но тогда второй перекрывает первый, независимо от размера шрифта
private void gameOver() {
        stopTurnTimer();
        isGameStopped = true;
        showMessageDialog(Color.BLACK, "Game Over." + " \n Ваши очки " + score, Color.RED, 50);
    }
LuneFox System Administrator в BIFIT Expert
23 мая, 16:28
А, да, действительно, подзабыл уже порядок аргументов. В любом случае, я вывожу сообщения в этом диалоге построчно через \n и у меня всё работает... В браузере тоже такое же поведение? Может это локально в ОС так обрабатывается?
S1ndr0m
Уровень 23
24 мая, 19:04
хмм... а вот тут ты меня заставил задуматься. Игру ведь можно перевыложить спустя 23 дня? Или действуют такие же правила как на задачки, пару дней на исправления, а дальше она блокируется как завершенная? Потому, что я сейчас перезалил на сайт игру, а вывод при Game Over'e
Game Over
А не как у меня
"Game Over." + " \n Ваши очки " + score
И еще вопрос: влияет ли версия jdk как-то? Я сейчас на вот этом сижу.
LuneFox System Administrator в BIFIT Expert
25 мая, 08:53
Тут такая тема, что игры в браузере кэшируются. Чтобы увидеть обновлённую игру, надо почистить кэш сайта. Игры можно обновлять через любое количество времени, я так и делаю, они не являются задачами из основного курса :) Не думаю, что версия JDK как-то влияет на результат, если ты используешь синтаксис Java 8. Если ты будешь использовать неподдерживаемые движком методы, javarush забракует твой результат ещё на этапе проверки/запуска задачи - например, если будешь использовать треды или фишки языка выше версии 8.
S1ndr0m
Уровень 23
25 мая, 15:57
Огромное спасибо! Почистил кэш и игра стала нормально отображаться на сайте. Правда небольшой минус нужно подобрать размер шрифта, т.к. размер фона не регулируется в методе. Осталось додумать как в реальном времени выводить изменение счета.
Вадим Аверин
Уровень 23
28 апреля, 14:37
snake = new Snake(WIDTH/2,HEIGHT/2);
я так понимаю здесь просто деление на 2 делается?
LuneFox System Administrator в BIFIT Expert
4 мая, 19:26
Да.
Innokentiy Kosicyn
Уровень 21
1 апреля, 20:45
ребят подскажите пж у меня символы UTF-16 не отображаются на маке при запуске игры, что делать? Уже и голова и яблоко и змейка должны отрисоваться по идее
AsVAN
Уровень 45
Expert
2 апреля, 19:40
использовать символы UTF-8
19 марта, 13:09
Привет, подскажите как сделать так, что бы символы при замене их на что то другое, к ним не применялся цвет в intellij idea, например беру голову поросенка или тыквы или любую другую, она становится черная, так как по условие пока она жива цвет черный? В опубликованной игре все хорошо.