🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: net.sources.games
1 messages
1 total messages Started by josh Tue, 24 Feb 1987 07:19
A modified worms program
#825
Author: josh
Date: Tue, 24 Feb 1987 07:19
273 lines
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