Caught in the Middle

 

Source Code:

#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#include<stdlib.h>
#include<dos.h>
#include<stdio.h>

enum dir direction; 
/*indicates the direction of the shooter*/
int fire(int xco,int yco,int &lr,int &tb,int &rl,int &bt);
/*shoots place check for hit*/
/*The most complex function flashes the green boxes and*/
/*records their coordinates*/
int environment(int xposition,int yposition,int position_array_location);
int match(void);                 
/*checks the fired location and the locations of the boxes*/
int put_banner(void);             
/*banner at the end of game*/
/*structure to record the position of boxes*/
//void refresh();
struct position
{
    int x_pos;
    int y_pos;
};
struct position p[10];
/*array to record the locations of boxes*/
struct position sh;
/*variable to record the location of the shooter*/
enum dir{EAST,WEST,SOUTH,NORTH};
/*enum to indicate direction*/
unsigned int hitcount=0;
void main()
{
int gdriver = DETECT;
int gmode;
int ch,is_hit;
int x=350,y=200;/*x,y coordinates*/
/*variables used to move around boxes*/
int i=0,j=320,k=400,l=0,m=800,n=200,p=600,o=300;
int iflag,lflag,mflag,pflag;
/*flag to indicate which box has been hit*/
initgraph(&gdriver,&gmode,"c:\tc\bgi");
/*initiating graphics*/
setcolor(YELLOW);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,5);
/*Drawing the initial banners*/
outtextxy((getmaxx()/2)-260,(getmaxy()/2)-20,""CAUGHT IN THE MIDDLE"");
setcolor(WHITE);
outtextxy(100,50,"Use "arrow" key to move");
outtextxy(100,100,"Use "enter" to fire");
/*drawing banner completed*/
getch();
settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
setbkcolor(BLUE);
delay(1000);
cleardevice();
x=getmaxx()/2;y=getmaxy()/2;
moveto(x,y);
do
{
/*draws the shooter*/
setfillstyle(SOLID_FILL,WHITE);
circle(x,y,10);
floodfill(x,y,WHITE);
circle(x,y,20);
line(x,y-20,x,y+20);
line(x-20,y,x+20,y);
/*draws the shooter*/
//refresh();
iflag=0,lflag=0,mflag=0,pflag=0;
while(!kbhit())
/*until the keyboard is hit boxes are flashed*/
{
    i=i%800;
    l=l%600;
    if(m<=0)m+=800;
    if(p<=0)p+=600;
    environment(i,j,0);
    /*moves from left to right*/
    environment(k,l,1);
    /*moves from top to bottom*/
    environment(m,n,2);
    /*moves from right to left*/
    environment(o,p,3);
    /*moves from bottom to top*/
    i+=20;
    l+=20;
    m-=20;
    p-=20;
    if(i>=800) j=rand()%600;
    if(l>=600) k=rand()%800;
    if(m<=0) n=rand()%600;
    if(p<=0) o=rand()%800;
}
ch =getch();               
/*gets key from user*/
/*key board is hit*/
setfillstyle(SOLID_FILL,BLUE);
/*draws a block to erase shooter at previous position*/
bar(x+20,y+20,x-20,y-20);
x=getx();
y=gety();
sh.x_pos=x;                   
/*gets the shooter position*/
sh.y_pos=y;
setfillstyle(SOLID_FILL,WHITE);
/*draws the shooter*/
circle(x,y,10);
floodfill(x,y,WHITE);
circle(x,y,20);
line(x,y-20,x,y+20);
line(x-20,y,x+20,y);
setfillstyle(SOLID_FILL,BLUE);
bar(x+20,y+20,x-20,y-20);
outtextxy(240,10,"HIT CTRL+Z TO QUIT");
switch(ch)
{
    case 72:/*up arrow*/
    direction=NORTH;
    x=getx();
    y=gety();
    moveto(x,y-20);
    x=getx();
    y=gety();
    sh.x_pos=x;
    sh.y_pos=y;
    setfillstyle(SOLID_FILL,WHITE);
    circle(x,y,10);
    floodfill(x,y,WHITE);
    circle(x,y,20);
    line(x,y-20,x,y+20);
    line(x-20,y,x+20,y);
    break;
    case 80:/*down arrow*/
    direction=SOUTH;
    x=getx();
    y=gety();
    moveto(x,y+20);
    x=getx();
    y=gety();
    sh.x_pos=x;
    sh.y_pos=y;
    setfillstyle(SOLID_FILL,WHITE);
    circle(x,y,10);
    floodfill(x,y,WHITE);
    circle(x,y,20);
    line(x,y-20,x,y+20);
    line(x-20,y,x+20,y);
    break;
    case 75:/*left arrow*/
    direction=WEST;
    x=getx();
    y=gety();
    moveto(x-20,y);
    x=getx();
    y=gety();
    sh.x_pos=x;
    sh.y_pos=y;
    setfillstyle(SOLID_FILL,WHITE);
    circle(x,y,10);
    floodfill(x,y,WHITE);
    circle(x,y,20);
    line(x,y-20,x,y+20);
    line(x-20,y,x+20,y);
    break;
    case 77:/*right arrow*/
    direction=EAST;
    x=getx();
    y=gety();
    moveto(x+20,y);
    x=getx();
    y=gety();
    sh.x_pos=x;
    sh.y_pos=y;
    setfillstyle(SOLID_FILL,WHITE);
    circle(x,y,10);
    floodfill(x,y,WHITE);
    circle(x,y,20);
    line(x,y-20,x,y+20);
    line(x-20,y,x+20,y);
    break;
    case 13:/*enter key*/
    x=getx();
    y=gety();
    sh.x_pos=x;
    sh.y_pos=y;
    is_hit=fire(x,y,iflag,lflag,mflag,pflag);
    /*flags r passed by reference*/
    if(is_hit==1)
    {
        hitcount++;
        if(iflag)i+=800;
        else if(lflag)k+=600;
        else if(mflag)m=0;
        else if(pflag)p=0;
        iflag=0;lflag=0;mflag=0;pflag=0; /*flag reset*/
    }
    x=getx();
    y=gety();
    setfillstyle(SOLID_FILL,WHITE);
    circle(x,y,10);
    floodfill(x,y,WHITE);
    circle(x,y,20);
    line(x,y-20,x,y+20);
    line(x-20,y,x+20,y);
    break;
}
}while(ch!=26);
closegraph();
restorecrtmode();
gotoxy(30,12);
textcolor(YELLOW);
cprintf("YOU HAVE SCORED :%d",hitcount);/*score is indicated*/
getch();
}

