singlepost

Помогите с исходником Делфи ! ! ! << На главную или назад  

Народ, кто может помогите.
Пишу всем известную игру "Змейка".
ВОПРОС:Как реализовать увеличение змейки, при поедании нею например появляющегося произвольно квадратика, – хотел делать через списки.
Уже есть начало кода, но не могу понять как реализовать увеличение змеии.

Кто может помогите реализовать это через списки, или через что то другое (например массив ну и тп.).

36 ответов в теме “Помогите с исходником Делфи ! ! !”

  1. 25
    Ренат Юсупов ответил:

    Ну я так и делал только пункт 3 если посомтришь слегка оптимизировал. И только так как я писал прогу пол часика гдето, то графику я не делал, у меня грубые прямоугольники а не щарики.

  2. 24
    Андрей Щипцов ответил:

    Я ваще как делал:
    1. по таймеру змейка двигалась
    2. движение организовывалось так: голова по направлению, на место головы 2-й шарик, на место 2-го 3-й и т д….
    3. как только голова змейки по координатам становилась равна с яблочком, тогда сдвигаем голову по направлению, 2-й на место головы и т д… и добавляем еще один шарик на место хвоста…
    4. При таком движении каждый шарик будет повторять движение предыдущих…. воть

  3. 23
    Ренат Юсупов ответил:

    КАроче делать было нечего, дело было вечером…. сижу скучно, вот и написал: кидаете на форму таймер с тайсером 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.
    Усе, змейка готова. Мелоче не считал.

  4. 22
    Ренат Юсупов ответил:

    ах да еще в онкреат надо randomize приписать….

  5. 21
    Deleted Deleted ответил:

    Про змейку.
    Есть у тебя ГОЛОВА змейки (голова списка) и ХВОСТ, т.е. всё что после головы :) Управляется только голова. Когда змейка "съедает" яблоко, ты добавляешь в список ещё один элемент, тем самым удлиняя хвост змейки. При перемещении головы, координаты её обновляются, а старые её координаты переходят к первому за ней элементу хвоста, те в свою очередь (которые у этого элемента были) к следующему элементу хвоста и т.д. пока список не закончится. Остаётся только отрисовывать твою змейку на плоскости и сравнивать координаты, пробегая по списку, на предмет столкновения его с головой змейки, на чём жизнь её заканчивается. Всё просто.

  6. 20
    Deleted Deleted ответил:

    Если хочешь делать не список, а массив, то придумай какой нибудь признак конца хвоста и делай тоже самое, но уже с массивом. Массив можно взять длинной n*m, где n и m – ширина и высота поля по которому ползает змейка.

  7. 19
    Андрей Соломонов ответил:

    автор можешь скинуть свои исходники? :)
    а то мне больно интересно как это все происходит… чот вообще не пойму про какие вы тут списки говорите.. :)

  8. 18
    Антон Пердышкин ответил:

    Читая это, Вы можете изменить свою жизнь!Это изменило мою жизнь.
    Зайдя как обычно на один из форумов, на которых я обитаю, я обнаружил эту статью, в которой говорится что можно сделать тысячи долларов за 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$ и совсем пустяковой работы!
    Займитесь этим сейчас – не откладывая на завтра….!

  9. 17
    Антон Пердышкин ответил:

    Время деньги!
    А теперь я вам расскажу, почему вы в любом случае ничего не теряете, а только выигрываете!
    Скажем, из 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. Поисковик найдет тысячи страниц, ссылки на которые сразу приводят на формуляр для заполнения новой темы форума.

  10. 16
    Саня Уракбаев ответил:

    Кто нить знает как в компоненте JvHLEditor сделать так чтобы как и в Delphi вылазил листбокс после точки или другого определенного символа.

  11. 15
    Александр Тамбовский ответил:

    Всё просто. Хранишь координаты змейки в списке. Управляешь началом змейки и затираешь конец (когда надо увеличить, не затираешь), соответственно при затирании удаляешь из списка хвост, а когда увеличиваешь змейку – добавляешь элемент в список. Таким образом, получается тип списка очередь.

  12. 14
    Денис Пискунов ответил:

    Антон RichDad Кононов в списке.

  13. 13
    Руслан Шамюнов ответил:

    На чем змейка то пишешь?
    Я на 2 курсе змейку писал в качестве курсовой. Все на Делфи стандартными средствами. Много времени потратил на восстановление картинки на заднем фоне за змейкой и не успел половниы из того, что хотел реализовать. Вывод: не заморачивайся на мелочах.

  14. 12
    Антон Кононов ответил:

    в чем хранишь координаты? в массиве или списке?

  15. 11
    Антон Кононов ответил:

    2Денис spam Пискунов:
    что у тебя уже есть? какие возможности реализованы? движение есть? сколько квадратиков может у тебя двигаться?

  16. 10
    Денис Пискунов ответил:

    Антон RichDad Кононов , движение реализовано. Для удобства я пока двигаю один квадратик, но двигал три максимум.
    Начата работа со списком, но вот тут и проблема получилась.

  17. 9
    Владимир Сургай ответил:

    Я думаюИльяс iLPoint Галлямов имеет ввиду алгоритм работы змейки

  18. 8
    Ильяс Галлямов ответил:

    ага

  19. 7
    Ильяс Галлямов ответил:

    У массива ограничение по заданному объему.
    Д Список может содержать
    1 Ссылку на предыдущи эл.
    2 одрес у
    3 адрес х
    4 следующии элемент списка

    по ссылкам и переходиш.

    по массиву дож не знаю
    у тя тип массива должен быть своим.
    var zmey : array[1..10,1..2] of byte

  20. 6
    Денис Пискунов ответил:

    ну ходит вправо, влево, вверх, вниз. Как обычная змейка.

  21. 5
    Ильяс Галлямов ответил:

    Через список. это у тя в списке находится адресс квадратика?
    то надо использовать динамические списки. при съедании добавляешь новы элемент списка.
    оператор nеw

  22. 4
    Денис Пискунов ответил:

    ага эт я понял. токо а как его потом все это добавить к всей змеии, и управлять уже несколькими.

    Слы а может через массив проще? То как?

  23. 3
    Ильяс Галлямов ответил:

    Как ходит твая змейка?

  24. 2
    Ильяс Галлямов ответил:

    А как змейка у тя работает? (надо больше данных)

  25. 1
    Денис Пискунов ответил:

    Ильяс iLPoint Галлямов всмысле как?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.