Готовый java код змейка андроид

Пишем змейку для Android (Часть 1)

Всем привет! Сегодня мы начнем писать змейку для Android.

После достаточно долгого перерыва решил написать еще парочку статей. Дело в том, что владелец одного из сайтов смежной тематики предложил мне написать пару статей для его ресурса. Статьи должны были быть на тему создания какойнить простой игры. Я подумал и решил сделать змейку. Игра простая, но достаточно любопытная! Правда потом адрес владельца этого ресурса у меня куда-то потерялся, а вот сама игрушка осталась. Решил собственно осветить процесс. Игра написана без применения моего движка, так что эту серию статеек можно читать в отрыве от всего остального!

Ну, приступим! Для начала давайте разберемся что такое змейка, в чем смысл этой игры и пр. Значит по экрану устройства бегает изгибающаяся колбаса (собственно змейка!) кушает некие объекты на экране, съев объект начинает расти не по дням а по часам, столкнувшись сама с собой или с каким-то препятствием змея благополучно умирает :(. Возможны различные уровни сложности (ускоряется сама змея или появляется больше препятствий на ее пути). Управлять этой штукой я думаю лучше всего посредством акселерометра.

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

Начнем пожалуй с реализации логики самого приложения. Для этого опишем вот такой класс SnakeGame- который есть ни что иное, как реализация логики самой игры.

Что мы тут имеем? Начнем с вложенного класса pos. Это просто позиция — два целых числа x и y. Затем имеются константы направлений — ну и собственно сама переменная, в которой хранится направление — mDirection. А самое главное здесь у нас имеется два основных компонента змейки. Перовое (сама змейка) — массив mSnake двумерные координаты каждого сегмента змейки. Второе — само игровое поле mField — двумерный массив, каждый элемент массива кодирует одну клетку игрового поля: -1 это клетка в которой находится змея; 0 — это клетка в которой ничего нет, а 2 — это клетка в которой есть фрукт. Есть так же возможность использовать код 1 — в качестве стенки, но это так, задел на будущее :-).

Конструктор этого класса ничем не примечателен, в конструкторе очищается игровое поле, задается начальное положение змейки. А так же с помощью метода addFruite() добавляется один фрукт на игровое поле. Сам метод тоже ничем не примечателен.

По сути в том классе есть только один достаточно большой метод, разобраться с которым надо поподробнее. Это nextMove() — возвращающий true — если змея может двигаться дальше в направлении указанном в переменной mDirection. Прежде всего определяется в каком именно направлении должна двигаться змейка, затем для каждого направления проверяются такие параметры как «не упрется ли змея в стену», «не съест ли она фрукт», и если съест, то как именно будет расти дальше. В случае, если все проверки прошли удачно, то возвращается истина, если нет, то ложь. В коде достаточно подробно откомментировано каждое действие. Думаю не составит особого труда разобраться что к чему.

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

Читайте также:  Хороший барометр для андроид

Итак, для этой activity я сделал два разных файла разметки. Первый файл содержит всего одну кнопку, а второй — надписи и кнопку. Вот скриншоты:

А вот сам код класса:

Как видно из кода, мы загружаем файл разметки при показе Actvity и в зависимости от того, что находится в переменной GAME_MODE — файлы разметки разные.

Ну пожалуй хватит на сегодня. В следующий раз будем разбираться с отрисовкой.

Если у Вас есть вопросы или комментарии пишите на мыло или оставляйте в комментах.

Источник

Своя игра: создаём собственную «Змейку»

Работы на 10 минут, а удовольствия на целый день.

Не так давно мы разбирали, как искусственный интеллект учится играть в змейку. А теперь мы сами сделаем такую игру, чтобы ей могли насладиться обычные люди. Что нам понадобится:

  • HTML, чтобы можно было играть прямо в браузере;
  • CSS для украшений;
  • JavaScript для самой игры.

Логика игры

У классической змейки правила простые:

  • есть поле из клеточек, где случайным образом появляется еда;
  • есть змейка, которая всё время двигается и которой мы можем управлять;
  • если змейка на своём пути встречает еду — еда исчезает, появляется в новом месте, а сама змейка удлиняется на одну клеточку;
  • если змейка врежется в стену или в саму себя, игра заканчивается.

Чтобы играть было проще, мы сделаем так, чтобы змейка не врезалась в стенки, а проходила сквозь них. Если что — сможете это сами потом настроить в коде, когда захотите посложнее.

Последовательность наших действий будет такой:

  1. Делаем пустую HTML-страницу.
  2. Настраиваем внешний вид с помощью CSS.
  3. Рисуем игровое поле.
  4. Пишем скрипт, который и будет отвечать за всю игру.

Делаем HTML-страницу

С этим всё просто: берём стандартный код и сохраняем его как файл snake.html .

Это даст нам пустую страницу, которую мы сейчас немного настроим стилями.

Настраиваем внешний вид

За внешний вид на странице у нас отвечает раздел

Источник

Java Snake

last modified July 20, 2020

In this part of the Java 2D games tutorial, we create a Java Snake game clone. Source code and images can be found at the author’s Github Java-Snake-Game repository.

