Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2013, 15:41   #1
Agiliter
Новичок
Джуниор
 
Регистрация: 15.11.2013
Сообщений: 2
Вопрос Проверка на самопересечение в "Змейке"

Добрый день! Начал изучать Java, и взялся за написание змейки. По ходу дела возник вопрос как проверить, жива ли змейка. Логично создать два метода: один проверяет не вышла ли она за границы поля, а второй - не съела ли себя. В первом случае, просто проверяю не совпадает ли координата "головы" с границами. В духе
Код:
 if ((point.x==1)||(point.x==98)||(point.y==5)||(point.y==98)){
            snake.alive=false;
        }
Этот вариант кажется мне громоздким, но хоть работает и то ладно.

А вот как быть с проверкой на самопересечение? По идее, нужно сравнить положение головы с положением каждой части змейки. Но ведь частей много и координаты их неизвестны по сути (или я чего-то не понимаю). Змейка после инициализации по сути не рисуется, а стирается. На каждом шаге (если змейка не съела фрукт) голова движется на одну часть, а хвост стирается на одну часть. А в памяти хранится положение только головы. Змейка задается через обычный список (он громоздкий, поэтому скинул его без методов)
Код:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
 
package mainclass;
public class List            // Список
{
   private ListNode First;      // Первый элемент
   private ListNode Last;      // Последний элемент
   private ListNode Current;   // Текущий элемент
   private int Size;         // Кол-во элементов в списке
  
   public List()                  // Конструктор
   {
      First   = null;                  // Начальная инициализация
      Last   = null;                  //
      Current   = null;                  //
      Size   = 0;                  //
   }
  
   public int size()               // Возвращает размер списка
   {
      return Size;
   }
  
}
Как в цикле задать проверку координат головы с координатами каждой части? Что-то вроде:
Код:
for(int i =0; i<point.size(); i++){
            if ((point.x==snake[i].x){
                snake.alive=false;
            }
        }
Ну это так, примерно.

Может нужно задать змейку иначе, не через список? Но если через массив, то размер массива каждый раз увеличивать.. Помогите понять и разобраться. Может ошибка в логике?
Agiliter вне форума Ответить с цитированием
Старый 27.11.2013, 06:53   #2
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Могу предложить два варианта:
1. "Извращенный". Если змейка у тебя отрисовывается где либо, то ты можешь сравнить по цвету ячейки. В том же разделе что и проверка границы, только сверху еще одна проверка на цвет.
2. Перейти к варианту сохранения всей змейки. Для хранения всей змейки можно использовать ArrayList<Dimension>. Тогда не будет проблем с проверками.
BleStaR вне форума Ответить с цитированием
Старый 23.02.2014, 17:41   #3
kuro-obi
 
Регистрация: 22.02.2014
Сообщений: 3
По умолчанию

В дополнение к сказанному, могу предложить такое: сделать массив, размером в количество ячеек. Дальше сравнивать значение первого элемента - головы с остальными (например, пройтись циклом от третьего элемента(во вторую вы никогда не врежетесь) до последнего элемента змеи). Хотя, проверка на цвет, как по мне, удобнее.
kuro-obi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Подскажите с управлением в "Змейке". spamer Мультимедиа в Delphi 7 31.12.2008 12:18