Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Delphi

Ответ
 
Опции темы
Старый 16.11.2006, 19:40   #1
DarkKnight
Знающий
 
Регистрация: 09.11.2006
Сообщений: 256
Написано 2 полезных сообщений
(для 2 пользователей)
Сообщение Нахождение пути

Здрасте!Delphi-мой первый язык(после паскаля).Но щас я прогаю на Blitz3D.
В технаре мы опять изучаем делфи.Надо сделать нахождение пути.
Кодить я не пробовал,но алгоритм такой:
есть два двумерых массива.В 1(первом) хранятся координаты точек,во 2(втором) - координаты точек-препятсятвий.
Если щелкнуть по фирме,то если кооординаты = координате одной из точек из 1 массива,то удалить ее из первого и занести во второй,перекрасить в синий цвет.Нажимаешь кнопку,из одной точки в другую(точки заданы с самого начала в проге).... короче проверяешь:если X=координате синей точки,то обходим....
сам механизм обхода я сделаю...мне интересно,нет ли у кого идей как ЛУЧШЕ и ПРОЩЕ сделать создание препятсятвий?
вопще предлагайте свои алгоритмы.
(Offline)
 
Ответить с цитированием
Старый 16.11.2006, 20:09   #2
jimon
 
Сообщений: n/a
Re: Нахождение пути

а не легче зделать один 2д масив ?
и в нем если переменая = 0 то ето пустая клетка
если = 1 то ето препядствие
если там = 2 то ето что-то другое ...

ps. лутчий алгоритм - A* imho
или волновой по карте вейпоинтов
 
Ответить с цитированием
Старый 17.11.2006, 00:05   #3
DarkKnight
Знающий
 
Регистрация: 09.11.2006
Сообщений: 256
Написано 2 полезных сообщений
(для 2 пользователей)
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.
(Offline)
 
Ответить с цитированием
Старый 17.11.2006, 02:20   #4
WaReZ_MEN
Модератор
 
Регистрация: 20.06.2006
Сообщений: 363
Написано 24 полезных сообщений
(для 44 пользователей)
Re: Нахождение пути

Сообщение от DarkKnight
а как определять у какой именно точки значение 0 или 1?
end.
1. Обычным условием определяешь типа IF a[i,j]=1 then .....
2. Не ресуется потому что у тебя все значения в масиве равны 20 и координаты у ректангла тоже тоесть координаты первой точки ты берешь из масива (а они равны 20) и координаты второи точки прямоугольника у тебя тоже 20. ты внемательнее посмотри параметры у ректангла...
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 и У начальные значения
//Забиваем в массив Х-координаты
for i:=1 to 10 do
   begin
       inc(x,20);
       inc(y,20);
       a[1,i]:=x+20;
       a[2,i]:=x+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]+50,a[1,i]+20,a[2,i]+70);
   end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//Берём координаты из массива
//и рисуем квадратики с красной штриховкой
for i:=1 to 10 do
   begin
      Canvas.Brush.Color := clRed;
      Canvas.Brush.Style := bsBDiagonal;
      Canvas.Rectangle(a[1,i],a[2,i],a[1,i]+20,a[2,i]+20);
   end;
end;
end.
(Offline)
 
Ответить с цитированием
Старый 17.11.2006, 16:43   #5
DarkKnight
Знающий
 
Регистрация: 09.11.2006
Сообщений: 256
Написано 2 полезных сообщений
(для 2 пользователей)
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.
(Offline)
 
Ответить с цитированием
Старый 17.11.2006, 17:22   #6
jimon
 
Сообщений: n/a
Re: Нахождение пути

брррр... народ
обычно юзают так
masive [ x,y ] := status;
или если у вас кубики произвольного размера
то
masive [ id] := cube_class;
ну всмысле через классы надо делать
(как ето в делфи называется то ... )

а то у вас бред какой то который даже продвинутый прогер не поймет сразу
 
Ответить с цитированием
Старый 17.11.2006, 21:04   #7
DarkKnight
Знающий
 
Регистрация: 09.11.2006
Сообщений: 256
Написано 2 полезных сообщений
(для 2 пользователей)
Re: Нахождение пути

да не,как делать по твоему методу я вроде понял....
у меня не получается...короче,если массив создать не 10 на 10,а например 10 на 20...
(Offline)
 
Ответить с цитированием
Старый 17.11.2006, 21:10   #8
jimon
 
Сообщений: n/a
Re: Нахождение пути

неполучается всмысле ? не рисуется чтоли ?
 
Ответить с цитированием
Старый 17.11.2006, 21:32   #9
DarkKnight
Знающий
 
Регистрация: 09.11.2006
Сообщений: 256
Написано 2 полезных сообщений
(для 2 пользователей)
Re: Нахождение пути

первые 100 нормально,а потом идет наслоение одих на другие.
(Offline)
 
Ответить с цитированием
Старый 18.11.2006, 14:09   #10
DarkKnight
Знающий
 
Регистрация: 09.11.2006
Сообщений: 256
Написано 2 полезных сообщений
(для 2 пользователей)
Re: Нахождение пути

Я опять исправил сам свою ошибку.оказывается я просто забыл поменять тип массива с

byte на integer )
Распознавание препятствий я начал делать так,как предложил jimon,но я не знаю как в