Snake

Snake is an older classic video game. It was first created in late 70s. Later it was brought to PCs. In this game the player controls a snake. The objective is to eat as many apples as possible. Each time the snake eats an apple its body grows. The snake must avoid the walls and its own body. This game is sometimes called Nibbles.

Development of Java Sname game

The size of each of the joints of a snake is 10 px. The snake is controlled with the cursor keys. Initially, the snake has three joints. If the game is finished, the «Game Over» message is displayed in the middle of the board.

First we will define the constants used in our game.

The B_WIDTH and B_HEIGHT constants determine the size of the board. The DOT_SIZE is the size of the apple and the dot of the snake. The ALL_DOTS constant defines the maximum number of possible dots on the board (900 = (300*300)/(10*10)). The RAND_POS constant is used to calculate a random position for an apple. The DELAY constant determines the speed of the game.

These two arrays store the x and y coordinates of all joints of a snake.

In the loadImages() method we get the images for the game. The ImageIcon class is used for displaying PNG images.

In the initGame() method we create the snake, randomly locate an apple on the board, and start the timer.

If the apple collides with the head, we increase the number of joints of the snake. We call the locateApple() method which randomly positions a new apple object.

In the move() method we have the key algorithm of the game. To understand it, look at how the snake is moving. We control the head of the snake. We can change its direction with the cursor keys. The rest of the joints move one position up the chain. The second joint moves where the first was, the third joint where the second was etc.

Читайте также:  Use volume keys android

This code moves the joints up the chain.

This line moves the head to the left.

In the checkCollision() method, we determine if the snake has hit itself or one of the walls.

If the snake hits one of its joints with its head the game is over.

The game is finished if the snake hits the bottom of the board.

This is the main class.

The setResizable() method affects the insets of the JFrame container on some platforms. Therefore, it is important to call it before the pack() method. Otherwise, the collision of the snake’s head with the right and bottom borders might not work correctly.

Figure: Snake

Источник

Как написать свою змейку на Java за 15 минут

Авторизуйтесь

Как написать свою змейку на Java за 15 минут

В предыдущей статье мы писали сапёра за 15 минут, теперь займёмся классической змейкой.

В этот раз нам снова понадобятся:

  • 15 минут свободного времени;
  • Настроенная рабочая среда, т.е. JDK и IDE (например Eclipse);
  • Библиотека LWJGL (версии 2.x.x) для работы с Open GL. Обратите внимание, что для LWJGL версий выше 3 потребуется написать код, отличающийся от того, что приведён в статье;
  • Спрайты, т.е. картинки самой змеи и фрукта, который она будет есть. Можно чисто символически нарисовать самому, или скачать использовавшиеся при написании статьи.

Подключение библиотек

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

Во-вторых, у многих пользователей InteliJ IDEA возникли проблемы как раз с их подключением. Я нашёл в сети следующий видеогайд:

После того, как я сделал всё в точности по нему, у меня библиотеки подключились корректно и всё заработало.

Работа с графикой

С этой стороны наша задача мало отличается от той, что мы выполняли при написании Сапёра. Снова создаём класс GUI, который будет хранить и обновлять состояние всех графических элементов. Если точнее:

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

Как вы можете видеть, здесь я уже использовал несколько констант. Для них был создан отдельный класс Constants с public static полями. Вот он целиком:

Enum Sprite , который отвечает за подгрузку текстур, полностью идентичен тому, что мы писали для Сапёра, за исключением того, что нам нужно только две текстуры — для змеи и для ягод. Вот код:

Механика игры

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

Несложно подсчитать, что каждая лампочка должна гореть столько тиков, какова длина «змеи». Значит, мы должны сообщить клетке, в которую попадает змея, что она должна гореть определённое количество секунд, а каждый тик уменьшать это число у каждой клетки с ненулевым таймером, и менять спрайт, если змея из клетки уже выползла (т.е. таймер стал равен нулю). В случае же необходимости удлинить цепочку, достаточно просто не уменьшать время «горения» клеток на каком-то тике. Именно поэтому метод update() у классов Cell и GUI принимает параметр — если он равен false , значит, змея что-то съела.

Пишем класс клетки

Добавляем геттер и сеттер для состояния клетки поля в GUI

Добавляем метод, создающий начальное поле в GUI

Просто инициализируем OpenGL, затем массив Cell[][] cells и заполняем последний клетками со случайным полем state .

Источник

IT-DO / GameSnake.java

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

