小姑娘过河问题。。。哪位大侠指条明路。

zy4889 2017-10-06 02:17:29

最近在研究最短路径的寻路操作代码,已经初有眉目,但迷雾重重,哪位大侠提供点资料指条明路。

...全文
165 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zy4889 2017-10-06
  • 打赏
  • 举报
回复
图片下载可能名字不对,请更正哦: BX7B_girl.gif 这个是图片的名称。
zy4889 2017-10-06
  • 打赏
  • 举报
回复
A star算法有缺点,早期的大部分RTS游戏都用它,基本都体现出来。 想知道魔兽争霸这样的游戏是用什么算法来寻路的???
zy4889 2017-10-06
  • 打赏
  • 举报
回复
现行代码如下, 寻路基本可以实现,但是不知能否保证最优解。鼠标点哪,小萝莉就会走到哪,还会避开障碍。
注,人物的图片请和网页放于同一目录下。

<!DOCTYPE html>
<html>
<body onmousedown="ck(event)" bgcolor="#000">
<img src="BX7B_girl.gif" id="tulip" style="display:none;">
<canvas id="can" width="720" height="720" style="background: #031"></canvas>
<div id="ffff" aligh="center" style="width:640px;font:22px/22px 黑体;background:#000;color:#069"></div>

<script>
var ctx = document.getElementById("can").getContext("2d");
var img=document.getElementById("tulip");
var v=3, sx, acv,fxv,yfx=1,ac=xd=0, cx=[7,0,4,2,6,1,5,3],x=y=720,c,stp,path=[];
var rectz=[[0,180-16,480+16,180-16,480+16,240+16,0,240+16],[240-16,480-16,640,480-16,640,540,240-16,540]];
var ppath=[[480+16,180-16],[480+16,240+16],[240-16,480-16],[240-16,540+16],[640+16,480-16],[640+16,540+16]];

function mapstart(){
xmm=createp(80,80);
xmm.fx=7;
sx=setInterval("redraw()",25);
acv=setInterval("acm()",130);}

function redraw(){
ctx.fillStyle ="#031";
ctx.fillRect(0,0,720,720);
ctx.fillStyle ="#048";
ctx.fillRect(0,180,480,60);
ctx.fillRect(240,480,400,60);
if(!xd&&path.length){x=path[0],y=path[1];xmm.getp(x,y);}
xmm.getsva();
draw(xmm.x,xmm.y,cx[xmm.fx]);
if(xmm.vx*xmm.vx+xmm.vy*xmm.vy){clearTimeout(fxv);yfx=1;}else
{if(yfx)fxv=setTimeout("xmm.fx=[0,1,2,6,7][~~(Math.random()*5)];yfx=1",8000);yfx=0;}
}

function acm(){
ac=++ac%4;
if(!xd)ac=0;}

function createp(xx,yy){
object={x:xx,y:yy,vx:0,vy:0,fx:0};
object.getsva=function(){
this.x+=this.vx,this.y+=this.vy
if(!xd)ac=0;
if(xd)if(Math.pow(path[0]-this.x,2)+Math.pow(path[1]-this.y,2)<64){this.vx=this.vy=xd=0;path.splice(0,2);}
}
object.getp=function(x,y){
c=Math.sqrt(Math.pow(x-this.x,2)+Math.pow(y-this.y,2));
stp=c/v;
this.vx=(x-this.x)/stp;
this.vy=(y-this.y)/stp;
this.fx=Math.round(Math.atan2(y-this.y,x-this.x)/Math.PI*4+6.0)%8;
xd=1;
}
return object;
}

function draw(m,n,fx){
ctx.drawImage(img,64*ac,64*fx,64,64,m-64,n-100,128,128);
}


function drawrec(p1,p2){
ctx.strokeStyle ="#f00";
ctx.strokeRect(p1[0],p1[1],-(p1[0]-p2[0]),-(p1[1]-p2[1]));
ctx.stroke();
}

function drawl(p1,p2) {
ctx.strokeStyle = "#aaa";
ctx.lineWidth=1;
ctx.beginPath();
ctx.moveTo(p1[0],p1[1]);
ctx.lineTo(p2[0],p2[1]);
ctx.stroke();
}

function linrec(p1,p2,rect){
var minfx,minfy,maxfx,maxfy,kl1,kl2;
minfx=Math.max(Math.min(p1[0],p2[0]),Math.min(rect[0],rect[2]))
minfy=Math.max(Math.min(p1[1],p2[1]),Math.min(rect[1],rect[5]))
maxfx=Math.min(Math.max(p1[0],p2[0]),Math.max(rect[0],rect[2]))
maxfy=Math.min(Math.max(p1[1],p2[1]),Math.max(rect[1],rect[5]))
if(minfx>maxfx||minfy>maxfy)return 0;
kl1=((rect[0]-p1[0])*(p2[1]-p1[1])-(p2[0]-p1[0])*(rect[1]-p1[1]))*((rect[2]-p1[0])*(p2[1]-p1[1])-(p2[0]-p1[0])*(rect[5]-p1[1]))
kl2=((rect[0]-p1[0])*(p2[1]-p1[1])-(p2[0]-p1[0])*(rect[5]-p1[1]))*((rect[2]-p1[0])*(p2[1]-p1[1])-(p2[0]-p1[0])*(rect[1]-p1[1]))
if(kl1>=0&&kl2>=0) return 0;
return 1;}

function visib(p1,p2){
if(linrec(p1,p2,rectz[0]))return 0;
if(linrec(p1,p2,rectz[1]))return 0;
return 1;}

function disttp(p1,p2){
return Math.min(Math.abs(p1[0]-p2[0]),Math.abs(p1[1]-p2[1]))*7+Math.abs(Math.abs(p1[0]-p2[0])-Math.abs(p1[1]-p2[1]))*5;}

function ck(event) {
if (event.clientX > 720 || event.clientY > 720) return;
x = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
y = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
x -= 10;
y -= 10;
//path.push(x,y);
document.getElementById("ffff").innerHTML="落点X:"+x+",Y:"+y;
path = [],this.vx=this.vy=xd=0;
var i, j ,dic, zbd=1, openz =[], closez = [], gv = [], zx = [], allp=ppath.slice(0);
openz.push(0);
gv[0]=0;
zx.push(0)
allp.push([x, y]);
allp.unshift([xmm.x, xmm.y]);
while (zbd) {
j=0;
for (i in openz) if (gv[openz[j]] >= gv[openz[i]]) j = i;
closez.unshift(openz.splice(j, 1)[0]);
for (i in allp){ if (closez.indexOf(i) < 0 && visib(allp[i], allp[closez[0]])) {
dic=disttp(allp[i], allp[closez[0]]) ;
if (openz.indexOf(i) < 0)
{
openz.push(i);
zx[i] = closez[0];
gv[i] = dic+ gv[closez[0]];
if (i == allp.length-1) {
zbd=0;
}
if (!openz.length) {zbd=0;}
} else {
if (gv[i] > dic+ gv[closez[0]]) {
zx[i] = closez[0];
gv[i] = dic+ gv[closez[0]];}
if (gv[i]+dic<gv[closez[0]])
{ zx[closez[0]] = i;
gv[closez[0]]=gv[i]+dic;
}
}
}
}
}
while(i){
path.unshift(allp[i][0],allp[i][1]);
i=zx[i];
}
}

document.body.oncontextmenu=document.body.ondragstart= document.body.onselectstart=document.body.onbeforecopy=function(){return false;};
document.body.onselect=document.body.oncopy=document.body.onmouseup=function(){document.selection.empty();};
mapstart();
redraw();

</script>

</body>
</html>

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