Wednesday 18 March 2015

How To Create a Computer Graphics Game

Here is  a simple example of Computer Graphics game in Turbo c / Dosbox.

Go through the Following coding or download the complete coding by clicking Download.


Here are Some Snap Shots of the Game:




CODE:


# include "process.h"
# include "dos.h"
# include "stdlib.h"
# include "graphics.h"
# include "stdio.h"


# define NULL 0
# define YES 1
# define NO 0

int maxx, maxy, midx, midy ;
int bri[5][20] ;

main()
{
union REGS ii, oo ;
int ballx, bally, paddlex, paddley, dx = 1, dy = -1, oldx, oldy ;
int gm = CGAHI, gd = CGA, playerlevel ;
int i, flag = 0, speed = 25, welldone = NO, score = 0, chance = 4, area ;
int layer[5] = { 10, 20, 30, 40, 50 }, limit = 50, currentlayer = 4 ;
char *p1, *p2 ;

/* initialise the graphics system */
initgraph ( &gd, &gm, "C:\\TC\\BGI" ) ;

/* get the maximum x and y screen coordinates */
maxx = getmaxx() ;
maxy = getmaxy() ;

/* calculate center of screen */
midx = maxx / 2 ;
midy = maxy / 2 ;

/* display opening screen and receive player's level */
playerlevel = mainscreen() ;

/* set speed of ball as per the level chosen */
switch ( playerlevel )
{
case 'A' :
case 'a' :
speed = 15 ;
break ;

case 'E' :
case 'e' :
speed = 10 ;
}

/* draw the bricks, the paddle and the ball */
rectangle ( 0, 0, maxx, maxy - 12 ) ;
bricks() ;
rectangle ( midx - 25, maxy - 7 - 12, midx + 25, maxy - 12 ) ;
floodfill ( midx, maxy - 1 - 12, 1 ) ;
circle ( midx, maxy - 13 - 12, 12 ) ;
floodfill ( midx, maxy - 10 - 12, 1 ) ;

/* allocate memory for storing the image of the paddle */
area = imagesize ( midx - 12, maxy - 18, midx + 12, maxy - 8 ) ;
p1 = malloc ( area ) ;

/* allocate memory for storing the image of the ball */
area = imagesize ( midx - 25, maxy - 7, midx + 25, maxy - 1 ) ;
p2 = malloc ( area ) ;

/* if memory allocation unsuccessful */
if ( p1 == NULL || p2 == NULL )
{
puts ( "Insufficient memory!!" ) ;
exit ( 1 ) ;
}

/* store the image of the paddle and the ball into allocated memory */
getimage ( midx - 12, maxy - 7 - 12 - 12 + 1, midx + 12, maxy - 8 - 12, p1 ) ;
getimage ( midx - 25, maxy - 7 - 12, midx + 25, maxy - 1 - 12, p2 ) ;

/* store current position of the paddle and ball */
paddlex = midx - 25 ;
paddley = maxy - 7 - 12 ;
ballx = midx - 12 ;
bally = maxy - 7 - 12 + 1 - 12 ;

/* display balls in hand ( initially 3 ) */
gotoxy ( 45, 25 ) ;
printf ( "CHANCE REMAINING:" ) ;
for ( i = 0 ; i < 3 ; i++ )
{
circle ( 515 + i * 35, maxy - 5, 12 ) ;
floodfill ( 515 + i * 35, maxy - 5, 1 ) ;
}

/* display initial score */
gotoxy ( 1, 25 ) ;
printf ( "Your Score:   %4d", score ) ;

/* select font and alignment for displaying text */
settextjustify ( CENTER_TEXT, CENTER_TEXT ) ;
settextstyle ( SANS_SERIF_FONT, HORIZ_DIR, 4 ) ;

while ( 1 )
{
flag = 0 ;

/* save the current x and y coordinates of the ball */
oldx = ballx ;
oldy = bally ;

/* update ballx and bally to move the ball in appropriate direction */
ballx = ballx + dx ;
bally = bally + dy ;

/* as per the position of ball determine the layer of bricks to check */
if ( bally > 40 )
{
limit = 50 ;
currentlayer = 4 ;
}
else
{
if ( bally > 30 )
{
limit = 40 ;
currentlayer = 3 ;
}
else
{
if ( bally > 20 )
{
limit = 30 ;
currentlayer = 2 ;
}
else
{
if ( bally > 10 )
{
limit = 20 ;
currentlayer = 1 ;
}
else
{
limit = 10 ;
currentlayer = 0 ;
}
}
}
}

/* if the ball hits the left boundary, deflect it to the right */
if ( ballx < 1 )
{
ballx = 1 ;
dx = -dx ;
}

/* if the ball hits the right boundary, deflect it to the left */
if ( ballx > ( maxx - 24 - 1 ) )
{
ballx = maxx - 24 - 1 ;
dx = -dx ;
}

/* if the ball hits the top boundary, deflect it down */
if ( bally < 1 )
{
bally = 1 ;
dy = -dy ;
}

/* if the ball is in the area occupied by the bricks */
if ( bally < limit )
{
/* if there is no brick present exactly at the top of the ball */
if ( bri[currentlayer][ ( ballx + 10 ) / 32 ] == 1 )
{
/* determine if the boundary of the ball touches a brick */
for ( i = 1 ; i <= 6 ; i++ )
{
/* check whether there is a brick to the right of the ball */
if ( bri[currentlayer][ ( ballx + i + 10 ) / 32 ] == 0 )
{
/* if there is a brick */
ballx = ballx + i ;
flag = 1 ;
break ;
}

/* check whether there is a brick to the left of the ball */
if ( bri[currentlayer][ ( ballx - i + 10 ) / 32 ] == 0 )
{
ballx = ballx - i ;
flag = 1 ;
break ;
}
}

/* if the ball does not touch a brick at the top, left or right */
if ( !flag )
{
/* check if the ball has moved above the current layer */
if ( bally < layer[currentlayer - 1] )
{
/* if so, change current layer appropriately */
currentlayer-- ;
limit = layer[currentlayer] ;
}

/* put the image of the ball at the old coordinates */
putimage ( oldx, oldy, p1, OR_PUT ) ;

/* erase the image at the old coordinates */
putimage ( oldx, oldy, p1, XOR_PUT ) ;

/* place the image of the ball at the new coordinates */
putimage ( ballx, bally, p1, XOR_PUT ) ;

/* introduce delay */
delay ( speed ) ;

/* carry on with moving the ball */
continue ;
}
}

/* control comes to this point only if the ball is touching a brick */

/* erase the brick hit by the ball */
erasebrick ( ( ballx + 10 ) / 32, currentlayer ) ;

/* if the brick hit happens to be on the extreme right */
if ( ( ballx + 10 ) / 32 == 19 )
line ( maxx, 0, maxx, 50 ) ;  /* redraw right boundary */

/* if the brick hit happens to be on the extreme left */
if ( ( ballx + 10 ) / 32 == 0 )
line ( 0, 0, 0, 50 ) ;  /* redraw left boundary */

/* if the brick hit happens to be in the topmost layer */
if ( currentlayer == 0 )
line ( 0, 0, maxx, 0 ) ;  /* redraw top boundary */

/* set appropriate array element to 1 to indicate absence of brick */
bri[currentlayer][ ( ballx + 10 ) / 32 ] = 1 ;

bally = bally + 1 ;  /* update the y coordinate */
dy = -dy ;  /* change the direction of the ball */
score += 5 ;  /* increment score */
gotoxy ( 16, 25 ) ;
printf ( "%4d", score ) ;  /* print latest score */

/* if the first brick is hit during a throw */
if ( welldone == NO )
welldone = YES ;
else
{
/* for the consecutive bricks hit during the same throw */
outtextxy ( midx, midy, "Well done!" ) ;
music ( 1 ) ;
}
}

/* clear part of the screen used for displaying Well done message */
if ( bally > 50 && welldone == YES )
{
setviewport ( midx - 32 * 2.5, midy - 32 / 2, midx + 32 * 2.5, midy + 32 / 2, 1 ) ;
clearviewport() ;
setviewport ( 0, 0, maxx, maxy, 1 ) ;
welldone = NO ;
}

/* if the ball has reached the bottom */
if ( bally > 180 - 12 )
{
welldone = NO ;

/* if the paddle has missed the ball */
if ( ballx < paddlex - 20 || ballx > paddlex + 50 )
{
/* continue the descent of the ball */
while ( bally < 177 )
{
/* erase the image of the ball at the old coordinates */
putimage ( oldx, oldy, p1, XOR_PUT ) ;

/* put the image of the ball at the updated coordinates */
putimage ( ballx, bally, p1, XOR_PUT ) ;

/* introduce delay */
delay ( speed ) ;

/* save the current x and y coordinates of the ball */
oldx = ballx ;
oldy = bally ;

/* update ballx and bally to move the ball in appropriate direction */
ballx = ballx + dx ;
bally = bally + dy ;
}

chance-- ;  /* decrement the number of chances */
score -= 20 ;  /* decrement 20 points for each ball lost */
gotoxy ( 16, 25 ) ;
printf ( "%4d", score ) ;  /* print latest score */
music ( 2 ) ;

/* erase one out of the available balls */
if ( chance )
putimage ( 515 + ( chance - 1 ) * 35 - 12 , maxy - 10, p1, XOR_PUT ) ;

/* if the last ball is being played */
if ( chance == 1 )
{
gotoxy ( 45, 25 ) ;
printf ( "LAST CHANCE!" ) ;
}

/* if all the balls are lost */
if ( !chance )
{
gotoxy ( 45, 25 ) ;
printf ( "Press any key...              " ) ;
outtextxy ( midx, midy, "GAME OVER! Try again" ) ;
music ( 3 ) ;

closegraph() ;
restorecrtmode() ;
exit ( 0 ) ;
}
}

/* if ball is collected on paddle */
music ( 5 ) ;
bally = 180 - 12 ;  /* restore the y coordinate of ball */
dy = -dy ;  /* deflect the ball upwards */
}

/* put the image of the ball at the old coordinates */
putimage ( oldx, oldy, p1, OR_PUT ) ;

/* erase the image of the ball at the old coordinates */
putimage ( oldx, oldy, p1, XOR_PUT ) ;

/* put the image of the ball at the upadted coordinates */
putimage ( ballx, bally, p1, XOR_PUT ) ;

/* if all the bricks have been destroyed */
if ( score == 500 - ( ( 4 - chance ) * 20 ) )
{
outtextxy ( midx, midy, "You win !!!" ) ;

if ( score < 500 )
outtextxy ( midx, midy + 30, "Try scoring 500" ) ;
else
outtextxy ( midx, midy + 30, "You are simply GREAT!" ) ;

music ( 3 ) ;

closegraph() ;
restorecrtmode() ;
exit ( 0 ) ;
}

/* introduce delay */
delay ( speed ) ;

/* if the user has pressed a key to move the paddle */
if ( kbhit() )
{
/* issue interrupt to obtain the ascii and scan codes of key hit */
ii.h.ah = 0 ;
int86 ( 22, &ii, &oo ) ;

/* put the image of the paddle at the old coordinates */
putimage ( paddlex, paddley, p2, OR_PUT ) ;

/* erase the image of the paddle at the old coordinates */
putimage ( paddlex, paddley, p2, XOR_PUT ) ;

/* if Esc key has been pressed */
if ( oo.h.ah == 1 )
exit ( 0 ) ;

/* right arrow key */
if ( oo.h.ah == 75 )
paddlex = paddlex - 20 ;

/* left arrow key */
if ( oo.h.ah == 77 )
paddlex = paddlex + 20 ;

/* if paddle goes beyond left boundary */
if ( paddlex < 0 )
paddlex = 0 ;

/* if paddle goes beyond right boundary */
if ( paddlex > 589 )
paddlex = 589 ;

/* put the image of the paddle at the proper position */
putimage ( paddlex, paddley, p2, XOR_PUT ) ;
}
}
}

