flash on 2013-1-17
Experiment with ai
goal is to make an entertaining one rather than a truly intelligent one
what it attempts to do is figure out where it can see you ( the mouse pointer in this case)
and move towards that point
if it cannot see you it gets bored and
walks around in a seemingly random pattern (but actually it tries to guess the path to take to find you, so it's cheating because it knows your position regardless, just pretends it doesn't)
♥2 |
Line 186 |
Modified 2013-01-17 22:23:17 |
MIT License
archived:2017-03-04 14:34:10
ActionScript3 source code
/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/bR1D
*/
package {
import flash.text.TextField;
import flash.display.Graphics;
import flash.events.Event;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public var mheight:int = 0;
public var mwidth:int = 0;
public var vecGrid:Vector.<int>;
public var cw:Number = 16;
public function FlashTest() {
mwidth = 22;
mheight = 22;
graphics.clear();
var num:int;
var i:int;
var k:int;
var t:int;
var yt:int;
num = mwidth*mheight;
vecGrid = new Vector.<int>(num, false);
for (i = 0; i < mheight; i++)
{
yt = i * mwidth;
for (k = 0; k < mwidth; k++)
{
t = Math.random() < 0.2 ? 1 : 0 ;
vecGrid[yt+k]=t;
if (t > 0)
{
graphics.beginFill(0,1);
graphics.drawRect(k*cw,i*cw,cw,cw);
graphics.endFill();
}
}//nextit
}//nexti
deb = new Sprite();
addChild(deb);
dt = new TextField();
addChild(dt);
dt.y = 350;
cx = 200;
cy = 200;
var k:int;
k =0;
while (k < 256)
{
if (isWall(cx, cy))
{
cx+=cw;
}
else
{
break;
}
k+=1;
}
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public var deb:Sprite;
public var dt:TextField;
public var cx:Number = 0;
public var cy:Number = 0;
public var vx:Number = 0;
public var vy:Number = 0;
public var px:Number = 0;
public var py:Number = 0;
public var pt:int = 0;
public function onEnter(e:Event):void
{
var g:Graphics;
g = deb.graphics;
g.clear();
g.lineStyle(2, 0xFF0000);
g.drawCircle(mouseX, mouseY, 4);
if (isWall(mouseX, mouseY) )
{
g.drawRect( Math.floor(mouseX/cw)*cw, Math.floor(mouseY/cw)*cw,cw,cw);
}
var t:Number;
// t = lineTest(300,300, mouseX, mouseY);
//dt.text = " " + t;
t = lineTest(cx,cy, mouseX,mouseY);
if (t >= 1)
{
var mag:Number;
vx = mouseX-cx;
vy = mouseY-cy;
mag = Math.sqrt(vx*vx+vy*vy);
if (mag == 0) { mag = 0.0000001;}
vx/=mag;
vy/=mag;
pt = 1;
px = mouseX;
py = mouseY;
if (mag < 20) { pt = 0; vx = 0; vy = 0;}
}
else
{
if (pt > 0)
{
vx = px-cx;
vy = py-cy;
mag = Math.sqrt(vx*vx+vy*vy);
if (mag == 0) { mag = 0.0000001;}
//if (mag < 10) { pt = 1;}
vx/=mag;
vy/=mag;
if (mag < 16) { pt = 0;}
}
}
if (pt <= 0)
{
pt -= 1;
if (pt <= -20)
{
var k:int;
for (k = 0; k < 8; k+=1)
{
px = cx + Math.random() * 40;
py = cy + Math.random() * 40;
if (lineTest(cx,cy, px,py) >= 1) { break;}
}
if (Math.random() < 0.4)
{
px = mouseX + Math.random()*80;
py = mouseY + Math.random()*80;
}
pt = 1;
}
}
vx *= 0.96;
vy *= 0.96;
var wc:int;
wc = 0;
if (vx>0 && isWall(cx+4,cy)) { vx = 0; wc = 1;}
if (vx<0 && isWall(cx-4,cy)) { vx = 0; wc = 1;}
if (vy>0 && isWall(cx,cy+4)) { vy = 0; wc = 1;}
if (vy<0 && isWall(cx,cy-4)) { vy = 0; wc = 1;}
if (wc > 0) { pt +=1; if (pt >=8) {pt =0; } }
cx+=vx;
cy+=vy;
g.lineStyle(2,0xFF0000);
g.drawCircle(cx,cy, 8);
g.lineStyle(2,0x0000FF);
g.drawCircle(px,py,4);
}//onenter
public function lineTest(ax:Number, ay:Number, bx:Number, by:Number):Number
{
var nx:Number;
var ny:Number;
var mag:Number;
var u:Number;
var t:Number;
nx = bx-ax;
ny = by-ay;
mag = Math.sqrt(nx*nx+ny*ny);
if (mag == 0) { return 1; }
nx /= mag;
ny /= mag;
u = (cw/2) / mag;
var kx:Number;
var ky:Number;
for (t = 0; t < 1; t+=u)
{
kx = ax+(bx-ax)*t;
ky = ay+(by-ay)*t;
deb.graphics.drawCircle(kx,ky, 2);
if (isWall(kx,ky))
{
return t;
}
}//nextt
return 1;
}//linetest
public function isWall(wx:Number, wy:Number):Boolean
{
var tx:int;
var ty:int;
tx = Math.floor(wx / cw);
ty = Math.floor(wy / cw);
if (tx < 0) { return false; }
if (ty < 0) { return false; }
if (tx >= mwidth) { return false; }
if (ty >= mheight) { return false; }
return vecGrid[tx + (ty*mwidth) ];
}//iswall
}//classends
}