Народ, кто может помогите.
Пишу всем известную игру "Змейка".
ВОПРОС:Как реализовать увеличение змейки, при поедании нею например появляющегося произвольно квадратика, – хотел делать через списки.
Уже есть начало кода, но не могу понять как реализовать увеличение змеии.
Кто может помогите реализовать это через списки, или через что то другое (например массив ну и тп.).
21 января 2009 в 12:01
Ну я так и делал только пункт 3 если посомтришь слегка оптимизировал. И только так как я писал прогу пол часика гдето, то графику я не делал, у меня грубые прямоугольники а не щарики.
21 января 2009 в 9:02
Я ваще как делал:
1. по таймеру змейка двигалась
2. движение организовывалось так: голова по направлению, на место головы 2-й шарик, на место 2-го 3-й и т д….
3. как только голова змейки по координатам становилась равна с яблочком, тогда сдвигаем голову по направлению, 2-й на место головы и т д… и добавляем еще один шарик на место хвоста…
4. При таком движении каждый шарик будет повторять движение предыдущих…. воть
21 января 2009 в 1:03
КАроче делать было нечего, дело было вечером…. сижу скучно, вот и написал: кидаете на форму таймер с тайсером 300. и этот код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure gameover;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
tmove=(mleft,mright,mup,mdown);
const
max_x=20;
max_y=20;
var
Form1: TForm1;
mass:array[0..100] of tpoint;
count:byte;
map:array[0..max_x+1,0..max_y+1] of byte;
can:tbitmap;
colors:array[-1..1] of tcolor;
dx,dy:integer;
point:Tpoint;
move:TMove;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin
count:=1;
mass[1].X:=1;
mass[1].Y:=1;
can:=tbitmap.Create;
can.Width:=width;
can.Height:=height;
can.PixelFormat:=pf32bit;
can.Canvas.Brush.Style:=bsSolid;
can.Canvas.Brush.Color:=clred;
colors[-1]:=clred;
colors[0]:=cllime;
colors[1]:=clblack;
dx:=width div max_x;
dy:=Height div max_y;
point.X:=2;
point.Y:=1;
move:=mdown;
for i:=2 to max_x do
for j:=2 to max_y do
begin
if(random(10)=0) then
map[i,j]:=1
else
map[i,j]:=0;
end;
end;
procedure tform1.gameover;
begin
timer1.Enabled:=false;
can.Canvas.Font.Size:=30;
can.canvas.Font.Color:=clred;
can.canvas.TextOut(100,100,'GAME OVER');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var i,j:integer;
begin
for i:=0 to max_x-1 do
for j:=0 to max_y-1 do
begin
can.canvas.Brush.Style:=bsSolid;
can.Canvas.Brush.Color:=colors[map[i+1,j+1]];
can.Canvas.FillRect(rect(i*dx,j*dy,i*dx+dx,j*dy+dy));
end;
can.Canvas.Brush.Color:=clgray;
mass[0]:=mass[1];
case move of
mleft:begin
mass[0].X:=mass[0].X-1;
if mass[0].X=0 then gameover;
end;
mright:begin
mass[0].X:=mass[0].X+1;
if mass[0].X+1=max_x then gameover;
end;
mup:begin
mass[0].Y:=mass[0].Y-1;
if mass[0].Y=0 then gameover;
end;
mdown:begin
mass[0].Y:=mass[0].Y+1;
if mass[0].Y+1=max_y then gameover;
end;
end;
if (point.X=mass[0].x) and (point.Y=mass[0].Y) then
begin
count:=count+1;
repeat
point.X:=random(max_x)+1;
point.Y:=random(max_y)+1;
until map[point.X,point.Y]=0;
end;
if map[mass[0].X,mass[0].Y]=1 then gameover;
for i:=count downto 1 do
begin
mass[i]:=mass[i-1];
can.Canvas.FillRect(rect(mass[i].X*dx-dx,mass[i].Y*dy-dy,mass[i].X*dx,mass[i].Y*dy));
end;
can.Canvas.Brush.Color:=clBlue;
can.Canvas.FillRect(rect(point.X*dx-dx,point.Y*dy-dy,point.X*dx,point.Y*dy));
Canvas.Draw(1,1,can);
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case key of
38: move:=mup;
40: move:=mdown;
37: move:=mleft;
39: move:=mright;
end;
end;
end.
Усе, змейка готова. Мелоче не считал.
21 января 2009 в 1:03
ах да еще в онкреат надо randomize приписать….
20 января 2009 в 23:04
Про змейку.
Есть у тебя ГОЛОВА змейки (голова списка) и ХВОСТ, т.е. всё что после головы Управляется только голова. Когда змейка "съедает" яблоко, ты добавляешь в список ещё один элемент, тем самым удлиняя хвост змейки. При перемещении головы, координаты её обновляются, а старые её координаты переходят к первому за ней элементу хвоста, те в свою очередь (которые у этого элемента были) к следующему элементу хвоста и т.д. пока список не закончится. Остаётся только отрисовывать твою змейку на плоскости и сравнивать координаты, пробегая по списку, на предмет столкновения его с головой змейки, на чём жизнь её заканчивается. Всё просто.
20 января 2009 в 23:04
Если хочешь делать не список, а массив, то придумай какой нибудь признак конца хвоста и делай тоже самое, но уже с массивом. Массив можно взять длинной n*m, где n и m – ширина и высота поля по которому ползает змейка.
20 января 2009 в 23:01
автор можешь скинуть свои исходники?
а то мне больно интересно как это все происходит… чот вообще не пойму про какие вы тут списки говорите..
20 января 2009 в 23:01
Читая это, Вы можете изменить свою жизнь!Это изменило мою жизнь.
Зайдя как обычно на один из форумов, на которых я обитаю, я обнаружил эту статью, в которой говорится что можно сделать тысячи долларов за 2-3 недели при вложении всего 180 рублей.Первым что пришло мне в голову было 'очередной наеб',но я всё же решил попробовать…
Никаких уловок.Таким образом выходило,что кроме 180 рублей(пустячок:)я ничего не теряю.Я решил попробовать.И угадайте что?!За 7 дней на мой кошелёк стали приходить деньги!Я был в шоке!Но сразу же подумал что на этом всё и закончится.Но не тут то было!В первую неделю я получил 23$,к концу второй недели уже 200$…к середине 3-й недели 990$!!!Уже 4-я неделя и я уже насчитал 2990 $ и сумма продолжает расти!!!И это все только за цену в 180рублей!!!Я не поверил, что это работает пока не начал получать первые деньги…Я осуществил свою давнюю мечту, купил компьютер за 5000$ и на этом останавливаться не собираюсь.Моя жизнь сразу изменилась в лучшую сторону.Чего и вам желаю!А теперь я расскажу Вам, как это работает и самое главное ПОЧЕМУ!Я вам обещаю, что если вы будете в точности соблюдать ниже перечисленные инструкции,то вы начнете получать намного больше денег,чем вы думали,не прилагая к этому особых усилий.Предложение:Прочтите это пару раз!!!Следуйте инструкциям и деньги начнут поступать на ваш кошелёк. Согласитесь это просто!!!Это легально. И ваш вклад составляет всего 180 рублей.
ВАЖНО:Это не обман и это не незаконно при этом вы ничем не рискуете, но это РАБОТАЕТ!
ЗАМЕТЬТЕ:Следуйте инструкциям в ТОЧНОСТИ и 10 000$ и больше будут вашими в течении от 20 до 60 дней.Всё это удачно работает благодаря честности участников.Вот те самые 3 шага к успеху:
1.Для начала нужно иметь yandex-кошелек в системе денежных переводов.Если у вас ещё нет такого кошелька, то открыть его очень просто только надо желание заработать реальные деньги. Хорошенько ознакомьтесь с данной системой, как она работает, выберите оптимальный для себя вариант пополнения кошелька.(в любом терминале для оплыт мобильной связи)
2.Отправьте на все номера из ниже перечисленных с первого по шестого yandex-кошельков по 30 рублей,а в последнем кошельке при пополнении в поле (ПРИМЕЧАНИЕ) напишите: 'Пожалуйста, внесите меня в список yandex кошельков'.Всё, что Вы сделали это создали некую услугу и самое главное это абсолютно легально.Вы просите законный сервис, за который платите.(Главное соблюдай инструкцию и всё получится).
После пополнения следующих кошельков (в каждый по 30рублей):
1. 41001835366834
2. 41001310878260
3. 41001324295818
4. 41001324310237
5. 41001323894036
6. 41001323890115
Вычеркните из этого списка первый кошелёк, переместив тем самым список на одну строку выше (6 становится 5, 5 становится 4…..)И впишите в 6-тую строчку Ваш кошелёк, затем скопируйте статью с вашим кошельком на 6й строке и смело распространяйте её.
3. Главное сохраните главную идею. Разместите эту статью на не менее чем 200 форумах и бесплатьных досках объявлений хотя я пока разместил только на 70 форумах но,запомните, чем больше вы разместите,тем выше будет ваш доход и этот доход будет на прямую зависеть от вас.Этот бизнес в самой стадии развития и будет,продолжает существовать и процветать только благодаря честности и серьезности участников.Итак,когда вы достигните первой позиции вы будите иметь тысячи долларов просто как создатель списка! Это стоит 6$ и совсем пустяковой работы!
Займитесь этим сейчас – не откладывая на завтра….!
20 января 2009 в 23:01
Время деньги!
А теперь я вам расскажу, почему вы в любом случае ничего не теряете, а только выигрываете!
Скажем, из 200 размещений я получу только 5 ответов (очень низкая цифра). Значит, я получу 5 $, находясь на 6 позиции в списке. Теперь эти 5 людей делают, опять же, МИНИМУМ 200 размещений с моим кошельком на 5 позиции,, и только 5 людей отвечают тем первым 5 – это уже 25$. Дальше эти 25 людей делают по 200 размещений с моим кошельком на 4 строчке и только 5 отвечают – мой доход 125$. Теперь эти 125 людей размести и получив только по 5 ответов дают мне 625$ прибыли (я на 3 позиции).
Дальше смешнее: эти 625 делают по минимум 200 размещений со мною на 2 строчке и только 5 людей отвечают – это 3125$. Самое интересное это то что эти 3125 людей сделают еще по 200 размещений, ну а если им ответят только 5 людей то я уже получаю 15625$. Не так ли внушительная цифра? И это всё за первоначальный вклад в 6$. Когда вас в списке уже нет, вы просто высылаете 6 $ и тем людям из списка и ставите свой кошелёк на 6 позицию и опять размещаете. Вы себе можете представить, что тысячи людей со всего мира присоединяются к Интернету и читают эти статьи каждый день. Так же как и вы сейчас читаете эту!!!
Так что? Потратите ли вы 6 $ что бы узнать работает ли это???
Это строка для пессимистов: А если этот бизнес рухнет, и никто мне денег не пришлет???
Ну и что!!! Каждый день в Интернете появляются от 20000 до 50000 новых пользователей.
По прогнозам специалистов только в России к 2006 году количество пользователей интернета увеличится с нынешних 9 млн. пользователей до 21 млн!!!какие шансы что они все-таки захотят попробовать себя в чем-то новом?
Ну и последнее: Это действительно великая аксиома – чтобы получить что-то надо дать что-то, а что бы получить еще больше надо дать еще больше! Убедитесь в этом сами…
Удачи всем!!!
Ну и напоследок о том как распространять информацию в форумах.
1. Открываем поисковик rambler(.)ru (или любой другой)
2. Пишем в строке поиска фразу: «начать новую тему » (без кавычек)
3. Поисковик найдет тысячи страниц, ссылки на которые сразу приводят на формуляр для заполнения новой темы форума.
27 декабря 2008 в 22:03
Кто нить знает как в компоненте JvHLEditor сделать так чтобы как и в Delphi вылазил листбокс после точки или другого определенного символа.
15 декабря 2008 в 6:05
Всё просто. Хранишь координаты змейки в списке. Управляешь началом змейки и затираешь конец (когда надо увеличить, не затираешь), соответственно при затирании удаляешь из списка хвост, а когда увеличиваешь змейку – добавляешь элемент в список. Таким образом, получается тип списка очередь.
14 декабря 2008 в 16:02
Антон RichDad Кононов в списке.
14 декабря 2008 в 14:02
На чем змейка то пишешь?
Я на 2 курсе змейку писал в качестве курсовой. Все на Делфи стандартными средствами. Много времени потратил на восстановление картинки на заднем фоне за змейкой и не успел половниы из того, что хотел реализовать. Вывод: не заморачивайся на мелочах.
14 декабря 2008 в 13:03
в чем хранишь координаты? в массиве или списке?
14 декабря 2008 в 12:04
2Денис spam Пискунов:
что у тебя уже есть? какие возможности реализованы? движение есть? сколько квадратиков может у тебя двигаться?
14 декабря 2008 в 12:04
Антон RichDad Кононов , движение реализовано. Для удобства я пока двигаю один квадратик, но двигал три максимум.
Начата работа со списком, но вот тут и проблема получилась.
14 декабря 2008 в 1:03
Я думаюИльяс iLPoint Галлямов имеет ввиду алгоритм работы змейки
14 декабря 2008 в 1:03
ага
14 декабря 2008 в 1:02
У массива ограничение по заданному объему.
Д Список может содержать
1 Ссылку на предыдущи эл.
2 одрес у
3 адрес х
4 следующии элемент списка
по ссылкам и переходиш.
по массиву дож не знаю
у тя тип массива должен быть своим.
var zmey : array[1..10,1..2] of byte
14 декабря 2008 в 1:01
ну ходит вправо, влево, вверх, вниз. Как обычная змейка.
14 декабря 2008 в 1:01
Через список. это у тя в списке находится адресс квадратика?
то надо использовать динамические списки. при съедании добавляешь новы элемент списка.
оператор nеw
14 декабря 2008 в 1:01
ага эт я понял. токо а как его потом все это добавить к всей змеии, и управлять уже несколькими.
Слы а может через массив проще? То как?
14 декабря 2008 в 1:00
Как ходит твая змейка?
14 декабря 2008 в 0:04
А как змейка у тя работает? (надо больше данных)
14 декабря 2008 в 0:04
Ильяс iLPoint Галлямов всмысле как?