刚接触游戏编程,想求一个算法!(100分)

  • 主题发起人 coolflag
  • 开始时间
C

coolflag

Unregistered / Unconfirmed
GUEST, unregistred user!
出发点(60,80)

(100,100) (200,100)
。。。。。
。 。
。 。
。。。。。(200,200)
目的地()

从出发点到目的地,将遇到障碍物(那个正方形),程序中怎么判断是否遇到障碍物呢?
 
将地图作为一个二维Boolean数组来处理,值为真的表示可以通过,为假的表示不可通行(
也就是障碍物所在)。
请参考 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1792257 中的地图描述,
X表示障碍物。
 
怎么跟我想推荐的是同一个帖子呀.呵呵.
那个贴子是讨论最短路径的,楼主的问题是他的一个子集.
 
问题解决了,我用了一个初中知识搞定了!
设正方形障碍物的位置(100,100),长100,宽100
思路:
行走路线为起始点到终点两个点,形成一条直线,
判断行走路线是否与障碍物的4条边相交就可以了!
以下代码为行走路线遇到障碍物左边界
function stop(Now,EndGo):boolean;
var
k,b,y:Double;
s:Boolean;
begin
s:=false;
if (Now.X<100) and (EndGo.X>100) then

begin
k:=(EndGo.Y-Now.Y)/(EndGo.X-Now.X);
b:=EndGo.Y-EndGo.X*k;
y:=k*100+b;
if (y>100) and (y<200) then
s:=true;
end;
result:=s;
end;
 
没人发表别的方法或者看法吗?兄弟们,说句话啊!
 
一般说来,二维电脑游戏的地图都是用二维数组来存放的,一个物体同一时刻只能处于一
个格子中,而一个物体只能向周围的4个或8个方向进行移动。如果地图是4连通的,那么你
的问题根本就不存在——因为 e,e,e,s,s,s 和 e,s,e,s,e,s 的路径长度是相同的;如果地
图是8连通的,并且对角线的路径长度比两条直边的长度和短(即 es,es,es 比e,s,e,s,e,s
短)——那么,虽然最短路径的数量肯定会比4连通的地图要少,但是同样可以用广度优先
搜索来找到,而不用涉及任何几何学的知识。
看你的问题,似乎地图不是一个二维数组,而只是一个范围,物体的坐标是浮点数,移动
方向没有任何限制,那么,这个问题就等价于下面的平面解析几何问题:
已知两点的座标,以及障碍物边界座标,求两点的连线是否与障碍物相交。
解决此问题的算法很简单:遍历障碍物的边界,看它们之中是否有与两点连线相交的情况
即可。您可以参考一下 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1277180
 
啊,原来这么多啊?郁闷!谢谢!我好不容易用电话线下载了离线数据,没查到,于是。。。。。
 
对了,要是判断一个矩形是否会与另一个矩形“相交”呢?是不是判断四个点啊?
 
判断两个多边形是否相交,要看它们所有的边是否有与对方的边相交的情况。如果你说的
两个矩形的边和坐标轴都是平行的,那么就可以简化很多——根据它们在X,Y轴的覆盖范围
来判断即可。
 
问题中的点变成了一个矩形,判断起来好烦啊!要求能在遇到障碍物后停下来就可以了,
我以前在一本"电脑爱好者的编程擂台赛"上看过,但是那本杂志不知道哪去了!
creation-zy兄,有没有什么高见啊?(能不能写点代码啊?)
用delphiX里面提供的示例虽然可以遇到障碍物做出反应,但是觉得那样做不爽,想用遍历障碍
物数组来判断障碍物的方法!

 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
I
回复
0
查看
693
import
I
顶部