/*function fire draws ans erases a line along the current direction*/
int fire(int x,int y,int <r,int &ttb,int &rtl,int &btt)
{
int i=0,hit=0;
switch(direction)
{
case EAST:/*right*/

   
if(sh.y_pos>=p[i].y_pos-20&&sh.y_pos<=p[i].y_pos+20&&sh.x_pos<p[i].x_pos)
    {
    hit=1;
    switch(i)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.y_pos>=p[i+1].y_pos-20&&sh.y_pos<=p[i+1].y_pos+20&&sh.x_pos<p[i+1].x_pos)
    {
    hit=1;
    switch(i+1)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.y_pos>=p[i+2].y_pos-20&&sh.y_pos<=p[i+2].y_pos+20&&sh.x_pos<p[i+2].x_pos)
    {
    hit=1;
    switch(i+2)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.y_pos>=p[i+3].y_pos-20&&sh.y_pos<=p[i+3].y_pos+20&&sh.x_pos<p[i+3].x_pos)
    {
    hit=1;
    switch(i+3)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
setcolor(YELLOW);
line(x+20,y,x+800,y);
setcolor(BLUE);
delay(100);
line(x+20,y,x+800,y);
setcolor(WHITE);
break;
case WEST:/*left*/
   
if(sh.y_pos>=p[i].y_pos-20&&sh.y_pos<=p[i].y_pos+20&&sh.x_pos>p[i].x_pos)
    {
    hit=1;
    switch(i)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.y_pos>=p[i+1].y_pos-20&&sh.y_pos<=p[i+1].y_pos+20&&sh.x_pos>p[i+1].x_pos)
    {
    hit=1;
    switch(i+1)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.y_pos>=p[i+2].y_pos-20&&sh.y_pos<=p[i+2].y_pos+20&&sh.x_pos>p[i+2].x_pos)
    {
    hit=1;
    switch(i+2)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.y_pos>=p[i+3].y_pos-20&&sh.y_pos<=p[i+3].y_pos+20&&sh.x_pos>p[i+3].x_pos)
    {
    hit=1;
    switch(i+3)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
setcolor(YELLOW);
line(x-20,y,x-800,y);
setcolor(BLUE);
delay(100);
line(x-20,y,x-800,y);
setcolor(WHITE);
break;
case SOUTH:/*down*/

   
if(sh.x_pos>=p[i].x_pos-20&&sh.x_pos<=p[i].x_pos+20&&sh.y_pos<p[i].y_pos)
    {
    hit=1;
    switch(i)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.x_pos>=p[i+1].x_pos-20&&sh.x_pos<=p[i+1].x_pos+20&&sh.y_pos<p[i+1].y_pos)
    {
    hit=1;
    switch(i+1)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.x_pos>=p[i+2].x_pos-20&&sh.x_pos<=p[i+2].x_pos+20&&sh.y_pos<p[i+2].y_pos)
    {
    hit=1;
    switch(i+2)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.x_pos>=p[i+3].x_pos-20&&sh.x_pos<=p[i+3].x_pos+20&&sh.y_pos<p[i+3].y_pos)
    {
    hit=1;
    switch(i+3)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
setcolor(YELLOW);
line(x,y+20,x,y+800);
setcolor(BLUE);
delay(100);
line(x,y+20,x,y+800);
setcolor(WHITE);
break;
case NORTH:/*up*/
   
if(sh.x_pos>=p[i].x_pos-20&&sh.x_pos<=p[i].x_pos+20&&sh.y_pos>p[i].y_pos)
    {
    hit=1;
    switch(i)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.x_pos>=p[i+1].x_pos-20&&sh.x_pos<=p[i+1].x_pos+20&&sh.y_pos>p[i+1].y_pos)
    {
    hit=1;
    switch(i+1)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.x_pos>=p[i+2].x_pos-20&&sh.x_pos<=p[i+2].x_pos+20&&sh.y_pos>p[i+2].y_pos)
    {
    hit=1;
    switch(i+2)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
    else
if(sh.x_pos>=p[i+3].x_pos-20&&sh.x_pos<=p[i+3].x_pos+20&&sh.y_pos>p[i+3].y_pos)
    {
    hit=1;
    switch(i+3)
    {
        case 0: ltr=1; break;
        case 1: ttb=1; break;
        case 2: rtl=1; break;
        case 3: btt=1; break;
    }
    }
setcolor(YELLOW);
line(x,y-20,x,y-800);
setcolor(BLUE);
delay(100);
line(x,y-20,x,y-800);
setcolor(WHITE);
break;
}
for(i=0;i<=3;i++)
{
  p[i].x_pos=0;
  p[i].y_pos=0;
}
/*refreshing the record*/
return(hit);
/*    of a positions*/
}

/*draws the green boxes */
int environment(int x,int y,int pos)
{
int i;
p[pos].x_pos=x;
p[pos].y_pos=y;
/*conditions to check for collision
checks whether the center of box x,y is within the area
(sh_xpos-20,sh_ypos-20)
(sh_xpos+20,sh_ypos+20)*/
if(x>=sh.x_pos-20&&x<=sh.x_pos+20&&y>=sh.y_pos-20&&y<=sh.y_pos+20)
{
    put_banner();
    getch();
    closegraph();
    restorecrtmode();
    gotoxy(30,12);
    textcolor(YELLOW);
    cprintf("YOU HAVE SCORED :%d",hitcount);
    getch();
    exit(0);
}
setfillstyle(SOLID_FILL,LIGHTGREEN);
bar(x-10,y-10,x+10,y+10);
delay(20);
setfillstyle(SOLID_FILL,BLUE);
bar(x-10,y-10,x+10,y+10);
setcolor(WHITE);
return(0);
}

/*puts a banner at the End of Game*/
int put_banner()
{
setcolor(YELLOW);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,5);
outtextxy((getmaxx()/2)-260,(getmaxy()/2)-20,"SORRY YOU`VE BEEN HIT");
return 0;
}

void refresh(void)
{
int i;
for(i=0;i<4;i++)
{
    p[i].x_pos=0;
    p[i].y_pos=0;
}
}


Comments

Popular posts from this blog

8086 STRING MANIPULATION –FIND AND REPLACE A WORD

Animated Circles In C++

C program to find out the sum of series 1 + 2 + …. + n.