Реализация второго уровня сложности игры Змейка(начало)

Реализация игры Змейка на втором уровне сложности является продолжением первого уровня сложности. Поэтому мы продолжаем дорабатывать уже существующий проект.

Начнем доработку с класса game. Для этого перейдем в файл game.java.

В первую очередь добавим новые свойства класса к уже имеющемуся свойству mas:

// Двумерный массив для хранения игрового поля

public int[][] mas;

// Текущее направление движения

public int napr;

// Координаты головы змейки

private int gX, gY;

// Количествоочков

public int kol;

Голова змейки будет перемещаться в четырех возможных направлениях, поэтому понадобится переменная:

// Текущее направление движения

private int napr;

Условимся, что каждое из четырех направлений будет обозначаться цифрой от 0 до 3 (0 –влево, 1 –вверх, 2 –вправо, 3 –вниз). Для хранения позиции головы змейки в массиве введем еще две переменные:

// Координаты головы змейки

private int gX, gY;

Это номер строки в массиве gY и номер элемента в строке gX.

Для хранения набранных очков добавим переменную:

// Количество очков

public int kol;

Далее добавим несколько строчек в метод start(), который выполняет начальный запуск игры:

// Запускигры (Старт)

public void start()

{

//Заполняем весь массив нулями

for (int i = 0; i < 30; i++) {

for (int j = 0; j < 30; j++) {

mas[i][j] = 0;

}

}

//Начальное направление - влево

napr = 0;

//Количество очков

kol = 0;

//Записываем в переменные координаты головы змейки

gX = gY = 15;

//Создаем начальную змейку с длиной три ячейки

mas[15][15] = 1;

//Формируем первый объект для поедания змейкой

make_new();

}

Зададим начальное направление движения змейки – влево:

//Начальное направление - влево

napr = 0;

Начальное количество очков обнуляем:

//Количество очков

kol = 0;

Координаты головы змейки (номер строки в массиве и номер элемента в строке массива) устанавливаем15:

//Записываем в переменные координаты головы змейки

gX = gY = 15;

В класс gameнужно добавить новый методperemGolova(),который будет отвечать за перемещение головы змейки. Голова змейки отмечена в массиве значением "единица": 1. Перемещение головы змейки сводится к перемещению единицы в массиве, а на прежнее место следует помещать нулевое значение. Единица будет перемещаться в массиве в зависимости от направления движения головы змейки. При перемещении необходимо учитывать выход за границы игрового поля. В этом случае голова змейки должна появляться с противоположной стороны. Для решения этих задач добавим новый метод:

// Перемещение головы змейки

public void peremGolova()

{

//Сразу удаляем голову змейки из текущей ячейки

mas[gY][gX] = 0;

// Если текущее направление влево

if (napr == 0)

{

if ((gX - 1) >= 0)

gX--;

else

gX = 29;

}

// Если текущее направление вверх

else if (napr == 1)

{

if ((gY - 1) >= 0)

gY--;

else

gY = 29;

}

// Если текущее направление вправо

else if (napr == 2)

{

if ((gX + 1) <= 29)

gX++;

else

gX = 0;

}

// Если текущее направление вниз

else if (napr == 3)

{

if ((gY + 1) <= 29)

gY++;

else

gY = 0;

}

// Если съеден объект

if (mas[gY][gX]==-1)

{

// Генерируем новый объект для поедания

make_new();

// Увеличиваем количество очков на 10

kol += 10;

}

//Помещаем голову змейки в новую позицию

mas[gY][gX] = 1;

}

Нам известно положение головы змейки в массиве благодаря переменным gY,gX. На текущем месте головы змейки записываем нулевое значение:

// Сразу удаляем голову змейки из текущей ячейки

mas[gY][gX] = 0;

Далее при помощи условной конструкции рассматриваем четыре возможных текущих направления движения змейки:

// Если текущее направление влево

if (napr == 0)

{

}

// Если текущее направление вверх

