IPB
ЛогинПароль:

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Хелп ми плиз With Lines
сообщение
Сообщение #1


Гость






Срочно нужны исходники игры Lines , это которая шарики и все такое.. Сам сделал процентов на 40 , но хотелось бы еще увидеть ваши варианты, может быть у кого то уже есть эта игра?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Плиз мне тоже оч нужны! а то не знаю по какому алгоритму проверять соответствия что бы это было не очень ресурсо ёмко!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Какие такие соответствия?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Ну ээ... lol.gif может я не правильно понимаю игру lines dry.gif Там вроде в ряд должно совпасть и я говорю о проверки совпало или нет =) Наверное я чего-то путаю
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Проверить совпало или нет очень просто. Идешь по строкам-столцам-диагоналям да проверяешь. Примерно так:


//не проверял

const dx: array[0..2] of integer = (1, 1, 0);
const dy: array[0..2] of integer = (0, 1, 1);

var a: array[1 .. 10, 1 .. 10] of integer; //поле: 0 если пусто, цвет шарика если шарик

...

procedure FindLines()

var will_delete[1 .. 10, 1.. 10] of boolean; //здесь будем отмечать все шарики, которые пропадут за ход
i, j, dir, k, len, color: integer;

begin

for i := 1 to 10 do
for j := 1 to 10 do
will_delete[i, j] := false;

for i := 1 to 10 do
for j := 1 to 10 do
for dir := 0 to 2 do begin //направление: вправо, по диаголи или вниз

len := 1;
color := a[i, j];
if color = 0 then
continue;

//идем по направлению, пока не вылезем за поле/не встретим другой цвет
while (i + len * dy[dir] <= 10) and (j + len * dx[dir] <= 10) and
(a[i + len * dy[dir], j + len * dx[dir]] = color) do
Inc(len);

if (len >= 5)
for k := 0 to len - 1 do
will_delete[i + k * dy[dir], j + k * dx[dir]] := true;

end;


for i := 1 to 10 do
for j := 1 to 10 do
if will_delete[i, j] then
a[i, j] := 0;

end;



Сообщение отредактировано: Michael_Rybak -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Не чень мне понятно:


for i := 1 to 10 do
for j := 1 to 10 do
for dir := 0 to 2 do begin //направление: вправо, по диаголи или вниз

len := 1;
color := a[i, j];
if color = 0 then
continue;

//идем по направлению, пока не вылезем за поле/не встретим другой цвет
while (i + len * dy[dir] <= 10) and (j + len * dx[dir] <= 10) and
(a[i + len * dy[dir], j + len * dx[dir]] = color) do
Inc(len);

if (len >= 5)
for k := 0 to len - 1 do
will_delete[i + k * dy[dir], j + k * dx[dir]] := true;

end;


И чего за dir ? Для чего он? Оргаментируй там каждую строчку плиз, а то я тупой очень(само критика рулит) =) И ты уверен что твой способ не ресурсо ёмкий? мои рамки сильно ограничены =(
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Да и как сделать что бы после нажатия на шарик он мог вставать только на пустой квадрат К КОТОРОМУ НЕ ЗАКРЫТ ПУТЬ? Оч интерестно =\
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата
И чего за dir ? Для чего он?

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

Потом делаем то же самое, но идем не вправо, а по диагонали. А потом - вниз. Переменная dir задает направление движения, определяемое смещением dy[dir], dx[dir]. Когда dir = 0, получается dx = 1, dy = 0, т.е. движемся вправо. И т.д.

Цитата

И ты уверен что твой способ не ресурсо ёмкий? мои рамки сильно ограничены =(

Этот способ не самый оптимальный, но летать будет даже на Поиске.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Этот способ не самый оптимальный, но летать будет даже на Поиске.
-----
Дело в том что игру разрабатываю не для PC , а для GP2X(да есть такая вещь) =) И хочется опитимизировать хорошенько чтобы мощности и для эффектов+музыки осталось =Р

Так как на счёт второго вопроса? "Да и как сделать что бы после нажатия на шарик он мог вставать только на пустой квадрат К КОТОРОМУ НЕ ЗАКРЫТ ПУТЬ? Оч интерестно =\" Без этого у меня игра не получится =(
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






О! Пасиба за идею , мне она тоже потребуется... а все таки? каких нить заготовок нет ни у кого?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Присоединяюсь ибо не понимаю как опредилить закрыт ли путь к клетке? (см. мой предидущий вопрос) Оч надо срочно =(
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата
хочется опитимизировать хорошенько
давай ты так сначала попробуешь, а там поговорим ;)

Цитата
К КОТОРОМУ НЕ ЗАКРЫТ ПУТЬ


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

В конце получится, что статус 1 имеют все достижимые клетки, 0 - остальные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Блин звучит разумно только не очень понятно =( Можно что ли рисунок не большой? Или код ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Короче тебе в любом случае надо не только узнавать, можно ли дойти до клетки, но и находить, собственно, сам путь.

Вот тебе урла: http://www.firststeps.ru/theory/karta.html

Вот оттуда картинка:

Изображение

На пальцах: ставим в начальную клетку нолик. Теперь в каждую пустую клетку, соседствующую с ноликом, ставим единицу. Теперь в каждую пустую клетку, соседствующую с одной из единиц, ставим двойку и т.д.

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

По окончании "волн" число в клетке будет обозначать минимальное количество ходов до нее.

Так вот. Когда юзер клацает на шарике, который надо мувать, ты пускаешь такую "волну" до упора, и запоминаешь ее. Потом, когда юзер клацнул в клетку, в которую надо перейти - смотришь, дошла ли туда волна. Если волна не дошла - значит, нельзя туда попасть. Если же дошла - нам надо восстановить путь. Делаем это с конца. Пусть в целевой клетке стоит число 14 (как на картинке). Это значит, что мы дошли туда за 14 "волн". И это значит, что где-то рядом стоит число 13! Перебираем четырех соседей, идем туда, где 13. Теперь то же самое: где-то рядом есть 12, идем туда. Теперь дальше: где-то рядом есть 11. Видим, что есть 2 клетки, в которых 11 - не страшно, идем в любую, ведь любая из них достижима из начальной за 11 ходов. И так далее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Хм да это уже понятнее =) Надо только код сформулировать mega_chok.gif Попробую если не получистя ещё приду!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Приходи, приходи smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Блин чё то я не врубаюсь как код сделать! Хелп!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Ну как это - не врубаешься? Идею понял? Понял. Значит врубишься ;)

Сделай массивы x, y: array[1..100] of integer, и n: integer - счетчик, который будет обозначать количество пронумерованных клеток. Идешь по массиву, обрабатываешь.

Или гугли "волновой алгоритм" - кода там полно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


Хм можно всё же пример ни как не получается =( В гугле тоже батва всякая вылезает =( Пожалуйста оч надо! Ну никак не пойму как это реализовать хотя идею вроде понял
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 85
Пол: Мужской
Реальное имя: max

Репутация: -  0  +


У меня вопрос по проверки приведённой тобой! Значит ты проверяеш спереди, снизу и между? Значит диогональ может совпасть только если она идёт от начала и вниз =( Или я чего-то не понимаю?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.10.2020 13:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name