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, you can connect with 'telnet', type the commands, and see the responses.
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 6789))
(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 'Percent' balls in it
# Create a world of size 'DX' * 'DY' with 'Balls' and 'Walls'
(de makeWorld (DX DY Percent)
(de makeWorld (DX DY Balls Walls)
(for Column (setq *World (grid DX DY))
(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 (>= Percent (rand 1 100))
(when (ge0 (dec 'Balls))
(until
(until
(with (randomField DX DY)
(with (randomField DX DY) # Find a field without ball
(unless (=: ball)
(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 Percent)
(de newGame (DX DY Balls Walls)
(makeWorld DX DY Percent)
(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 12 9 10)
(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) )</lang>
(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.