else if (napr == 1)

{

}

// Если текущее направление вправо

else if (napr == 2)

{

}

// Если текущее направление вниз

else if (napr == 3)

{

}

Если направление движения влево, то выполнится следующий код:

if ((gX - 1)> = 0)

gX--;

else

gX = 29;

Если текущее значениеgXлибо -1, либо больше или равно нулю, то мы не выходим за пределы массива и можно смело уменьшить значение переменной gXна единицу. В противном случае, мы уже выходим за границы массива влево, и голова змейки должна появиться с крайней правой стороны.Поэтому помещаем в переменную gX значение 29. Номера строк массива и позиций в строке массива лежат от 0 до 29 включительно!Используя похожую схему,рассматриваем варианты для трех других направлений движения. Очень удобно зарисовать на бумаге массив, проставить номера строк и номера позиций в строке и рассматривать каждую ситуацию на рисунке,глядя на программный код. Тогда понимание станет более ясным.

Проверяем, что голова змейки перемещается в ячейку с объектом для поедания, такой объект отмечен значением "минус единица" в массиве: -1.

// Если съеден объект

if (mas[gY][gX]==-1)

{

// Генерируем новый объект для поедания

make_new();

// Увеличиваем количество очков на 10

kol += 10;

}

Если объект съеден, то создаем новый объект для поедания с помощью метода make_new()и увеличиваем количество очков на10.

В самом конце метода помещаем единицу в новую позицию головы змейки:

// Помещаем голову змейки в новую позицию

mas[gY][gX] = 1;

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

На этом программный код класса game для второго уровня сложности готов и полностью выглядит так:

public class game

{

// Двухмерный массив для хранения игрового поля

public int[][] mas;

// Текущее направление движения

public int napr;

// Координаты головы змейки

private int gX, gY;

// Количествоочков

public int kol;

// Конструктор класса

public game()

{

//Создаем новый массив 30x30

mas = new int[30][30];

}

// Генерация нового объекта в случайном месте

private void make_new()

{

//Глухой (бесконечныйцикл)

while(true)

{

// Получаем случайные значения x,y от 0 до 29

int x = (int)(Math.random()*30);

int y = (int)(Math.random()*30);

// Если в этом месте массива нулевое значение

// то помещаем туда объект для поедания змейкой

// и прерываем цикл

if (mas[y][x]==0)

{

mas[y][x] = -1;

break;

}

}

}

// Запуск игры (Старт)

public void start()

{

//Заполняем весь массив нулями

for (int i = 0; i < 30; i++) {

for (int j = 0; j < 30; j++) {

mas[i][j] = 0;

}

}

//Начальное направление - влево

napr = 0;

//Количество очков

kol = 0;

//Создаем начальную змейку с длиной три ячейки

mas[15][15] = 1;

//Записываем в переменные координаты головы змейки

gX = gY = 15;

//Формируем первый объект для поедания змейкой

make_new();

}

// Перемещение головы змейки

public void peremGolova()

{

//Сразу удаляем голову змейки из текущей ячейки

mas[gY][gX] = 0;

// Если текущее направление влево

if (napr == 0)

{

if ((gX - 1) >= 0)

gX--;

else

gX = 29;

}

// Если текущее направление вверх

else if (napr == 1)

{

if ((gY - 1) >= 0)

gY--;

else

gY = 29;

}

// Если текущее направление вправо

else if (napr == 2)

{

if ((gX + 1) <= 29)

gX++;

else

gX = 0;

}

// Если текущее направление вниз

else if (napr == 3)

{

if ((gY + 1) <= 29)

gY++;

else

gY = 0;

}

// Если съеден объект

if (mas[gY][gX]==-1)

{

// Генерируем новый объект для поедания

make_new();

// Увеличиваем количество очков на 10

kol += 10;

}

//Помещаем голову змейки в новую позицию

mas[gY][gX] = 1;

}

}

Наши рекомендации