Читайте также:  Детские смарт часы для андроида
package com.gamesnake ;
import java.awt.* ;
import java.awt.event.* ;
import javax.swing.* ;
import java.util.* ;
public class GameSnake <
// game constants
final String TITLE_OF_PROGRAM = » Classic Game Snake » ;
final String GAME_OVER_MSG = » GAME OVER » ;
final int POINT_RADIUS = 20 ; // in pix
final int FILLED_WIDTH = 30 ; // in point
final int FILLED_HEIGHT = 20 ; // in point
final int FILLED_DX = 6 ;
final int FILLED_DY = 28 ;
final int START_LOCATION = 200 ;
final int START_SNAKE_SIZE = 6 ;
final int START_SNAKE_X = 10 ;
final int START_SNAKE_Y = 10 ;
final int SHOW_DEALAY = 150 ;
final int LEFT = 37 ;
final int UP = 38 ;
final int RIGHT = 39 ;
final int DOWN = 40 ;
final int START_DIRECTION = RIGHT ;
final Color DEFAULT_COLOR = Color . blue;
final Color FOOD_COLOR = Color . green;
final Color POISON_COLOR = Color . red;
Snake snake;
Food food;
// Poison poison;
JFrame frame;
Canvas canvasPanel;
Random random = new Random ();
boolean gameOver = false ;
public static void main ( String [] args ) <
new GameSnake () . go();
>
void go () <
frame = new JFrame ( TITLE_OF_PROGRAM + » : » + START_SNAKE_SIZE );
frame . setDefaultCloseOperation( JFrame . EXIT_ON_CLOSE );
frame . setSize( FILLED_WIDTH * POINT_RADIUS + FILLED_DX , FILLED_HEIGHT * POINT_RADIUS + FILLED_DY );
frame . setLocation( START_LOCATION , START_LOCATION );
frame . setResizable( false );
canvasPanel = new Canvas ();
canvasPanel . setBackground( Color . white);
frame . getContentPane() . add( BorderLayout . CENTER , canvasPanel);
frame . addKeyListener( new KeyAdapter () <
public void keyPressed ( KeyEvent e ) <
snake . setDirection(e . getKeyCode());
// System.out.println(e.getKeyCode());
>
>);
frame . setVisible( true );
snake = new Snake ( START_SNAKE_X , START_SNAKE_Y , START_SNAKE_SIZE , START_DIRECTION );
food = new Food ();
while ( ! gameOver) <
snake . move();
if (food . isEaten()) <
food . next();
>
canvasPanel . repaint();
try <
Thread . sleep( SHOW_DEALAY );
> catch ( InterruptedException e) <
e . printStackTrace();
>
>
>
class Snake <
ArrayList Point > snake = new ArrayList Point > ();
int direction;
public Snake ( int x , int y , int length , int direction ) <
for ( int i = 0 ; i length; i ++ ) <
Point point = new Point (x — i, y);
snake . add(point);
>
this . direction = direction;
>
boolean isInsideSnake ( int x , int y ) <
for ( Point point : snake) <
if ((point . getX() == x) && (point . getY() == y)) <
return true ;
>
>
return false ;
>
boolean isFood ( Point food ) <
return ((snake . get( 0 ) . getX() == food . getX()) && (snake . get( 0 ) . getY() == food . getY()));
>
void move () <
int x = snake . get( 0 ) . getX();
int y = snake . get( 0 ) . getY();
if (direction == LEFT )
if (direction == RIGHT )
if (direction == UP )
if (direction == DOWN )
if (x > FILLED_WIDTH — 1 )
if (x 0 )
if (y > FILLED_WIDTH — 1 )
if (y 0 )
gameOver = isInsideSnake(x,y); // check for cross itselves
snake . add( 0 , new Point (x,y));
if (isFood(food)) <
food . eat();
frame . setTitle( TITLE_OF_PROGRAM + » : » + snake . size());
> else <
snake . remove(snake . size() — 1 );
>
>
void setDirection ( int direction ) <
if ((direction >= LEFT ) && (direction DOWN )) <
if ( Math . abs( this . direction — direction) != 2 ) <
this . direction = direction;
>
>
>
void paint ( Graphics g ) <
for ( Point point : snake) <
point . paint(g);
>
>
>
class Food extends Point <
public Food () <
super ( — 1 , — 1 );
this . color = FOOD_COLOR ;
>
void eat () <
this . setXY( — 1 , — 1 );
>
boolean isEaten () <
return this . getX() == — 1 ;
>
void next () <
int x, y;
do <
x = random . nextInt( FILLED_WIDTH );
y = random . nextInt( FILLED_HEIGHT );
> while (snake . isInsideSnake(x,y));
this . setXY(x,y);
>
>
class Point <
int x,y;
Color color = DEFAULT_COLOR ;
public Point ( int x , int y ) <
this . setXY(x, y);
>
void paint ( Graphics g ) <
g . setColor(color);
g . fillOval(x * POINT_RADIUS , y * POINT_RADIUS , POINT_RADIUS , POINT_RADIUS );
>
int getX () <
return x;
>
int getY () <
return y;
>
void setXY ( int x , int y ) <
this . x = x;
this . y = y;
>
>
public class Canvas extends JPanel <
@Override
public void paint ( Graphics q ) <
super . paint(q);
snake . paint(q);
food . paint(q);
if (gameOver) <
q . setColor( Color . red);
q . setFont( new Font ( » Arial » , Font . BOLD , 38 ));
FontMetrics fm = q . getFontMetrics();
q . drawString( GAME_OVER_MSG , ( FILLED_WIDTH * POINT_RADIUS + FILLED_DX — fm . stringWidth( GAME_OVER_MSG )) / 2 , ( FILLED_HEIGHT * POINT_RADIUS + FILLED_DY ) / 2 );
>
>
>
>

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Оцените статью