The software is released as Freeware. No obligations to support it or warranties are made hereby, use it at your own risk. You may freely copy and/or modify the software for any non-commercial use, you must however retain the original documentation provided with it unmodified. If you make any modifications you think could be worth merging into the software, or if you have any bug reports/clever suggestions, or if you just want to thank us for the game - your mail will be appreciated, just
mail Vassilii
mail Lev.

The most recent version can be found at If you want a notification for every update, mail Vassilii about that. Share and enjoy!



Boa is a multi-player clone of the good old worm(6) game. Sounds primitive? The game proved to be very addictive when tested in the WISDOM computation center during summer, 1996.

The game includes a server (boaserv), an interactive client (boa) and a robot client (boabot).


  1. The original UNIX® version.
  2. The two-player clone NIBBLES.BAS, distributed with MS-DOS®
  3. Brian Swetland - for our vt100 emulator for the 3Com® PalmPilot®. This program inspired the variable size support implementation, as well as the PalmPilot section of this manual.
  4. Dmitrii Rubinstein and Brian Swetland - for finaly making Vassilii finish this manual and release the game.


May 1996
Lev and Vassilii play NIBBLES.BAS many times on an MDA IBM PC/AT (dedicated machine for playing games while waiting for the jobs coming out of the nearby printer
May 1996
Lev writes the initial prototype of boaserv and boa for SGI® IRIX(TM) 5. This version has numerous network-related bugs, e.g. the program crashes when the third party connects.
June 1996
Vassilii joins the development; the codebase is moved to a GNU RCS archive. Vassilii takes over the server part, Lev concentrates on the client, however occasional patches are done here and there by both.
June-July 1996
The server logic is re-written, the network protocol is debugged and then significantly improved. The client outgrows the initial hackish code and is redesigned from scratch in real C++; an abstract client API created. boabot written atop it.
July 1996
Development completely abandoned after overall of about a week of joint work invested into it. All the faculty computational center frequent visitors are playing. People start playing from remote hosts on the campus and the server records new connections around the clock. The mania continues until September. The robotic client still has bugs, yet people are too angry with its competing ability to make further improvements desirable.
9-10/August 1997
Vassilii ports the game to Linux, SunOS(TM) and gnuwin32. During the ports, numerous byte-order and sockets programming bugs are suddenly discovered and eliminated.
2/November 1997
Vassilii adds the size and delay command-line options to make it possible to play from a vt100 emulator for the 3Com® PalmPilot®.


  1. I assume you have a `make' utility that is intelligent enough to cope with my GNU makefile, and a modern g++ (I recommend either 2.6.4 or a 2.7.2.x by today). Otherwise you will have to play with the makefile.
  2. Determine your architecture (run `uname -a' if in doubt). Then assume that arch below is one of sgi, linux, sun or gnuwin32, whichever is appropriate for your platform. If in doubt, try all the possibilities. The code has at least one unportable point in it, and I am sure it has other ones; so chances are that you'll have to tweak with the sources if you have another platform.
  3. make -f Makefile.arch
  4. cd bin.arch
  5. cp boa boaserv boabot /usr/local/games
    or to whatever location you want it to be run from later.
  6. Check the executables' permissions (chmod(1), umask(1)) and you are done.


By default the game uses tcp port 5555; the field is 80 columns wide and 24 lines high by default.

The rules are similar to the original worm(6).

  1. The obstacles are:
  2. Each prize you eat adds to your points and your length its value. Each time your length gets a multiple of 60 you are awarded an extra life. Each time you loose a life your length is truncated to 2. Initially you are given 3 lives.
  3. The game objective becomes totally different. If you play alone, it is the same as in the original game, of course. If you choose adding robots, life becomes difficult. Can you attack a robot and make it die? How about making him spending his lives faster than he is gaining them? How many robots can you co-exist with, still attacking? How many still just surviving?

    Multi-player games with more than one human are much more amusing. I know fanatics that could easily tell who exactly was driving a specific worm - and can you tell a robot from an experienced player remotely? Can you pretend that you are a robot and fool your friend that answers "yes" to the previous question?


Just run it for a default game. For more info, see the following excerpt from wserver.cpp:

	Usage examples:
		boaserv 239
			to run on port other than DEFAULT_PORT
		boaserv 239 40
			to run on port other than DEFAULT_PORT
			with field width other than FIELD_WIDTH
		boaserv 239 40 20
			with field height other than FIELD_HEIGHT
main(int argc, char **argv)
	int nWidth, nHeight;

	nWidth = (argc > 2)?atoi(argv[2]):FIELD_WIDTH;
	nHeight = (argc > 3)?atoi(argv[3]):FIELD_HEIGHT;
	// Shrink larger fields so that the hardwired boabot doesn't crash
	if (nWidth > FIELD_WIDTH) nWidth = FIELD_WIDTH;
	if (nHeight > FIELD_HEIGHT) nHeight = FIELD_HEIGHT;


Prints its usage when run without arguments:

% boa 
Usage: boa <server>[:<port>] [--<digit>] [oldchar=newchar ...]

        <digit> is 1 by default, it gives the # of tenths of a second
                you are given to enter the input after the screen update
        If no remapping of the form oldchar=newchar is given, the following
        controls are in effect during the game (like in vi(1)):
                Left -- cursor left, or 'h'
                Down -- cursor down, or 'j'
                Up -- cursor up, or 'k'
                Right -- cursor right, or 'l'
                Quit -- 'q'

        Oldchar is any of [hjklq], newchar is any single char

                        boa wormserver h=o j=a k=q l=p q=Q

                enables the following controls:

                        Left -- 'o'
                        Down -- 'a'
                        Up -- 'q'
                        Right -- 'p'
                        Quit -- 'Q'


Prints its usage when run without arguments:

% boabot
Usage: boabot <server>[:<port>]

Must be run before the other clients connect.


I use the following settings when playing the game from my PDA:
	% boaserv 5555 40
to run the server, and the following tcsh(1) alias setting in my .cshrc:
	% alias ww boa localhost --3 h=v 'j=^L' 'k=^K' l=u

^L and ^M above signify the symbols "Ctrl-L" and "Ctrl-M", respectively. The --3 argument is to make the LCD display update be easily seen before the time to respond with a new move is over. So the controls become the pilot keys "Page Up" and "Page Down" for the vertical motion, and graffiti "u" and "v" for horisontal motion. Note that you can enter these as "V" drawn left to the right for "u" and right to the left for "v", which is almost as simple and easy to associate with horizontal motion as strait horizontal lines.

I have currently been playing with the Brian's vt100 emulator ALPHA 5 at 2400 baud. (See also the About section). As soon as he adds keymap support, it will be much easier to play. Or use a keymap hack if you are impatient.



Last updated: $Date: 1999/05/10 13:53:56 $ by $Author: vassilii $