Срочно нужны исходники игры Lines , это которая шарики и все такое.. Сам сделал процентов на 40 , но хотелось бы еще увидеть ваши варианты, может быть у кого то уже есть эта игра?
Плиз мне тоже оч нужны! а то не знаю по какому алгоритму проверять соответствия что бы это было не очень ресурсо ёмко!
Какие такие соответствия?
Ну ээ... может я не правильно понимаю игру lines Там вроде в ряд должно совпасть и я говорю о проверки совпало или нет =) Наверное я чего-то путаю
Проверить совпало или нет очень просто. Идешь по строкам-столцам-диагоналям да проверяешь. Примерно так:
//не проверял
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;
Не чень мне понятно:
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;
Да и как сделать что бы после нажатия на шарик он мог вставать только на пустой квадрат К КОТОРОМУ НЕ ЗАКРЫТ ПУТЬ? Оч интерестно =\
Этот способ не самый оптимальный, но летать будет даже на Поиске.
-----
Дело в том что игру разрабатываю не для PC , а для GP2X(да есть такая вещь) =) И хочется опитимизировать хорошенько чтобы мощности и для эффектов+музыки осталось =Р
Так как на счёт второго вопроса? "Да и как сделать что бы после нажатия на шарик он мог вставать только на пустой квадрат К КОТОРОМУ НЕ ЗАКРЫТ ПУТЬ? Оч интерестно =\" Без этого у меня игра не получится =(
О! Пасиба за идею , мне она тоже потребуется... а все таки? каких нить заготовок нет ни у кого?
Присоединяюсь ибо не понимаю как опредилить закрыт ли путь к клетке? (см. мой предидущий вопрос) Оч надо срочно =(
Блин звучит разумно только не очень понятно =( Можно что ли рисунок не большой? Или код ?
Короче тебе в любом случае надо не только узнавать, можно ли дойти до клетки, но и находить, собственно, сам путь.
Вот тебе урла: http://www.firststeps.ru/theory/karta.html
Вот оттуда картинка:
На пальцах: ставим в начальную клетку нолик. Теперь в каждую пустую клетку, соседствующую с ноликом, ставим единицу. Теперь в каждую пустую клетку, соседствующую с одной из единиц, ставим двойку и т.д.
Для волны заведем дополнительный массив, чтобы не путать числа волны с цветом шариков, и заполним его минус единицами изначально.
По окончании "волн" число в клетке будет обозначать минимальное количество ходов до нее.
Так вот. Когда юзер клацает на шарике, который надо мувать, ты пускаешь такую "волну" до упора, и запоминаешь ее. Потом, когда юзер клацнул в клетку, в которую надо перейти - смотришь, дошла ли туда волна. Если волна не дошла - значит, нельзя туда попасть. Если же дошла - нам надо восстановить путь. Делаем это с конца. Пусть в целевой клетке стоит число 14 (как на картинке). Это значит, что мы дошли туда за 14 "волн". И это значит, что где-то рядом стоит число 13! Перебираем четырех соседей, идем туда, где 13. Теперь то же самое: где-то рядом есть 12, идем туда. Теперь дальше: где-то рядом есть 11. Видим, что есть 2 клетки, в которых 11 - не страшно, идем в любую, ведь любая из них достижима из начальной за 11 ходов. И так далее.
Хм да это уже понятнее =) Надо только код сформулировать Попробую если не получистя ещё приду!
Приходи, приходи
Блин чё то я не врубаюсь как код сделать! Хелп!
Ну как это - не врубаешься? Идею понял? Понял. Значит врубишься ;)
Сделай массивы x, y: array[1..100] of integer, и n: integer - счетчик, который будет обозначать количество пронумерованных клеток. Идешь по массиву, обрабатываешь.
Или гугли "волновой алгоритм" - кода там полно
Хм можно всё же пример ни как не получается =( В гугле тоже батва всякая вылезает =( Пожалуйста оч надо! Ну никак не пойму как это реализовать хотя идею вроде понял
У меня вопрос по проверки приведённой тобой! Значит ты проверяеш спереди, снизу и между? Значит диогональ может совпасть только если она идёт от начала и вниз =( Или я чего-то не понимаю?
Опа, действительно бага.
Надо добавить еще одно направление, по другой диагонали
Да ещё на счёт Inc(len); я не понял это типа len= len+1 ?
Угу
Как бы переделать получше код?
Разберись и сразу поймешь ;)
Так что ли?
const dx: array[0..2] of integer = (1, 1, 0,-1);
const dy: array[0..2] of integer = (0, 1, 1,-1);
const dx: array[0..2] of integer = (1, 1, 0,-1);
const dy: array[0..2] of integer = (0, 1, 1,-1);
О дело идёт к концу жду не дождусь когда скажу тебе огромное спасибо =)
Люди! Помогите с волновым алгоритмом! ПЛZ!Уже второй день мучаюсь ! есть массив 9x9 есть точка х1у1 с которой начинать отсчет и точка ху до которой надо дойти.... как мне его сделать ??? функцией если можно.... мои наработки вот :
function volna(a:mas; x1,y1,x,y:integer):integer;
var b:mas; i,j:integer; ni,nk:integer; rez:integer;
begin
ni:=0;nk:=81;rez:=0;
for i:=1 to 9 do
for j:=1 to 9 do begin
if a[i,j]=0 then b[i,j]:=254;
if a[i,j]>0 then b[i,j]:=255;
if (i=x1) and (j=y1) then b[i,j]:=253;
if (i=x) and (j=y) then b[i,j]:=0;
end;
repeat
for i:=1 to 9 do begin
for j:=1 to 9 do begin
if b[i,j]=ni then begin
if b[i+1,j]=254 then b[i+1,j]:=ni+1;
if b[i+1,j]=253 then begin volna:=1;exit;end;
if b[i-1,j]=254 then b[i-1,j]:=ni+1;
if b[i-1,j]=253 then begin volna:=1;exit;end;
if b[i,j+1]=254 then b[i,j+1]:=ni+1;
if b[i,j+1]=253 then begin volna:=1;exit;end;
if b[i,j-1]=254 then b[i,j-1]:=ni+1;
if b[i,j-1]=253 then begin volna:=1;exit;end;
end;
end;inc(ni);
end;
until ni<=nk;
end;