Mercurial > repos > icfp2012
annotate src/sim.tp @ 56:ca86c88c2336
merge
author | William Morgan <bill@mrgn.org> |
---|---|
date | Sun, 15 Jul 2012 22:24:35 -0700 |
parents | b2e9e5ad3ad8 a37ceb0a4f5c |
children | aa822c683e28 |
rev | line source |
---|---|
11
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
1 { |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
2 null <- #{} |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
3 |
12 | 4 eachbyte <- :string action { |
5 strLen <- string byte_length: | |
6 index <- 0 | |
7 while: {index < strLen} do: { | |
8 element <- (string byte: index) | |
9 action: index element | |
10 index <- index + 1 | |
11 } | |
12 } | |
13 | |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
14 debugLog <- :str { |
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
15 os write: 2 str |
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
16 } |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
17 |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
18 abs <- :val { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
19 if: val < 0 { 0 - val } else: { val } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
20 } |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
21 |
11
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
22 makeCellTypes <- { |
31 | 23 typedict <- dict linear |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
24 new <- :idStr { |
36
814e3d482ad3
Make navigable a property of the cell type so I can use it in lifter
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
25 cannav <- if: idStr = " " {true} else: { |
814e3d482ad3
Make navigable a property of the cell type so I can use it in lifter
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
26 if: idStr = "." {true} else: { |
814e3d482ad3
Make navigable a property of the cell type so I can use it in lifter
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
27 if: idStr = "\\" {true} else: { |
814e3d482ad3
Make navigable a property of the cell type so I can use it in lifter
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
28 if: idStr = "O" {true} else: { |
814e3d482ad3
Make navigable a property of the cell type so I can use it in lifter
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
29 false }}}} |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
30 ret <- #{ |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
31 id <- (idStr byte: 0) |
34
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
32 string <- idStr |
10 | 33 isrobot <- { false } |
34
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
34 eq <- :other { id = (other id) } |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
35 navigable <- { cannav } |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
36 } |
31 | 37 typedict set: (ret id) ret |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
38 ret |
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
39 } |
11
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
40 #{ |
13
c92633098f1d
simulator now properly parses map and accepts input until A is sent to it over stdin
Mike Pavone <pavone@retrodev.com>
parents:
12
diff
changeset
|
41 find <- :id { |
c92633098f1d
simulator now properly parses map and accepts input until A is sent to it over stdin
Mike Pavone <pavone@retrodev.com>
parents:
12
diff
changeset
|
42 if: id = ("R" byte: 0) { robot: } else: { |
31 | 43 typedict get: id withDefault: empty |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
44 } |
11
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
45 } |
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
46 wall <- new: "#" |
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
47 empty <- new: " " |
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
48 earth <- new: "." |
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
49 rock <- new: "*" |
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
50 lambda <- new: "\\" |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
51 closedLift <- new: "L" |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
52 openLift <- new: "O" |
11
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
53 newline <- new: "\n" |
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
54 robot <- { |
34
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
55 commands <- dict linear |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
56 ret <- #{ |
23 | 57 id <- ("R" byte: 0) |
34
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
58 string <- "R" |
23 | 59 x <- 0 |
60 y <- 0 | |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
61 isrobot <- { true } |
53
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
62 navigable <- { false } |
34
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
63 eq <- :other { id = (other id) } |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
64 collected <- 0 |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
65 heldBreath <- 0 |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
66 razors <- 0 |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
67 mine <- null |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
68 doCmd <- :cmd { |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
69 action <- commands get: cmd withDefault: { null } |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
70 action: |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
71 } |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
72 move <- :xDelta yDelta { |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
73 xPrime <- x + xDelta |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
74 yPrime <- y + yDelta |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
75 |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
76 writeMove <- { |
23 | 77 mine setCell: xPrime yPrime self |
78 mine setCell: x y empty | |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
79 x <- xPrime |
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
80 y <- yPrime |
23 | 81 } |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
82 |
34
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
83 consequenceOf <- :cur { |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
84 if: (cur eq: lambda) { |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
85 collected <- collected + 1 |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
86 mine addPoints: 25 |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
87 } |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
88 if: (cur eq: openLift) {mine succeeded!} |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
89 } |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
90 |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
91 destination <- mine getCell: xPrime yPrime |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
92 if: (destination navigable: ) { |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
93 consequenceOf: destination |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
94 writeMove: |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
95 } else: { |
35 | 96 if: (destination eq: rock) { |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
97 xPrimePrime <- xDelta * 2 + x |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
98 rockDestination <- mine getCell: xPrimePrime y |
35 | 99 if: (rockDestination eq: empty) { |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
100 mine setCell: xPrimePrime y rock |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
101 writeMove: |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
102 } |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
103 } |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
104 } |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
105 |
13
c92633098f1d
simulator now properly parses map and accepts input until A is sent to it over stdin
Mike Pavone <pavone@retrodev.com>
parents:
12
diff
changeset
|
106 } |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
107 clone <- { |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
108 myclone <- robot |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
109 myclone collected!: collected |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
110 myclone heldBreath!: heldBreath |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
111 myclone razors!: razors |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
112 myclone |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
113 } |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
114 } |
34
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
115 commands set: "L" {ret move: (-1) 0 } |
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
116 commands set: "R" {ret move: 1 0 } |
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
117 commands set: "U" {ret move: 0 1 } |
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
118 commands set: "D" {ret move: 0 (-1) } |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
119 //commands set: "A" {mine ended!: true} |
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
120 ret |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
121 } |
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
122 } |
11
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
123 } |
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
124 #{ |
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
125 |
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
126 cellTypes <- makeCellTypes: |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
127 |
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
128 state <- #{ |
6 | 129 new <- :in_grid in_width in_height { |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
130 _nextGrid <- #[] |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
131 _robot <- null |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
132 _ended <- false |
52 | 133 _maxmoves <- in_width * in_height |
53
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
134 _heuristicValid <- false |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
135 _heuristic <- 0 |
55
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
136 getSafe <- :collection :index { |
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
137 if: index >= 0 { |
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
138 if: index < (collection length) { |
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
139 collection get: index |
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
140 } else: { (cellTypes wall) } |
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
141 } else: { (cellTypes wall) } |
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
142 } |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
143 _succeeded <- false |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
144 ret <- #{ |
8 | 145 grid <- in_grid |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
146 width <- in_width |
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
147 height <- in_height |
23 | 148 calcIndex <- :x y { x + y * width } |
149 calcX <- :index {index % width} | |
150 calcY <- :index {index / width} | |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
151 getCell <- :x y { |
55
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
152 grid getSafe: (calcIndex: x y) |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
153 } |
10 | 154 setCell <- :x y val { |
23 | 155 grid set: (calcIndex: x y) val |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
156 } |
51 | 157 getNextCell <- :x y { |
55
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
158 _nextGrid getSafe: (calcIndex: x y) |
51 | 159 } |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
160 setNextCell <- :x y val { |
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
161 _nextGrid set: (calcIndex: x y) val |
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
162 } |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
163 validDest?:from <- :index :fromIndex { |
55
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
164 cell <- (grid getSafe: index) |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
165 if: (cell navigable) {true} else: { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
166 if: (cell eq: (cellTypes rock)) { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
167 diff <- index - fromIndex |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
168 //make sure movement was horizontal |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
169 if: (abs: diff) = 1 { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
170 rockdest <- index + diff |
55
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
171 if: ((grid getSafe: rockdest) eq: (cellTypes empty)) { |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
172 //make sure rock destination doesn't wrap |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
173 (calcY: rockdest) = (calcY: index) |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
174 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
175 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
176 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
177 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
178 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
179 validMoves <- :x y { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
180 |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
181 amove <- :idx name {#{ |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
182 index <- idx |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
183 cmd <- name |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
184 string <- { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
185 name . "(" . idx . ")" |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
186 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
187 }} |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
188 here <- calcIndex: x y |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
189 //TODO: Add wait move when rocks are in motion |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
190 //(amove: here "W") |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
191 cur <- #[(amove: here "A")] |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
192 up <- amove: (calcIndex: x y + 1) "U" |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
193 down <- amove: (calcIndex: x y - 1) "D" |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
194 left <- amove: (calcIndex: x - 1 y) "L" |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
195 right <- amove: (calcIndex: x + 1 y) "R" |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
196 foreach: #[up down left right] :idx el { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
197 if: (validDest?: (el index) from: here) { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
198 cur append: el |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
199 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
200 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
201 cur |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
202 } |
53
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
203 distanceFrom:to <- :x y celltype { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
204 //print: "calculating distance from " . x . ", " . y . " to " . celltype . "\n" |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
205 moves <- validMoves: x y |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
206 curdist <- 0 |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
207 visited <- _nextGrid |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
208 foreach: grid :idx el { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
209 visited set: idx false |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
210 } |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
211 notfound <- true |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
212 while: { if: notfound { (moves length) > 0 } } do: { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
213 nextmoves <- #[] |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
214 curdist <- curdist + 1 |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
215 foreach: moves :idx move { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
216 curpos <- move index |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
217 if: (not: (visited get: curpos)) { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
218 if: ((grid get: curpos) eq: celltype) { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
219 notfound <- false |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
220 } else: { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
221 visited set: curpos true |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
222 foreach: (validMoves: (calcX: curpos) (calcY: curpos)) :idx move { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
223 nextmoves append: move |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
224 } |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
225 } |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
226 } |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
227 } |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
228 moves <- nextmoves |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
229 } |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
230 curdist |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
231 } |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
232 getRobot <- { _robot } |
23 | 233 updatePos <- :obj Index { |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
234 obj x!: (calcX: Index) |
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
235 obj y!: (calcY: Index) |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
236 } |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
237 lambdaCount <- 0 |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
238 water <- 0 |
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
239 flooding <- 0 |
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
240 waterproof <- 10 |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
241 moves <- #[] |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
242 score <- 0 |
45
9f1ca5ba2684
Discard entries for which we can easily tell that it will be impossible for them to be better than the current best. This allows us to terminate when we cannot solve the map
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
243 maxScore <- { score + (lambdaCount - (_robot collected)) * 25 + lambdaCount * 50 } |
53
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
244 heuristic <- { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
245 if: (not: _heuristicValid) { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
246 dest <- if: (_robot collected) = lambdaCount { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
247 cellTypes openLift |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
248 } else: { |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
249 cellTypes lambda |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
250 } |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
251 _heuristic <- score - (distanceFrom: (_robot x) (_robot y) to: dest) |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
252 _heuristicValid <- true |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
253 } |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
254 _heuristic |
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
255 } |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
256 addPoints <- :points { score <- score + points } |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
257 ended <- {_ended} |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
258 succeeded <- {_succeeded} |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
259 succeeded! <- { |
48 | 260 _ended <- true |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
261 _succeeded <- true |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
262 addPoints: lambdaCount * 50 |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
263 } |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
264 doUpdate <- { |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
265 foreach: grid :index value { |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
266 nextValue <- value |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
267 if: (value eq: (cellTypes rock)) { |
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
268 x <- calcX: index |
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
269 y <- calcY: index |
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
270 below <- getCell: x (y - 1) |
43
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
271 fallToSide <- :delta { |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
272 side <- getCell: (x + delta) y |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
273 belowSide <- getCell: (x + delta) (y - 1) |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
274 if: (side eq: (cellTypes empty)) { |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
275 if: (belowSide eq: (cellTypes empty)) { |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
276 setNextCell: (x + delta) (y - 1) value |
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
277 nextValue <- (cellTypes empty) |
43
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
278 true |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
279 } else: { false } |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
280 } else: { false } |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
281 } |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
282 if: (below eq: (cellTypes empty)) { |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
283 nextValue <- (cellTypes empty) |
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
284 setNextCell: x (y - 1) value |
43
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
285 } else: { if: (below eq: (cellTypes rock)) { |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
286 if: (not: (fallToSide: 1)) {fallToSide: -1} |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
287 } else: { if: (below eq: (cellTypes lambda)) { |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
288 fallToSide: 1 |
1f583d85c8ed
rocks slide correctly now. rock movement is complete.
William Morgan <bill@mrgn.org>
parents:
42
diff
changeset
|
289 }}} // end if |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
290 } else: { |
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
291 if: (value eq: (cellTypes closedLift)) { |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
292 if: (_robot collected) = lambdaCount { |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
293 nextValue <- (cellTypes openLift) |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
294 } |
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
295 } |
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
296 } |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
297 _nextGrid set: index nextValue |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
298 } |
51 | 299 } |
300 checkForDeath <- { | |
301 robotsNewFace <- getNextCell: (_robot x) (_robot y) + 1 | |
302 robotsFace <- getCell: (_robot x) (_robot y) + 1 | |
303 if: (robotsNewFace eq: (cellTypes rock)) { | |
304 if: (not: (robotsFace eq: (cellTypes rock))) { | |
305 _ended <-true | |
306 } | |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
307 } |
51 | 308 } |
309 swapGrids <- { | |
310 tmp <- grid | |
311 grid <- _nextGrid | |
312 _nextGrid <- tmp | |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
313 } |
52 | 314 abort <- { |
315 _ended <- true | |
316 addPoints: (_robot collected) * 25 | |
317 } | |
7
1bd46f854dbb
progress on sim, celltypes as objects
William Morgan <bill@mrgn.org>
parents:
6
diff
changeset
|
318 advance <- :roboCmd { |
53
fbeedb3aa239
Add heuristic for evaluating non-terminal states. Cull to 8 states based on heuristic rather than just a single one based on score.
Mike Pavone <pavone@retrodev.com>
parents:
52
diff
changeset
|
319 _heuristicValid <- false |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
320 if: roboCmd = "A" { |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
321 moves append: roboCmd |
52 | 322 abort |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
323 } |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
324 |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
325 if: (not: _ended) { |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
326 _robot doCmd: roboCmd |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
327 score <- score - 1 |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
328 moves append: roboCmd |
35 | 329 doUpdate: |
51 | 330 checkForDeath: |
331 swapGrids: | |
52 | 332 if: (moves length) >= _maxmoves { |
333 abort | |
334 } | |
35 | 335 } |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
336 self |
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
337 } |
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
338 printGrid <- { |
32 | 339 cur <- (grid length) - width |
340 col <- 0 | |
341 while: {cur >= 0} do: { | |
55
b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
William Morgan <bill@mrgn.org>
parents:
51
diff
changeset
|
342 os write: 2 ((grid getSafe: cur) string) |
32 | 343 cur <- cur + 1 |
344 col <- col + 1 | |
345 if: col = width { | |
346 col <- 0 | |
347 cur <- cur - (width + width) | |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
348 os write: 2 "\n" |
23 | 349 } |
350 } | |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
351 os write: 2 "score: " . score . "\n" |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
352 os write: 2 "collected: " . (_robot collected) . "\n" |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
353 os write: 2 "moves: " |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
354 foreach: moves :idx m { |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
355 os write: 2 m |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
356 } |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
357 os write: 2 "\n" |
32 | 358 } |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
359 clone <- { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
360 cgrid <- #[] |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
361 foreach: grid :idx el { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
362 if: (el isrobot) { |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
363 cgrid append: (el clone) |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
364 } else: { |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
365 cgrid append: el |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
366 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
367 } |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
368 myclone <- state new: cgrid width height |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
369 myclone water!: water |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
370 myclone flooding!: flooding |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
371 myclone waterproof!: waterproof |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
372 movesclone <- #[] |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
373 foreach: moves :idx el { |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
374 movesclone append: el |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
375 } |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
376 myclone moves!: movesclone |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
377 myclone score!: score |
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
378 myclone lambdaCount!: lambdaCount |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
379 myclone |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
380 } |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
381 } |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
382 foreach: in_grid :index el{ |
47
ccaecf1d6425
correct reading and writing during update and test maps for verifying that.
William Morgan <bill@mrgn.org>
parents:
43
diff
changeset
|
383 _nextGrid append: el |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
384 if: (el isrobot) { |
39
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
385 _robot <- el |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
386 _robot mine!: ret |
9bccdb3ac979
Add priority queue implementation to lifter. Add methods for cloning playfield and determining valid moves.
Mike Pavone <pavone@retrodev.com>
parents:
36
diff
changeset
|
387 ret updatePos: _robot index |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
388 } else: { |
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
389 if: (el eq: (cellTypes lambda)) { |
44
0c09730c173e
Robot works on simple maps now
Mike Pavone <pavone@retrodev.com>
parents:
41
diff
changeset
|
390 ret lambdaCount!: (ret lambdaCount) + 1 |
40
f38437d22ebd
success is possible. W implemented. Rock movement started but not finished.
William Morgan <bill@mrgn.org>
parents:
36
diff
changeset
|
391 } |
30
031d46ff76a9
minor clean up to use 'if' and 'not'
William Morgan <bill@mrgn.org>
parents:
29
diff
changeset
|
392 } |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
393 } |
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
394 ret |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
395 } |
32 | 396 |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
397 fromStr <- :str { |
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
398 strLen <- str byte_length: |
13
c92633098f1d
simulator now properly parses map and accepts input until A is sent to it over stdin
Mike Pavone <pavone@retrodev.com>
parents:
12
diff
changeset
|
399 maxCol <- 0 |
c92633098f1d
simulator now properly parses map and accepts input until A is sent to it over stdin
Mike Pavone <pavone@retrodev.com>
parents:
12
diff
changeset
|
400 nl <- (cellTypes newline) id |
c92633098f1d
simulator now properly parses map and accepts input until A is sent to it over stdin
Mike Pavone <pavone@retrodev.com>
parents:
12
diff
changeset
|
401 blank <- cellTypes empty |
32 | 402 lines <- #[] |
403 curline <- #[] | |
12 | 404 eachbyte: str :index element { |
13
c92633098f1d
simulator now properly parses map and accepts input until A is sent to it over stdin
Mike Pavone <pavone@retrodev.com>
parents:
12
diff
changeset
|
405 if: element = nl { |
32 | 406 col <- curline length |
33
efa82c5e95c2
must commit, too late. does not compile.
William Morgan <bill@mrgn.org>
parents:
32
diff
changeset
|
407 maxCol <- if: col > maxCol {col} else: {maxCol} |
32 | 408 lines append: curline |
409 curline <- #[] | |
10 | 410 } else: { |
32 | 411 curline append: (cellTypes find: element) |
10 | 412 } |
413 } | |
13
c92633098f1d
simulator now properly parses map and accepts input until A is sent to it over stdin
Mike Pavone <pavone@retrodev.com>
parents:
12
diff
changeset
|
414 grid <- #[] |
32 | 415 cur <- (lines length) - 1 |
416 while: { cur >= 0 } do: { | |
417 curline <- (lines get: cur) | |
418 foreach: curline :idx el { | |
419 grid append: el | |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
420 } |
32 | 421 extra <- maxCol - (curline length) |
422 while: { extra > 0 } do: { | |
423 grid append: blank | |
424 extra <- extra - 1 | |
425 } | |
426 cur <- cur - 1 | |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
427 } |
32 | 428 new: grid maxCol (lines length) |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
429 } |
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
430 } |
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
431 |
20
50a456168c25
Split readFd out of readFile for use in lifter. Add code to read map from stdin to lifter using code in sim
Mike Pavone <pavone@retrodev.com>
parents:
14
diff
changeset
|
432 readFd <- :fd { |
8 | 433 if: fd < 0 { "" } else: { |
434 cur <- "" | |
435 part <- "" | |
436 while: { | |
437 part <- os read: fd 128 | |
438 part != "" | |
439 } do: { | |
440 cur <- cur . part | |
441 } | |
442 cur | |
443 } | |
444 } | |
445 | |
20
50a456168c25
Split readFd out of readFile for use in lifter. Add code to read map from stdin to lifter using code in sim
Mike Pavone <pavone@retrodev.com>
parents:
14
diff
changeset
|
446 readFile <- :path { |
50a456168c25
Split readFd out of readFile for use in lifter. Add code to read map from stdin to lifter using code in sim
Mike Pavone <pavone@retrodev.com>
parents:
14
diff
changeset
|
447 fd <- os open: path (os O_RDONLY) |
50a456168c25
Split readFd out of readFile for use in lifter. Add code to read map from stdin to lifter using code in sim
Mike Pavone <pavone@retrodev.com>
parents:
14
diff
changeset
|
448 out <- readFd: fd |
50a456168c25
Split readFd out of readFile for use in lifter. Add code to read map from stdin to lifter using code in sim
Mike Pavone <pavone@retrodev.com>
parents:
14
diff
changeset
|
449 os close: fd |
50a456168c25
Split readFd out of readFile for use in lifter. Add code to read map from stdin to lifter using code in sim
Mike Pavone <pavone@retrodev.com>
parents:
14
diff
changeset
|
450 out |
50a456168c25
Split readFd out of readFile for use in lifter. Add code to read map from stdin to lifter using code in sim
Mike Pavone <pavone@retrodev.com>
parents:
14
diff
changeset
|
451 } |
50a456168c25
Split readFd out of readFile for use in lifter. Add code to read map from stdin to lifter using code in sim
Mike Pavone <pavone@retrodev.com>
parents:
14
diff
changeset
|
452 |
8 | 453 getMove <- { |
29 | 454 ret <- os read: 0 1 |
455 while: {ret = "\n"} do: { | |
456 ret <- os read: 0 1 | |
457 } | |
458 ret | |
3
bb29dcd46cbf
Put dummy code in placeholder source files. Create makefile.
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
459 } |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
460 |
8 | 461 main <- :args { |
462 if: (args length) < 2 { | |
463 print: "usage: sim filename\n" | |
464 } else: { | |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
465 verbose <- true |
8 | 466 text <- readFile: (args get: 1) |
14 | 467 print: text |
34
ac0df071afe7
Start debugging what bill was working on last night. Currently segfautls.
Mike Pavone <pavone@retrodev.com>
parents:
33
diff
changeset
|
468 //os close: 1 |
8 | 469 simState <- state fromStr: text |
30
031d46ff76a9
minor clean up to use 'if' and 'not'
William Morgan <bill@mrgn.org>
parents:
29
diff
changeset
|
470 while: { not: (simState ended: ) } do: { |
8 | 471 simState advance: (getMove: ) |
25
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
472 if: verbose { |
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
473 simState printGrid |
a224dc43877f
major progress! ...robot always moves down though
William Morgan <bill@mrgn.org>
parents:
24
diff
changeset
|
474 } |
8 | 475 } |
5
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
476 } |
be946b2a2cbc
initial barf into simulator file
William Morgan <bill@mrgn.org>
parents:
3
diff
changeset
|
477 } |
8 | 478 |
3
bb29dcd46cbf
Put dummy code in placeholder source files. Create makefile.
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
479 } |
11
f28e465e9ee6
tried to unf*ck, ashamed rebarfing
William Morgan <bill@mrgn.org>
parents:
10
diff
changeset
|
480 } |