|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: char copyright[] = ! 20: "@(#) Copyright (c) 1980 The Regents of the University of California.\n\ ! 21: All rights reserved.\n"; ! 22: #endif /* not lint */ ! 23: ! 24: #ifndef lint ! 25: static char sccsid[] = "@(#)twinkle1.c 6.2 (Berkeley) 3/17/89"; ! 26: #endif /* not lint */ ! 27: ! 28: # include <curses.h> ! 29: # include <signal.h> ! 30: ! 31: /* ! 32: * the idea for this program was a product of the imagination of ! 33: * Kurt Schoens. Not responsible for minds lost or stolen. ! 34: */ ! 35: ! 36: # define NCOLS 80 ! 37: # define NLINES 24 ! 38: # define MAXPATTERNS 4 ! 39: ! 40: typedef struct { ! 41: int y, x; ! 42: } LOCS; ! 43: ! 44: LOCS Layout[NCOLS * NLINES]; /* current board layout */ ! 45: ! 46: int Pattern, /* current pattern number */ ! 47: Numstars; /* number of stars in pattern */ ! 48: ! 49: char *getenv(); ! 50: ! 51: int die(); ! 52: ! 53: main() ! 54: { ! 55: srand(getpid()); /* initialize random sequence */ ! 56: ! 57: initscr(); ! 58: signal(SIGINT, die); ! 59: noecho(); ! 60: nonl(); ! 61: leaveok(stdscr, TRUE); ! 62: scrollok(stdscr, FALSE); ! 63: ! 64: for (;;) { ! 65: makeboard(); /* make the board setup */ ! 66: puton('*'); /* put on '*'s */ ! 67: puton(' '); /* cover up with ' 's */ ! 68: } ! 69: } ! 70: ! 71: /* ! 72: * On program exit, move the cursor to the lower left corner by ! 73: * direct addressing, since current location is not guaranteed. ! 74: * We lie and say we used to be at the upper right corner to guarantee ! 75: * absolute addressing. ! 76: */ ! 77: die() ! 78: { ! 79: signal(SIGINT, SIG_IGN); ! 80: mvcur(0, COLS - 1, LINES - 1, 0); ! 81: endwin(); ! 82: exit(0); ! 83: } ! 84: ! 85: ! 86: /* ! 87: * Make the current board setup. It picks a random pattern and ! 88: * calls ison() to determine if the character is on that pattern ! 89: * or not. ! 90: */ ! 91: makeboard() ! 92: { ! 93: reg int y, x; ! 94: reg LOCS *lp; ! 95: ! 96: Pattern = rand() % MAXPATTERNS; ! 97: lp = Layout; ! 98: for (y = 0; y < NLINES; y++) ! 99: for (x = 0; x < NCOLS; x++) ! 100: if (ison(y, x)) { ! 101: lp->y = y; ! 102: lp->x = x; ! 103: lp++; ! 104: } ! 105: Numstars = lp - Layout; ! 106: } ! 107: ! 108: /* ! 109: * Return TRUE if (y, x) is on the current pattern. ! 110: */ ! 111: ison(y, x) ! 112: reg int y, x; { ! 113: ! 114: switch (Pattern) { ! 115: case 0: /* alternating lines */ ! 116: return !(y & 01); ! 117: case 1: /* box */ ! 118: if (x >= LINES && y >= NCOLS) ! 119: return FALSE; ! 120: if (y < 3 || y >= NLINES - 3) ! 121: return TRUE; ! 122: return (x < 3 || x >= NCOLS - 3); ! 123: case 2: /* holy pattern! */ ! 124: return ((x + y) & 01); ! 125: case 3: /* bar across center */ ! 126: return (y >= 9 && y <= 15); ! 127: } ! 128: /* NOTREACHED */ ! 129: } ! 130: ! 131: puton(ch) ! 132: reg char ch; ! 133: { ! 134: reg LOCS *lp; ! 135: reg int r; ! 136: reg LOCS *end; ! 137: LOCS temp; ! 138: ! 139: end = &Layout[Numstars]; ! 140: for (lp = Layout; lp < end; lp++) { ! 141: r = rand() % Numstars; ! 142: temp = *lp; ! 143: *lp = Layout[r]; ! 144: Layout[r] = temp; ! 145: } ! 146: ! 147: for (lp = Layout; lp < end; lp++) { ! 148: mvaddch(lp->y, lp->x, ch); ! 149: refresh(); ! 150: } ! 151: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.