/* A Flying Space Ship Program */ #include #include #include #include #include #include int drawship(); int drawland(int y_str); int main () { clrscr (); int gdriver = DETECT, gmode, errorcode; initgraph (&gdriver, &gmode, "d:\\tc\\bgi"); errorcode = graphresult (); if (errorcode != grOk) { printf ("Graphics error: %s\n", grapherrormsg (errorcode)); printf ("Press Anykey to halt: "); getch (); exit (1); } /* "graphics main prorgam lines" go here */ int y_str, y_end; y_str = getmaxy() / 2 + 60; //x_str = getmaxx(); while ( !kbhit() ) { y_end = drawland(y_str); y_str = y_end; drawship(); cleardevice(); } //drawland(); getch (); closegraph (); return 0; } int drawship() { int MaxX, MaxY, MaxColors; MaxX = getmaxx(); MaxY = getmaxy(); static int r = 20; static int StartX = 100; static int StartY = 50; struct viewporttype vp; struct viewporttype vp1; struct viewporttype vp2; int PauseTime, x, y, ulx, uly, lrx, lry, size, size1, i, width, height, step, step1, y1, x1, width1, height1, height2, width2, x2, y2, step2, size2; void *Saucer; void *TyFighter; void *Sun; /* Space Ship */ getviewsettings( &vp ); setfillstyle( SOLID_FILL, getmaxcolor() ); //main part ellipse(StartX, StartY, 0, 360, r, (r/3)+2); line(StartX+7, StartY+7, StartX+12, StartY+13); //Bellow wheels circle(StartX+12, StartY+13, 2); line(StartX-7, StartY+7, StartX-12, StartY+13); circle(StartX-12, StartY+13, 2); line(StartX, StartY-8, StartX, StartY-15); //entena on top circle(StartX, StartY-15, 1); line(StartX-4, StartY-15, StartX-5, StartY-15); // line around entena line(StartX+4, StartY-15, StartX+5, StartY-15); line(StartX, StartY-19, StartX, StartY-20); line(StartX-3, StartY-17, StartX-4, StartY-18); line(StartX+3, StartY-17, StartX+4, StartY-18); line(StartX-23, StartY, StartX-20, StartY); //lines on the side line(StartX+20, StartY, StartX+23, StartY); ellipse(StartX-6, StartY-3, 0, 360, 3, 2); // eyes ellipse(StartX+6, StartY-3, 0, 360, 3, 2); ellipse(StartX-6, StartY-3, 0, 360, 1, 1); // iner eyes ellipse(StartX+6, StartY-3, 0, 360, 1, 1); ellipse(StartX, StartY+2, 200, 340, 8, 2); //mouth /* Read saucer image */ ulx = StartX-(r+3); uly = StartY-20; lrx = StartX+(r+3); lry = StartY+(r/3)+10; /*ulx = StartX-(r+1); uly = StartY-14; lrx = StartX+(r+1); lry = StartY+(r/3)+3; */ width = lrx - ulx + 1; height = lry - uly + 1; size = imagesize(ulx, uly, lrx, lry); Saucer = malloc( size ); getimage(ulx, uly, lrx, lry, Saucer); putimage(ulx, uly, Saucer, XOR_PUT); /* Ty Fighter */ getviewsettings( &vp1 ); circle(StartX, StartY, r-5); //main circle ellipse(StartX-22, StartY-8, 200, 0, 8, 4); //left side of attachment ellipse(StartX-22, StartY+8, 0, 160, 8, 4); ellipse(StartX+22, StartY-8, 180, 340, 8, 4); //right side of attachment ellipse(StartX+22, StartY+8, 20, 180, 8, 4); line(StartX-30, StartY-20, StartX-30, StartY+20); //left side wing line(StartX-30, StartY-20, StartX-32, StartY-22); line(StartX-32, StartY-22, StartX-34, StartY-20); line(StartX-30, StartY+20, StartX-32, StartY+22); line(StartX-32, StartY+22, StartX-34, StartY+20); line(StartX-34, StartY-20, StartX-34, StartY+20); line(StartX-32, StartY-6, StartX-32, StartY+6); line(StartX+30, StartY-20, StartX+30, StartY+20); //right side wing line(StartX+30, StartY-20, StartX+32, StartY-22); line(StartX+32, StartY-22, StartX+34, StartY-20); line(StartX+30, StartY+20, StartX+32, StartY+22); line(StartX+32, StartY+22, StartX+34, StartY+20); line(StartX+34, StartY-20, StartX+34, StartY+20); line(StartX+32, StartY-6, StartX+32, StartY+6); circle(StartX, StartY, 7); //window circle(StartX, StartY, 1); line(StartX-1, StartY, StartX-7, StartY); line(StartX+1, StartY, StartX+7, StartY); line(StartX, StartY, StartX-5, StartY-5); line(StartX, StartY, StartX+5, StartY+5); line(StartX, StartY, StartX-5, StartY+5); line(StartX, StartY, StartX+5, StartY-5); ellipse(StartX-23, StartY-4, 270, 0, 7, 4); //left side decal ellipse(StartX-23, StartY+4, 0, 90, 7, 4); ellipse(StartX+23, StartY-4, 180, 270, 7, 4); //right side decal ellipse(StartX+23, StartY+4, 90, 180, 7, 4); line(StartX, StartY-15, StartX, StartY-17); //lights on ship line(StartX-8, StartY+14, StartX-8, StartY+16); line(StartX+8, StartY+14, StartX+8, StartY+16); /* Read fighter image */ ulx = StartX-(r+14); uly = StartY-22; lrx = StartX+(r+14); lry = StartY+(r/3)+16; width1 = lrx - ulx + 1; height1 = lry - uly + 1; size1 = imagesize(ulx, uly, lrx, lry); TyFighter = malloc( size1 ); getimage(ulx, uly, lrx, lry, TyFighter); putimage(ulx, uly, TyFighter, XOR_PUT); /* sun */ getviewsettings( &vp2 ); circle(StartX, StartY, r-5); line(StartX-19, StartY, StartX-28, StartY); line(StartX+19, StartY, StartX+28, StartY); line(StartX, StartY-19, StartX, StartY-28); line(StartX, StartY+19, StartX, StartY+28); line(StartX-13, StartY-13, StartX-20, StartY-20); line(StartX+13, StartY+13, StartX+20, StartY+20); line(StartX-13, StartY+13, StartX-20, StartY+20); line(StartX+13, StartY-13, StartX+20, StartY-20); ellipse(StartX-6, StartY-4, 0, 360, 3, 2); ellipse(StartX+6, StartY-4, 0, 360, 3, 2); ellipse(StartX, StartY+4, 200, 340, 8, 3); ulx = StartX-(r+10); uly = StartY-30; lrx = StartX+(r+10); lry = StartY+(r/3)+22; width2 = lrx - ulx + 1; height2 = lry - uly + 1; size2 = imagesize(ulx, uly, lrx, lry); Sun = malloc( size2 ); getimage(ulx, uly, lrx, lry, Sun); putimage(ulx, uly, Sun, XOR_PUT); /* setfillstyle( SOLID_FILL, getmaxcolor() ); fillellipse(StartX, StartY, r, (r/3)+2); ellipse(StartX, StartY-4, 190, 357, r, r/3); line(StartX+7, StartY-6, StartX+10, StartY-12); circle(StartX+10, StartY-12, 2); line(StartX-7, StartY-6, StartX-10, StartY-12); circle(StartX-10, StartY-12, 2); */ /* Plot some "stars" */ for ( i=0 ; i<1000; ++i ) putpixel(random(MaxX), random(MaxY/2+100), WHITE); //random( MaxColors-1 )+1); x = MaxX; y = random(MaxY/2+70); x1 = MaxX; y1 = random(MaxY/2+70); x2 = 0; y2 = 0; PauseTime = 50; int x6, y6, x3, y3, x4, y4, x5, y5; y6 = random(MaxY/2+100); y6 = random(MaxY/2+100); y4 = random(MaxY/2+100); y5 = random(MaxY/2+100); x2 = random (MaxX); x3 = random (MaxX); x4 = random (MaxX); x5 = random (MaxX); /* until a key is hit */ while ( !kbhit() ) { /* draws a moving star */ /*putpixel(x1, y1, BLACK); x1++; putpixel(x1, y1, WHITE); if (x1 == MaxX) x1 = 0; */ putpixel(x6, y6, BLACK); x6++; putpixel(x6, y6, WHITE); if (x6 == MaxX) x6 = 0; putpixel(x3, y3, BLACK); x3++; putpixel(x3, y3, WHITE); if (x3 == MaxX) x3 = 0; putpixel(x4, y4, BLACK); x4++; putpixel(x4, y4, WHITE); if (x4 == MaxX) x4 = 0; putpixel(x5, y5, BLACK); x5++; putpixel(x5, y5, WHITE); if (x5 == MaxX) x5 = 0; /* Draw the Saucer */ putimage(x, y, Saucer, XOR_PUT); /* draw image */ putimage(x1, y1, TyFighter, XOR_PUT); putimage(x2, y2, Sun, XOR_PUT); /* draw image */ delay(PauseTime); putimage(x, y, Saucer, XOR_PUT); /* erase image */ putimage(x1, y1, TyFighter, XOR_PUT); putimage(x2, y2, Sun, XOR_PUT); /* draw image */ //putimage(x, y, Saucer, XOR_PUT); /* draw image */ //delay(PauseTime); //putimage(x, y, Saucer, XOR_PUT); /* erase image */ //putimage(x1, y1, TyFighter, XOR_PUT); /* draw image */ //delay(PauseTime); //putimage(x1, y1, TyFighter, XOR_PUT); /* erase image */ /* Move Saucer */ x--; x1--; x2++; //for (i=0; i<1; i++ ) //delay (1); if (x2 >= MaxX) { x2 = 0; } if (x <= 0 || x1 <= 0) { return 0; //x = getmaxx(); } step = random( 2*r ); if ((step/2) % 2 != 0 ) step = -1 * step; x = x + step; step = random( r ); if ((step/2) % 2 != 0 ) step = -1 * step; y = y + step; if (y >= MaxY/2+100 || y1 >= MaxY/2+100) { } if (vp.left + x + width - 1 > vp.right) x = vp.right-vp.left-width + 1; else if (x < 0) x = 0; if (vp.top + y + height - 1 > vp.bottom - 100) y = vp.bottom-100-vp.top-height + 1; else if (y < 0) y = 0; step1 = random( 2*r ); if ((step1/2) % 2 != 0 ) step1 = -1 * step1; x1 = x1 + step1; step1 = random( r ); if ((step1/2) % 2 != 0 ) step1 = -1 * step1; y1 = y1 + step1; if (vp1.left + x1 + width1 - 1 > vp1.right) x1 = vp1.right-vp1.left-width1 + 1; else if (x1 < 0) x1 = 0; if (vp1.top + y1 + height1 - 1 > vp1.bottom-100) y1 = vp1.bottom-100-vp1.top-height1 + 1; else if (y1 < 0) y1 = 0; /* step2 = random( 2*r ); if ((step2/2) % 2 != 0 ) step2 = -1 * step2; x2 = x2 + step2; step2 = random( r ); if ((step1/2) % 2 != 0 ) step1 = -1 * step1; y1 = y1 + step1; */ if (vp2.left + x2 + width2 - 1 > vp2.right) x2 = vp2.right-vp2.left-width2 + 1; else if (x2 < 0) x2 = 0; if (vp2.top + y2 + height2 - 1 > vp2.bottom) y2 = vp2.bottom-vp2.top-height2 + 1; else if (y2 < 0) y2 = 0; } free( Saucer ); free( TyFighter ); free( Sun ); //setcolor(WHITE); //drawpoly ( //arc(midx, midy, stangle, endangle, radius); //arc (250,250, 0, 180, //ellipse(midx, midy, stangle, endangle, xradius, yradius); //ellipse (350, 300, 0, 360, 15, 7); //line (350,300,360,310); //circle ( /* line(250,250,257,250); line(257,250,257,257); line(257,257,250,257); line(250,257,250,250); line(250,250,254,244); line(254,244,257,250); line(252,257,248,261); line(248,261,247,264); line(245,264,249,264); line(255,257,260,261); line(260,261,261,264); line(259,264,263,264); */ return 0; } int drawland(int y_str) { //y_str, int x_str, x_end, // left and right points y_end, // up and down points a, b, x_point, i,nus, ymax=getmaxy(); //y_str = getmaxy() / 2; x_str = getmaxx(); while (!kbhit()) { //for (i=0; i<10; i++) //{ //a = random (100); a = rand()%100; x_end = x_str - a; if (y_end > ymax-100) // end of up/down line bellow bottom { b = rand()%100; y_end = y_str - b; } else if (y_end < ymax/2+80) // end of up/down line above middle of screen { b = rand()%100; y_end = y_str + b; } else // if in middle of ends { // of up/down random which way to go nus = random (1); if (nus==0) { b = rand()%100; y_end = y_str + b; } else if (nus==1) { b = rand()%100; y_end = y_str - b; } } //x_point = random(100); line (x_str, y_str, x_end, y_end); //delay (150); //printf("%d %d %d %d\n", x_str,y_str,x_end,y_end); //delay(500); x_str = x_end; y_str = y_end; //delay (50); if (x_end <= 0) { //cleardevice(); //clrscr(); //x_str = getmaxx(); return y_end; } } return 0; }