/*****************************************************************************/ /* File : LINES.C Copyright (c) 1992 */ /* */ /* Author : Kenneth W. Hartlen */ /* Address : Box 37, Site 6, RR#3 */ /* Armdale, Nova Scotia */ /* B3L 4J3 Canada */ /* */ /* Purpose : Simple program that uses graphics commands and can be */ /* be compiled in Lattice, Sozobon and Turbo C. */ /* */ /* The program draws a Qix like object on the screen that */ /* moves around and rebounds off the sides of the screen. */ /* */ /*****************************************************************************/ /* Compiling with Lattice C: */ /* lc.ttp -fm lines.c */ /* clink.ttp c.o+lines.o */ /* LIB graphics.lib+lcm.lib+lcg.lib+lc.lib */ /* TO lines.prg */ /* */ /* Compiling with Sozobon C v2.0: */ /* cc -c lines.c */ /* cc -o lines.prg -r lines.o graphics.a aesfast.a vdifast.a */ /* */ /* Compiling with Heat & Serve Sozobon C v1.33i: */ /* cc -c lines.c */ /* cc -o lines.prg lines.o graphics.a libm.a aesfast.a \ */ /* vdifast.a */ /* */ /* Compiling with Turbo C: */ /* Use Turbo C's IDE */ /* */ /*****************************************************************************/ #ifdef SOZOBON /* Causes some graphics functions to */ #define __MAIN_SRC__ /* to be included with user's source */ #endif #include /* common header files */ #include #ifndef SOZOBON /* Ignore header files not available */ #include /* to Sozobon users */ #include #endif #ifdef __TURBOC__ /* include appropriate header file */ #include /* for kbhit() function */ #else #include #endif /*****************************************************************************/ /* Main program loop */ /*****************************************************************************/ #define MAXLINES 100 /* maximum # of lines to display */ #define MAXINC 20 /* maximum distance between lines */ void main() { int graphdriver = DETECT, graphmode; int maxX, /* save getmaxx() result */ maxY, /* save getmaxy() result */ numLines, /* # of lines to display */ stepInc; /* distance between the lines */ int i, /* array indices used to treat */ j, /* arrays as a circular list to */ k; /* eliminate copying array contents */ int x1[MAXLINES+1],y1[MAXLINES+1], /* xy coords for end #1 */ x2[MAXLINES+1],y2[MAXLINES+1]; /* xy coords for end #2 */ int stepx1, /* how much to move x1 */ stepx2, /* how much to move x2 */ stepy1, /* how much to move y1 */ stepy2; /* how much to move y2 */ #ifdef __TURBOC__ struct time now; #endif #ifdef __TURBOC__ /* get system time for use as the */ gettime(&now); /* random number generator seed */ srand(now.ti_sec); #else srand(Tgettime()); #endif /* initialize graphics */ initgraph(&graphdriver,&graphmode,""); maxX = getmaxx(); /* save values to eliminate */ maxY = getmaxy(); /* function call in the do loop */ setwritemode(XOR_PUT); setcolor(WHITE); settextjustify(CENTER_TEXT,TOP_TEXT); outtextxy(maxX/2,maxY/3,"LINES DEMO"); outtextxy(maxX/2,maxY/3+textheight("H")*2,"by Kenneth W. Hartlen"); outtextxy(maxX/2,maxY/3+textheight("H")*4,"Copyright (c) 1992"); outtextxy(maxX/2,maxY/3+textheight("H")*7,"press a key to end"); rectangle(0,0,maxX,maxY); /* initialize variables */ numLines = (rand() % MAXLINES) + 1; /* how many lines? */ stepInc = (rand() % MAXINC) + 1; /* how far apart? */ stepx1=((rand()%stepInc) + 1) * (rand()%2 ? 1 : -1); stepy1=((rand()%stepInc) + 1) * (rand()%2 ? 1 : -1); stepx2=((rand()%stepInc) + 1) * (rand()%2 ? 1 : -1); stepy2=((rand()%stepInc) + 1) * (rand()%2 ? 1 : -1); for(k=1;k<=numLines;k++) { x1[k]= y1[k]= x2[k] = y2[k] = 0; } i=1 ; j=0 ; k=2; /* determine end points for first line */ x1[j]=rand()%maxX ; y1[j]=rand()%maxY; x2[j]=rand()%maxX ; y2[j]=rand()%maxY; do { /* move the line and save the coords */ if ((x1[j]+stepx1<0) || (x1[j]+stepx1>maxX)) stepx1=-stepx1; x1[i]=x1[j]+stepx1; if ((y1[j]+stepy1<0) || (y1[j]+stepy1>maxY)) stepy1=-stepy1; y1[i]=y1[j]+stepy1; if ((x2[j]+stepx2<0) || (x2[j]+stepx2>maxX)) stepx2=-stepx2; x2[i]=x2[j]+stepx2; if ((y2[j]+stepy2<0) || (y2[j]+stepy2>maxY)) stepy2=-stepy2; y2[i]=y2[j]+stepy2; /* draw the new line in a visible colour */ line(x1[i],y1[i],x2[i],y2[i]); /* update array indices */ if (i+1>numLines) i=1; else i++; if (j+1>numLines) j=1; else j++; if (k+1>numLines) k=1; else k++; /* erase the k th line */ line(x1[k],y1[k],x2[k],y2[k]); } while (!kbhit()); /* while key not pressed */ closegraph(); /* close graphics */ return; } /* main */