/* A Flying Space Ship Program */
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
int drawship();
int drawland(int y_str);
int main ()
{
clrscr ();
int gdriver = DETECT, gmode, errorcode;
initgraph (&gdriver, &gmode, "g:\\turboc\\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;
randomize;
y_str = getmaxy() / 2 + 60;
//x_str = getmaxx();
while ( !kbhit() )
{
y_end = drawland(y_str);
y_str = y_end;
drawship();
cleardevice();
}
getch ();
closegraph ();
return 0;
}
int drawship()
{
randomize;
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;
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);
/* Plot some "stars" */
for ( i=0 ; i<1000; ++i )
putpixel(random(MaxX), random(MaxY/2+100), WHITE);
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(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 */
/* Move Saucer */
x--;
x1--;
x2++;
if (x2 >= MaxX)
{
x2 = 0;
}
if (x <= 0 || x1 <= 0)
{
return 0;
}
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;
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 );
return 0;
}
int drawland(int y_str)
{
randomize;
int x_str, x_end, // left and right points
y_end, // up and down points
a, b, x_point, i,nus,
ymax=getmaxy();
x_str = getmaxx();
while (!kbhit())
{
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;
}
}
line (x_str, y_str, x_end, y_end);
x_str = x_end;
y_str = y_end;
if (x_end <= 0)
{
return y_end;
}
}
return 0;
}