Реализация второго уровня сложности игры Змейка(начало)
Реализация игры Змейка на втором уровне сложности является продолжением первого уровня сложности. Поэтому мы продолжаем дорабатывать уже существующий проект.
Начнем доработку с класса 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;
}
}