Thread View: net.sources.games
1 messages
1 total messages
Started by josh
Tue, 24 Feb 1987 07:19
A modified worms program
Author: josh
Date: Tue, 24 Feb 1987 07:19
Date: Tue, 24 Feb 1987 07:19
273 lines
7907 bytes
7907 bytes
Today came in the news a little program that does worms. It
was late at I had little else to do so I went in and made
it terminal independent.
I think some termcap guru could clean up my coding for
sysinit if they were in the mood. I never have worked with
pure termcap so had not figured out it's little problems.
--Josh Siegel
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
-----cut here-----cut here-----cut here-----cut here-----
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# worms
# This archive created: Tue Feb 24 00:18:33 1987
echo shar: creating directory worms
mkdir worms
cd worms
echo shar: extracting worms.c '(5425 characters)'
sed 's/^XX//' << \SHAR_EOF > worms.c
XX/*
XX * History : Written by tjalk.cs.vu.nl ( I got no name from the article)
XX *
XX * Hacked to use termcap by: Josh Siegel (josh@hi.unm@hc.dspo.gov)
XX *
XX *
XX * Please note, The hack that handles loading the atributes into the system
XX * is exactly that... a hack. I had little time and little want to make
XX * it better.
XX *
XX *
XX * --Josh Siegel
XX *
XX */
XX#define MaxNrOfWorms 32 /* You can't alter this without altering
XX * the zoo! (Zoo: see somewhere else in
XX * this program) */
XX#define MaxLength 256 /* This really is long enough! */
XXint ScreenWidth;
XXint ScreenHeigth;
XXchar cm[16], cl[16];
XX
XX
XX#include <stdio.h>
XX
XX
XXint wormlength = 20;/* 20 by default, can be redefined by
XX * -l<nr> */
XXint nrofworms = 3; /* 3 by default, can be redefined by
XX * -n<nr> */
XXchar *message = " W O R M S ! ! !";
XX/* message can be redifined by -m<string> */
XX
XXint x_direction[8] = {1, 1, 0, -1, -1, -1, 0, 1};
XXint y_direction[8] = {0, 1, 1, 1, 0, -1, -1, -1};
XX
XXint screen[100][100];
XX
XX
XX
XXmain(argc, argv)
XX char **argv;
XX
XX{
XX int wormx[MaxNrOfWorms][MaxLength], wormy[MaxNrOfWorms][MaxLength];
XX int dir[MaxNrOfWorms], i, j;
XX int ptr1, ptr2, x, y, *direction;
XX long dummy;
XX char *pos();
XX
XX
XX /* First test for any flags... */
XX
XX for (i = 1; i < argc; i++)
XX if (argv[i][0] == '-') {
XX switch (argv[i][1]) {
XX case 'l':
XX if (
XX sscanf(argv[i], "-l%d", &wormlength) == 0 ||
XX wormlength < 2 || wormlength > MaxLength) {
XX puts("Bad length.");
XX exit(1);
XX } break;
XX case 'n':
XX if (
XX sscanf(argv[i], "-n%d", &nrofworms) == 0 ||
XX nrofworms < 1 || nrofworms > MaxNrOfWorms) {
XX puts("Bad number of worms.");
XX exit(1);
XX } break;
XX case 'm':
XX message = argv[i] + 2;
XX break;
XX default:
XX printf(" -%c: bad option.\n", argv[i][1]);
XX exit(1);
XX }
XX } else {
XX printf("Syntax: %s [ -l<nr> ] [ -n<nr> ] \
XX[ -m<message> ]\n", argv[0]);
XX exit(1);
XX }
XX
XX /* Now let's initialize !! */
XX
XX initsys();
XX clear_screen();
XX printf("%s%s", pos(0, 22), message);
XX
XX for (j = 0; j < nrofworms; j++) {
XX for (i = 0; i < wormlength; i++)
XX wormx[j][i] = wormy[j][i] = 0;
XX dir[j] = 1; /* direction of worm j */
XX }
XX
XX screen[0][0] = nrofworms * wormlength;
XX ptr1 = ptr2 = 0;
XX /* They point to the front and the back of a worm, respectively. */
XX
XX
XX /* init randomizer... I hope this will work, it works on UNIX */
XX srand((int) time(&dummy));
XX
XX
XX
XX
XX while (1) {
XX ptr2 = (ptr1 + 1) % wormlength;
XX /* Take the next part of each worm. */
XX
XX for (i = 0; i < nrofworms; i++) {
XX int enough = 0;
XX
XX x = wormx[i][ptr2];
XX y = wormy[i][ptr2];
XX /*
XX * x and y are the coordinates of the tail of worm i, /* which has
XX * to be removed.
XX */
XX if ((--screen[x][y]) == 0)
XX printf("%s ", pos(x, y));
XX /*
XX * It will only be removed when there are no other /* "parts" of
XX * worms on that spot on the screen.
XX */
XX
XX /* Now put a head somewhere. */
XX /*
XX * We'll modify the direction just until we've got a correct
XX * direction (so that the worm will not cross or overlap another
XX * worm or itself, nor will run of the screen), or that we've had
XX * enough, since than there probably is no such direction.
XX */
XX
XX direction = &dir[i];
XX
XX do
XX *direction = (*direction + (rand()) % 3 + 7) % 8;
XX while ((x = wormx[i][ptr1] + x_direction[*direction]) < 0 ||
XX x > ScreenWidth - 1 ||
XX (y = wormy[i][ptr1] + y_direction[*direction]) < 0 ||
XX y > ScreenHeigth - 2 ||
XX ((screen[x][y] != 0 || cross(x, y, *direction))
XX && enough++ < 19));
XX
XX if (enough >= 19) { /* We can't move this poor worm */
XX x = wormx[i][ptr1]; /* old coordinates */
XX y = wormy[i][ptr1];
XX }
XX /*
XX * x and y now contain the new coordinates of the worms head. Let's
XX * just place it on the screen (and in memory)
XX */
XX wormx[i][ptr2] = x;
XX wormy[i][ptr2] = y;
XX printf("%s%c", pos(x, y),
XX "*#Ox@~.+!&%$'`=-oXwW()^~*#x0@+./"[i]);
XX /* Welcome to the zoo!! ^^^^ */
XX screen[x][y]++;
XX }
XX ptr1 = ptr2;
XX }
XX}
XX
XX
XX
XX
XXcross(x, y, d)
XX{ /* keeps two worms from crossing */
XX
XX
XX
XX
XX
XX if (d & 1 == 0)
XX return 0; /* worm moving diogonally? */
XX
XX return (screen[x][y - y_direction[d]] && screen[x - x_direction[d]][y]);
XX}
XX
XX/*
XX * I assume there are betters ways of doing this but since I had no
XX * interest in spending more then 5 minutes making this use termcap ...
XX */
XX
XXinitsys()
XX{
XX static char hasrun = 0, bp[1024], bp2[1024], *tgetstr(), *p1;
XX char *tmp;
XX
XX tgetent(bp, getenv("TERM"));
XX strcpy(bp2, bp);
XX p1 = bp2;
XX tmp = tgetstr("cl", &p1);
XX strcpy(cl, tmp);
XX strcpy(bp2, bp);
XX p1 = bp2;
XX tmp = tgetstr("cm", &p1);
XX strcpy(cm, tmp);
XX strcpy(bp2, bp);
XX p1 = bp2;
XX if ((ScreenHeigth = tgetnum("li", &p1) - 1) > 99) {
XX printf("I cannot handle a terminal that has more then 99 lines\n");
XX exit(0);
XX }
XX strcpy(bp2, bp);
XX p1 = bp2;
XX if ((ScreenWidth = tgetnum("co", &p1) - 1) > 99) {;
XX printf("I cannot handle a terminal that has more then 99 rows\n");
XX exit(0);
XX }
XX}
XX
XXchar *
XXpos(x, y)
XX{
XX char *ret, *tgoto();
XX
XX ret = tgoto(cm, x, y);
XX return ret;
XX}
XX
XX
XX
XXclear_screen()
XX{
XX puts(cl);
XX}
SHAR_EOF
if test 5425 -ne "`wc -c worms.c`"
then
echo shar: error transmitting worms.c '(should have been 5425 characters)'
fi
echo shar: extracting Makefile '(60 characters)'
sed 's/^XX//' << \SHAR_EOF > Makefile
XXCFLAGS= -O
XX
XXworms:worms.o
XX ${CC} ${CFLAGS} -o worms worms.o
SHAR_EOF
if test 60 -ne "`wc -c Makefile`"
then
echo shar: error transmitting Makefile '(should have been 60 characters)'
fi
echo shar: done with directory worms
cd ..
# End of shell archive
exit 0
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads