Нахождение пути
Здрасте!Delphi-мой первый язык(после паскаля).Но щас я прогаю на Blitz3D.
В технаре мы опять изучаем делфи.Надо сделать нахождение пути. Кодить я не пробовал,но алгоритм такой: есть два двумерых массива.В 1(первом) хранятся координаты точек,во 2(втором) - координаты точек-препятсятвий. Если щелкнуть по фирме,то если кооординаты = координате одной из точек из 1 массива,то удалить ее из первого и занести во второй,перекрасить в синий цвет.Нажимаешь кнопку,из одной точки в другую(точки заданы с самого начала в проге).... короче проверяешь:если X=координате синей точки,то обходим.... сам механизм обхода я сделаю...мне интересно,нет ли у кого идей как ЛУЧШЕ и ПРОЩЕ сделать создание препятсятвий? вопще предлагайте свои алгоритмы. |
Re: Нахождение пути
а не легче зделать один 2д масив ?
и в нем если переменая = 0 то ето пустая клетка если = 1 то ето препядствие если там = 2 то ето что-то другое ... :) ps. лутчий алгоритм - A* imho или волновой по карте вейпоинтов :) |
Re: Нахождение пути
астар на делфи есть?
а как определять у какой именно точки значение 0 или 1? ************ вот решил все-таки написать код.Должна рисоваться диагональ из кубиков,но почему-то не рисуется ( Кто знает почему?В чем ошибка? Сам код запускается без ошибок ) unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); procedure FormDblClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a:array[1..10,1..10] of byte; i,x,y:byte; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin //Присваиваем X и У начальные значения x:=0; y:=0; //Забиваем в массив Х-координаты for i:=1 to 10 do begin a[1,i]:=x+20; a[2,i]:=y+20; end; end; procedure TForm1.FormDblClick(Sender: TObject); begin //Берём координаты из массива //и рисуем квадратики с синей штриховкой for i:=1 to 10 do begin Canvas.Brush.Color := clBlue; Canvas.Brush.Style := bsBDiagonal; Canvas.Rectangle(a[1,i],a[2,i],20,20); end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin //Берём координаты из массива //и рисуем квадратики с красной штриховкой for i:=1 to 10 do begin Canvas.Brush.Color := clBlue; Canvas.Brush.Style := bsBDiagonal; Canvas.Rectangle(a[1,i],a[2,i],20,20); end; end; end. |
Re: Нахождение пути
Цитата:
2. Не ресуется потому что у тебя все значения в масиве равны 20 и координаты у ректангла тоже тоесть координаты первой точки ты берешь из масива (а они равны 20) и координаты второи точки прямоугольника у тебя тоже 20. ты внемательнее посмотри параметры у ректангла... Код:
unit Unit1; |
Re: Нахождение пути
да,я знаю,я уже сам исправил.делаю квадрат из 10х10 квадратов.Когда массив сост. из 10,все работает,ставишь больше не работает,вот код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); procedure FormDblClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a:array[1..10,1..10] of byte; i,x,y,n,l:integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin l:=20;//ширина и высота кубика //Присваиваем X и У начальные значения x:=0; y:=0; //Забиваем в массив Х и Y-координаты for i:=1 to 10 do begin x:=x+l; y:=y+l; a[1,i]:=x; a[2,i]:=y; end; end; procedure TForm1.FormDblClick(Sender: TObject); begin //Берём координаты из массива //и рисуем квадратики с синей штриховкой for n:=1 to 10 do begin for i:=1 to 10 do begin Canvas.Brush.Color := clblue; Canvas.Brush.Style := bsFDiagonal; Canvas.Rectangle(a[1,n],a[2,i],a[1,n]+l,a[2,i]+l); end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin //Берём координаты из массива //и рисуем квадратики с красной штриховкой for n:=1 to 10 do begin for i:=1 to 10 do begin Canvas.Brush.Color := clred; Canvas.Brush.Style := bsBDiagonal; Canvas.Rectangle(a[1,n],a[2,i],a[1,n]+l,a[2,i]+l); end; end; end; end. |
Re: Нахождение пути
брррр... народ
обычно юзают так masive [ x,y ] := status; или если у вас кубики произвольного размера то masive [ id] := cube_class; ну всмысле через классы надо делать (как ето в делфи называется то ... ) а то у вас бред какой то который даже продвинутый прогер не поймет сразу :) |
Re: Нахождение пути
да не,как делать по твоему методу я вроде понял....
у меня не получается...короче,если массив создать не 10 на 10,а например 10 на 20... |
Re: Нахождение пути
неполучается всмысле ? не рисуется чтоли ? :)
|
Re: Нахождение пути
первые 100 нормально,а потом идет наслоение одих на другие.
|
Re: Нахождение пути
Я опять исправил сам свою ошибку.оказывается я просто забыл поменять тип массива с
byte на integer ) Распознавание препятствий я начал делать так,как предложил jimon,но я не знаю как в делфи получить X и Y координаты мышки ( Кто знает? Вот код,может еще где-нить ошибся,или можно сделать попроще,чем я,посмотрите plz: Цитата:
|
Re: Нахождение пути
есть какое событие как onMouseMove там есть X и Y мыши.....
|
Re: Нахождение пути
точно.
|
Re: Нахождение пути
Я решил делать не с MouseMove(),а с MouseDown().Переменные X и Y описаны в функции.
но при компилировании выходят ошибки: "For loop control variable must be simple local variable",несоответствие типов. причем указывает он на "Y>=a[2,n]".Если бы дествительно было бы несоответсявие типов,он бы на X ругался... Короче я в замешательстве,че он ругается? Код: Цитата:
|
Re: Нахождение пути
В условиях необходима ставить скобки
Код:
... |
Re: Нахождение пути
ок.
|
Часовой пояс GMT +4, время: 20:47. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot