 51ffecc181
			
		
	
	
		51ffecc181
		
	
	
	
	
		
			
			. abandons mixer, gomoku, talk, talkd, top from base system . compile top with clang so no ack-compiled program needs -lcurses any more
		
			
				
	
	
		
			162 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| .\"	$NetBSD: life.c,v 1.6 2003/08/07 16:44:28 agc Exp $
 | |
| .\"
 | |
| .\" Copyright (c) 1980, 1993
 | |
| .\"	 The Regents of the University of California.  All rights reserved.
 | |
| .\"
 | |
| .\" Redistribution and use in source and binary forms, with or without
 | |
| .\" modification, are permitted provided that the following conditions
 | |
| .\" are met:
 | |
| .\" 1. Redistributions of source code must retain the above copyright
 | |
| .\"    notice, this list of conditions and the following disclaimer.
 | |
| .\" 2. Redistributions in binary form must reproduce the above copyright
 | |
| .\"    notice, this list of conditions and the following disclaimer in the
 | |
| .\"    documentation and/or other materials provided with the distribution.
 | |
| .\" 3. Neither the name of the University nor the names of its contributors
 | |
| .\"    may be used to endorse or promote products derived from this software
 | |
| .\"    without specific prior written permission.
 | |
| .\"
 | |
| .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | |
| .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | |
| .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | |
| .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | |
| .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | |
| .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | |
| .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | |
| .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | |
| .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | |
| .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | |
| .\" SUCH DAMAGE.
 | |
| .\"
 | |
| .\"	@(#)life.c	8.1 (Berkeley) 6/8/93
 | |
| .\"
 | |
| # include	<curses.h>
 | |
| # include	<signal.h>
 | |
| 
 | |
| /*
 | |
|  *	Run a life game.  This is a demonstration program for
 | |
|  * the Screen Updating section of the -lcurses cursor package.
 | |
|  */
 | |
| 
 | |
| typedef struct lst_st {			/* linked list element */
 | |
| 	int		y, x;		/* (y, x) position of piece */
 | |
| 	struct lst_st	*next, *last;	/* doubly linked */
 | |
| } LIST;
 | |
| 
 | |
| LIST	*Head;			/* head of linked list */
 | |
| 
 | |
| int	die();
 | |
| 
 | |
| main(ac, av)
 | |
| int	ac;
 | |
| char	*av[];
 | |
| {
 | |
| 	evalargs(ac, av);		/* evaluate arguments */
 | |
| 
 | |
| 	initscr();			/* initialize screen package */
 | |
| 	signal(SIGINT, die);		/* set to restore tty stats */
 | |
| 	cbreak();			/* set for char-by-char */
 | |
| 	noecho();			/*	input */
 | |
| 	nonl();				/* for optimization */
 | |
| 
 | |
| 	getstart();			/* get starting position */
 | |
| 	for (;;) {
 | |
| 		prboard();		/* print out current board */
 | |
| 		update();		/* update board position */
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * This is the routine which is called when rubout is hit.
 | |
|  * It resets the tty stats to their original values.  This
 | |
|  * is the normal way of leaving the program.
 | |
|  */
 | |
| die()
 | |
| {
 | |
| 	signal(SIGINT, SIG_IGN);		/* ignore rubouts */
 | |
| 	mvcur(0, COLS - 1, LINES - 1, 0);	/* go to bottom of screen */
 | |
| 	endwin();				/* set terminal to good state */
 | |
| 	exit(0);
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Get the starting position from the user.  They keys u, i, o, j, l,
 | |
|  * m, ,, and . are used for moving their relative directions from the
 | |
|  * k key.  Thus, u move diagonally up to the left, , moves directly down,
 | |
|  * etc.  x places a piece at the current position, " " takes it away.
 | |
|  * The input can also be from a file.  The list is built after the
 | |
|  * board setup is ready.
 | |
|  */
 | |
| getstart()
 | |
| {
 | |
| 	reg char	c;
 | |
| 	reg int		x, y;
 | |
| 	auto char	buf[100];
 | |
| 
 | |
| 	box(stdscr, '|', '_');		/* box in the screen */
 | |
| 	move(1, 1);			/* move to upper left corner */
 | |
| 
 | |
| 	for (;;) {
 | |
| 		refresh();		/* print current position */
 | |
| 		if ((c = getch()) == 'q')
 | |
| 			break;
 | |
| 		switch (c) {
 | |
| 		  case 'u':
 | |
| 		  case 'i':
 | |
| 		  case 'o':
 | |
| 		  case 'j':
 | |
| 		  case 'l':
 | |
| 		  case 'm':
 | |
| 		  case ',':
 | |
| 		  case '.':
 | |
| 			adjustyx(c);
 | |
| 			break;
 | |
| 		  case 'f':
 | |
| 			mvaddstr(0, 0, "File name: ");
 | |
| 			getstr(buf);
 | |
| 			readfile(buf);
 | |
| 			break;
 | |
| 		  case 'x':
 | |
| 			addch('X');
 | |
| 			break;
 | |
| 		  case ' ':
 | |
| 			addch(' ');
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (Head != NULL)			/* start new list */
 | |
| 		dellist(Head);
 | |
| 	Head = malloc(sizeof (LIST));
 | |
| 
 | |
| 	/*
 | |
| 	 * loop through the screen looking for 'x's, and add a list
 | |
| 	 * element for each one
 | |
| 	 */
 | |
| 	for (y = 1; y < LINES - 1; y++)
 | |
| 		for (x = 1; x < COLS - 1; x++) {
 | |
| 			move(y, x);
 | |
| 			if (inch() == 'x')
 | |
| 				addlist(y, x);
 | |
| 		}
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Print out the current board position from the linked list
 | |
|  */
 | |
| prboard() {
 | |
| 
 | |
| 	reg LIST	*hp;
 | |
| 
 | |
| 	erase();			/* clear out last position */
 | |
| 	box(stdscr, '|', '_');		/* box in the screen */
 | |
| 
 | |
| 	/*
 | |
| 	 * go through the list adding each piece to the newly
 | |
| 	 * blank board
 | |
| 	 */
 | |
| 	for (hp = Head; hp; hp = hp->next)
 | |
| 		mvaddch(hp->y, hp->x, 'X');
 | |
| 
 | |
| 	refresh();
 | |
| }
 |