/* creates opening screen */
mainscreen()
{
/* array showing the positions where a brick is needed to form the figure BRICKS */
int ff[12][40] = {
1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,0,1,1,1,0,
1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,
1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,
1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,
1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,
1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,
1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,
1,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,1,
1,1,1,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
} ;
int i, j, lx = 0, ly = 0, ch ;

/* draw boundary */
rectangle ( 0, 0, maxx, maxy ) ;

/* form the word BRICKS */
for ( i = 0 ; i < 12 ; i++ )
{
for ( j = 0 ; j < 40 ; j++ )
{
if ( ff[i][j] )
rectangle ( lx, ly, lx + 15, ly + 9 ) ;
lx = lx + 16 ;
}
lx = 0 ;
ly = ly + 10 ;
}

/* draw pattern at the bottom of the screen */
line ( 0, maxy - 12, maxx, maxy - 12 ) ;
setfillstyle ( XHATCH_FILL, WHITE ) ;
floodfill ( 2, maxy - 2, WHITE ) ;

/* draw the paddle and the ball */
setfillstyle ( SOLID_FILL, WHITE ) ;
rectangle ( midx - 25, maxy - 7 - 12, midx + 25, maxy - 12 ) ;
floodfill ( midx, maxy - 1 - 12, 1 ) ;
circle ( midx, maxy - 13 - 12, 12 ) ;
floodfill ( midx, maxy - 10 - 12, 1 ) ;

music ( 3 ) ;  /* play music */

/* display menu */
while ( 1 )
{
/* clear the region below the word BRICKS */
setviewport ( 1, 125 - 12, maxx - 1, maxy - 1, 1 ) ;
clearviewport() ;

setviewport ( 0, 0, maxx, maxy, 1 ) ;
outtextxy ( 20, 135, "Select any of the following:" ) ;
outtextxy ( 20, 155, "Play ( P )" ) ;
outtextxy ( 20, 165, "Instructions ( I )" ) ;
outtextxy ( 20, 175, "Exit ( E )" ) ;

ch = 0 ;

/* continue till the correct choice is made */
while ( ! ( ch == 'E' || ch == 'I' || ch == 'P' ) )
{
fflush ( stdin ) ;

/* if a special key is hit, flush the keyboard buffer */
if ( ( ch = getch() ) == 0 )
getch() ;
else
ch = toupper ( ch ) ;
}

if ( ch == 'P' )
break ;

switch ( ch )
{
case 'I' :
setviewport ( 1, 125 - 12, maxx - 1, maxy - 1, 1 ) ;
clearviewport() ;

setviewport ( 0, 0, maxx, maxy, 1 ) ;
settextstyle ( DEFAULT_FONT, HORIZ_DIR, 1 ) ;
outtextxy ( 20, 125, "         Instructions        " ) ;
settextstyle ( DEFAULT_FONT, HORIZ_DIR, 0 ) ;
outtextxy ( 20, 140, "Use left and right arrow keys to move paddle." ) ;
outtextxy ( 20, 150, "If you don't collect the ball on the paddle, you lose the ball." ) ;
outtextxy ( 20, 160, "On loosing a ball you loose 20 points." ) ;
outtextxy ( 20, 170, "On taking a brick you gain 5 points." ) ;
outtextxy ( 20, 185, "Press any key..." ) ;
fflush ( stdin ) ;
if ( getch() == 0 )
getch() ;
break ;

case 'E' :
closegraph() ;
restorecrtmode() ;
exit ( 0 ) ;
}
}

setviewport ( 1, 125 - 12, maxx - 1, maxy - 1, 1 ) ;
clearviewport() ;

/* prompt the user for the level desired */
setviewport ( 0, 0, maxx, maxy, 1 ) ;
outtextxy ( 20, 135, "Select any of the following levels:" ) ;
outtextxy ( 20, 155, "NORMAL ( N )" ) ;
outtextxy ( 20, 165, "ADVANCE ( A )" ) ;
outtextxy ( 20, 175, "EXPERT ( E )" ) ;

/* get user's choice */
fflush ( stdin ) ;
if ( ( ch = getch() ) == 0 )
getch() ;

clearviewport() ;

/* return the choice made by the user */
return ( ch ) ;
}

