Annotation of 43BSDReno/share/doc/ps1/18.curses/twinkle1.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.