делфи получить X и Y координаты мышки ( Кто знает?
Вот код,может еще где-нить ошибся,или можно сделать попроще,чем я,посмотрите plz:

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);
procedure FormClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a:array[1..10,1..30] of integer;
i,x,y,n,l,g:integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
l:=20;//ширина и высота кубика
//Присваиваем X и У начальные значения
x:=-20;
y:=-20;
//Забиваем в массив Х и Y-координаты
for i:=1 to 30 do
begin
x:=x+l;
y:=y+l;
a[1,i]:=x;
//if y>=470 then y:=470; //Ограничиваем число кубиков по оси Y
a[2,i]:=y;
a[3,i]:=0; //Первоначально присваиваем всем кубикам значение 0,т.е. кубик пустой.
end;
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
//Берём координаты из массива
//и рисуем квадратики с синей штриховкой
for n:=1 to 30 do
begin
for i:=1 to 30 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 30 do
begin
for i:=1 to 30 do
begin
case a[3,n] of
0:begin //клетка пуста
//Canvas.Brush.Color := clred;
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(a[1,n],a[2,i],a[1,n]+l,a[2,i]+l);
end;
2:begin //начальная точка
Canvas.Brush.Color := clred;
Canvas.Brush.Style := bsSolid;
Canvas.Rectangle(a[1,n],a[2,i],a[1,n]+l,a[2,i]+l);
end;
3:begin //конечная точка
Canvas.Brush.Color := clGreen;
Canvas.Brush.Style := bsSolid;
Canvas.Rectangle(a[1,n],a[2,i],a[1,n]+l,a[2,i]+l);
end;
1:begin //препятствие
Canvas.Brush.Color := clBlue;
Canvas.Brush.Style := bsSolid;
Canvas.Rectangle(a[1,n],a[2,i],a[1,n]+l,a[2,i]+l);
end;
end;
end;
end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
//for n:=1 to 30 do
//begin
// if <координата мышки X> >=a[1,n] and <координата мышки X> <=(a[1,n]+20)
// and <координата мышки Y> >=a[2,n] and <координата мышки Y> <=(a[2,n]+20)
// then
// begin
// a[3,n]:=2
// Canvas.Brush.Color := clred;
// Canvas.Brush.Style := bsSolid;
// Canvas.Rectangle(a[1,n],a[2,n],a[1,n]+l,a[2,n]+l);
// end;
//end;
//end;
end;
end.
(Offline)
 
Ответить с цитированием
Старый 18.11.2006, 16:26   #11
WaReZ_MEN
Модератор
 
Регистрация: 20.06.2006
Сообщений: 363
Написано 24 полезных сообщений
(для 44 пользователей)
Re: Нахождение пути

есть какое событие как onMouseMove там есть X и Y мыши.....
(Offline)
 
Ответить с цитированием
Старый 18.11.2006, 16:42   #12
DarkKnight
Знающий
 
Регистрация: 09.11.2006
Сообщений: 256
Написано 2 полезных сообщений
(для 2 пользователей)
Re: Нахождение пути

точно.
(Offline)
 
Ответить с цитированием
Старый 18.11.2006, 19:33   #13
DarkKnight
Знающий
 
Регистрация: 09.11.2006
Сообщений: 256
Написано 2 полезных сообщений
(для 2 пользователей)
Re: Нахождение пути

Я решил делать не с MouseMove(),а с MouseDown().Переменные X и Y описаны в функции.
но при компилировании выходят ошибки:
"For loop control variable must be simple local variable",несоответствие типов.
причем указывает он на "Y>=a[2,n]".Если бы дествительно было бы несоответсявие

типов,он бы на X ругался...
Короче я в замешательстве,че он ругается?

Код:

type
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);



procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
for n:=1 to 30 do
begin
if X>=a[1,n] and X<=(a[1,n]+20) and Y>=a[2,n] and Y<=(a[2,n]+20)
then
begin
a[3,n]:=2
Canvas.Brush.Color := clred;
Canvas.Brush.Style := bsSolid;
Canvas.Rectangle(a[1,n],a[2,n],a[1,n]+l,a[2,n]+l);
end;
end;
end;
end;
(Offline)
 
Ответить с цитированием
Старый 19.11.2006, 12:12   #14
WaReZ_MEN
Модератор
 
Регистрация: 20.06.2006
Сообщений: 363
Написано 24 полезных сообщений
(для 44 пользователей)
Re: Нахождение пути

В условиях необходима ставить скобки

...
if (X>=a[1,n]) and (X<=(a[1,n]+20)) and (Y>=a[2,n]) and (Y<=(a[2,n]+20))
...
(Offline)
 
Ответить с цитированием
Старый 19.11.2006, 14:20   #15
DarkKnight
Знающий
 
Регистрация: 09.11.2006
Сообщений: 256
Написано 2 полезных сообщений
(для 2 пользователей)
Re: Нахождение пути

ок.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритм поиска пути ии mifos JAVA Micro Edition 10 12.07.2011 17:34
Нахождение точки удовл. правилу Делоне SBJoker Математика 8 12.12.2007 01:11
Пути elmortem 2D-программирование 11 30.08.2007 12:18
Поиск пути Fant 3D-программирование 21 20.07.2007 19:21
Поиск пути WaReZ_MEN 3D-программирование 10 27.04.2007 02:24


Часовой пояс GMT +4, время: 14:53.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com