/* draws bricks at the start of the game */
bricks()
{
int i, j, lx = 0, ly = 0 ;

for ( i = 0 ; i < 5 ; i++ )  /* 5 rows */
{
for ( j = 0 ; j < 20 ; j++ )  /* 20 columns */
{
/* draw a brick at appropriate coordinates */
drawbrick ( lx, ly ) ;

lx = lx + 32 ;
}

lx = 0 ;
ly = ly + 10 ;
}
}

/* draws a brick at the proper position */
drawbrick ( int lx, int ly )
{
rectangle ( lx, ly, lx + 31, ly + 9 ) ;
rectangle ( lx + 2, ly - 2, lx + 31 - 2, ly + 9 - 2 ) ;
floodfill ( lx + 1, ly + 1, 2 ) ;
}

/* erases the specified brick */
erasebrick ( int b, int l )
{
/* b - brick number, l - layer */

setcolor ( BLACK ) ;
rectangle ( b * 32, l * 10, ( b * 32 ) + 31 , ( l * 10 ) + 9 ) ;
rectangle ( b * 32 + 1, l * 10, ( b * 32 ) + 31 - 1, ( l * 10 ) + 9 - 1 ) ;
rectangle ( b * 32 + 2, l * 10, ( b * 32 ) + 31 - 2, ( l * 10 ) + 9 - 2 ) ;
setcolor ( WHITE ) ;
}

/* plays different types of music */
music ( int type )
{
/* natural frequencies of 7 notes */
float octave[7] = { 130.81, 146.83, 164.81, 174.61, 196, 220, 246.94 } ;
int n, i ;

}


No comments:

Post a Comment

Android Studio Project Structure

Android Project Structure In this blog i have explained Android project structure and file organization in detail, by creating a new An...