-
Notifications
You must be signed in to change notification settings - Fork 1
/
Spiral.ts
78 lines (72 loc) · 2.32 KB
/
Spiral.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class SpiralLevel extends ALevel<SpiralWorld> {
generator: SpiralMapGenerator;
robot: IRobot<SpiralWorld>;
constructor() {
super();
this.generator = new SpiralMapGenerator();
this.robot = new SensorRobot<SpiralWorld>(this, this.resetWorld());
}
getName(): string { return "Spiral"; }
resetWorld(): SpiralWorld {
var map: SpiralMap = this.generator.getStandardMap();
return this.makeWorld(map);
}
makeWorld(map: SpiralMap) {
var x: number = 1;
var y: number = map.getHeight() - 2;
return new SpiralWorld(Direction.East, x, y, new Array<MemoryLabel>(), map);
}
getRobot(): IRobot<SpiralWorld> {
return this.robot;
}
getTestMaps(): SpiralWorld[] {
return this.generator.getTestMaps().map((mm) => this.makeWorld(mm));
}
}
class SpiralMapGenerator extends AMapGenerator<SpiralMap> {
constructor() {
super();
}
getStandardMap(): SpiralMap {
return new SpiralMap(25, 25);
}
}
class SpiralMap extends AGoalMap {
startx: number;
starty: number;
constructor(width: number, height: number) {
super(width, height);
var swidth = 3;
var curx = 1;
var cury = height - 2 - swidth;
var dir = 1;
while (Math.abs(curx - width / 2) > 2 && Math.abs(cury - height / 2) > 2) {
while (!this.walls[curx + swidth * dir][cury]) {
this.walls[curx][cury] = true;
curx+=dir;
}
curx -= dir;
dir = dir * -1;
while (!this.walls[curx][cury + swidth *dir]) {
this.walls[curx][cury] = true;
cury+=dir;
}
cury -= dir;
}
}
getGoalZones(): { sx: number, sy: number, ex: number, ey: number }[] {
return [{ sx: 9, sy: 9, ex: 12, ey: 12 }];
}
}
class SpiralWorld extends GoalWorld<SpiralWorld> {
map: SpiralMap;
constructor(direction: Direction, x: number, y: number, memories: MemoryLabel[], map: SpiralMap) {
super(direction, x, y, memories);
this.map = map;
}
copyWith(direction: Direction, x: number, y: number, memories: MemoryLabel[]): SpiralWorld {
return new SpiralWorld(direction, x, y, memories, this.map);
}
getGoalMap(): GoalMap { return this.map; }
}