Remote agent/Simulation: Difference between revisions
Content added Content deleted
(Simplified: Binary I/O not necessary) |
(Added walls and debug display) |
||
Line 2: | Line 2: | ||
=={{header|PicoLisp}}== |
=={{header|PicoLisp}}== |
||
Here is my first attempt on the server part. It works |
Here is my first attempt on the server part. It works. After starting |
||
(gameServer), you can connect with 'telnet', type the commands, and see the |
|||
responses. |
|||
<lang PicoLisp>(load "@lib/simul.l") |
<lang PicoLisp>(load "@lib/simul.l") |
||
Line 14: | Line 16: | ||
# The server port |
# The server port |
||
(setq *Port (port |
(setq *Port (port 54545)) |
||
# Return a random Field |
# Return a random Field |
||
Line 20: | Line 22: | ||
(get *World (rand 1 DX) (rand 1 DY)) ) |
(get *World (rand 1 DX) (rand 1 DY)) ) |
||
# Create a world of size 'DX' * 'DY' with ' |
# Create a world of size 'DX' * 'DY' with 'Balls' and 'Walls' |
||
(de makeWorld (DX DY |
(de makeWorld (DX DY Balls Walls) |
||
( |
(when (>= Balls (* DX DY)) |
||
(quit "Too many balls") ) |
|||
(when (>= Walls (* (dec DX) (dec DY))) |
|||
(quit "Too many walls") ) |
|||
(for Column (setq *World (grid DX DY)) # Initialize fields |
|||
(for This Column |
(for This Column |
||
(let Color (get '(R G Y B) (rand 1 4)) |
(let Color (get '(R G Y B) (rand 1 4)) |
||
(=: field Color) |
(=: field Color) # Set field color |
||
(when ( |
(when (ge0 (dec 'Balls)) |
||
(until |
(until |
||
(with (randomField DX DY) |
(with (randomField DX DY) # Find a field without ball |
||
(unless ( |
(unless (: ball) # and set a ball |
||
(=: ball Color |
(=: ball Color) ) ) ) ) ) ) ) |
||
(do Walls # Create walls |
|||
(until |
|||
(let |
|||
(Field (randomField DX DY) # Try random field |
|||
F (if (rand T) car cdr) # and random side |
|||
G (if (rand T) '(car set . con) '(cdr con . set)) |
|||
Old ((car G) (F (val Field))) ) |
|||
(when Old |
|||
((cadr G) (F (val Field)) NIL) # Remove connections to neighbor |
|||
((cddr G) (F (val Old)) NIL) |
|||
(or |
|||
(reachable? Field (* DX DY)) # Field still reachable? |
|||
(nil # No: Restore connections |
|||
((cadr G) (F (val Field)) Old) |
|||
((cddr G) (F (val Old)) Field) ) ) ) ) ) ) ) |
|||
# Test whether a field is reachable |
|||
(de reachable? (Field Fields) |
|||
(let Visited NIL |
|||
(recur (Field) |
|||
(when (and Field (not (memq Field Visited))) |
|||
(push 'Visited Field) |
|||
(recurse (west Field)) |
|||
(recurse (east Field)) |
|||
(recurse (south Field)) |
|||
(recurse (north Field)) ) ) |
|||
(= Fields (length Visited)) ) ) |
|||
# Test for ending condition |
# Test for ending condition |
||
Line 45: | Line 78: | ||
# Initialize for a new game |
# Initialize for a new game |
||
(de newGame (DX DY |
(de newGame (DX DY Balls Walls) |
||
(makeWorld DX DY |
(makeWorld DX DY Balls Walls) |
||
(setq |
(setq |
||
*Agent (randomField DX DY) |
*Agent (randomField DX DY) |
||
Line 61: | Line 94: | ||
(out *Sock (prin "A")) # Greeting |
(out *Sock (prin "A")) # Greeting |
||
(when (= "A" (char)) |
(when (= "A" (char)) |
||
(newGame |
(newGame 8 8 20 40) |
||
(while (char) |
(while (char) |
||
(out *Sock |
(out *Sock |
||
Line 89: | Line 122: | ||
(T (=: ball *Ball) (off *Ball)) ) ) ) ) |
(T (=: ball *Ball) (off *Ball)) ) ) ) ) |
||
(prin ".") ) ) ) ) # Stop event |
(prin ".") ) ) ) ) # Stop event |
||
(bye) ) |
(bye) ) |
||
# Visualize (debug) |
|||
(de showWorld () |
|||
(disp *World 0 |
|||
'((This) |
|||
(pack |
|||
(if (== *Agent This) "*" " ") |
|||
(: field) |
|||
(if (: ball) (lowc @) " ") ) ) ) )</lang> |
|||
For testing, you can start also it interactively: |
|||
<pre>: (newGame 8 8 20 40) (showWorld) |
|||
+---+---+---+---+---+---+---+---+ |
|||
8 | R Y | B | R R Br| Rb Br| |
|||
+ + + + + +---+---+ + |
|||
7 | Yy G G Gb| Y Gg Rr| Y | |
|||
+---+ + + +---+ +---+ + |
|||
6 | R Y B Rr *G Y | Y Br| |
|||
+---+---+ + +---+---+ +---+ |
|||
5 | B Ry G R | Yy Yy Y | B | |
|||
+ +---+---+ +---+ +---+ + |
|||
4 | R | R R Gg B G B Y | |
|||
+ +---+---+ +---+---+ + + |
|||
3 | R Rr| Y B G | Yr B | R | |
|||
+ + +---+---+---+ + +---+ |
|||
2 | Y | B | B Bb Gr B B Yy| |
|||
+ + + + +---+ +---+ + |
|||
1 | Rr| R G Gr R G R | G | |
|||
+---+---+---+---+---+---+---+---+ |
|||
a b c d e f g h</pre> |
|||
This displays the field colors in upper case letters, the balls in lower case |
|||
letters, and the position of the agent with an asterisk. |