/*****<soeasyprograms.blogspot.in>*****/
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
/* prototypes */
void draw_line(int col, int row);
void show_score();
void add_segment();
void setup_level();
/* constants */
const int maxrow=15, maxcol=77;
const int
snake_start_col=33,snake_start_row=7;
const char up_key='a', down_key='z',
left_key='o', right_key='p';
const int pause_length=500000;
/* global variables */
int score, snake_length, speed,
obstacles, level, firstpress,
high_score=0;
char screen_grid[maxrow][maxcol];
char direction = right_key;
struct snake_segment {
int row,col;
} snake[100];
void main()
{
/* Variable declarations within
main() only */
char keypress;
do /* restart game loop */
{
obstacles=4; level=1; score=0;
speed=14;
randomize(); /* Ensure random seed
initiated */
setup_level();
/* main loop */
do
{
for (int
i=0;i<(speed*pause_length);i++) int
j=1+i; /*pause*/
/* If key has been hit, then
check it is a direction key - if so,
change direction */
if (kbhit())
{
keypress=(char)getch();
if((keypress==right_key)||(keypress==l
eft_key)||
(keypress==up_key)||(keypress==down_ke
y))
direction = keypress;
}
/* Add a segment to the end of
the snake */
add_segment();
/* Blank last segment of snake
*/
gotoxy(snake[0].col,snake[0].row);
cprintf(" ");
/* ... and remove it from the
array */
for (int
i=1;i<=snake_length;i++)
snake[i-1]=snake[i];
/* Display snake in yellow */
textcolor(YELLOW);
for (int
i=0;i<=snake_length;i++)
{
gotoxy(snake[i].col,snake[i].row);
cprintf("O");
}
/* keeps cursor flashing in one
place instead of following snake */
gotoxy(1,1);
/* If first press on each level,
pause until a key is pressed */
if (firstpress) {
while(!kbhit()); firstpress = 0; }
/* Collision detection - walls
(bad!) */
if
((snake[snake_length-1].row>maxrow+1)|
|(snake[snake_length-1].row<=1)||
(snake[snake_length-1].col>maxcol+1)||
(snake[snake_length-1].col<=1)||
/* Collision detection -
obstacles (bad!) */
(screen_grid[snake[snake_length-1].row
-2][snake[snake_length-1].col-2]=='x')
)
keypress='x'; /* i.e. exit
loop - game over */
/* Collision detection - snake
(bad!) */
for (int
i=0;i<snake_length-1;i++)
if (
(snake[snake_length-1].row)==(snake[i]
.row) &&
(snake[snake_length-1].col)==(snake[i]
.col))
{
keypress='x'; /* i.e. exit
loop - game over */
break; /* no need to check
any more segments */
}
/* Collision detection - food
(good!) */
if
(screen_grid[snake[snake_length-1].row
-2][snake[snake_length-1].col-2]=='.')
{
/* increase score and length
of snake */
score+=snake_length*obstacles;
show_score(); snake_length++;
add_segment();
/* if length of snake reaches
certain size, onto next level */
if (snake_length==(level+3)*2)
{
score+=level*1000;
obstacles+=2; level++; /* add to
obstacles */
if ((level%5==0)&&(speed>1))
speed--; /* increase speed every 5
levels */
setup_level(); /* display
next level */
}
}
} while (keypress!='x');
/* game over message */
if (score > high_score) high_score
= score;
show_score();
gotoxy(30,6); textcolor(LIGHTRED);
cprintf("G A M E O V E R");
gotoxy(30,9); textcolor(YELLOW);
cprintf("Another Game (y/n)? ");
do keypress=getch();
while((keypress!='y')&&(keypress!='n')
);
} while (keypress=='y');
}
void setup_level()
{
/* variables local to setup_level()
*/
int row,col;
/* Set up global variables for new
level */
snake_length=level+4; direction =
right_key;
firstpress = 1;
/* Fill grid with blanks */
for(row=0;row<maxrow;row++)
for(col=0;col<maxcol;col++)
screen_grid[row][col]= ' ';
/* Fill grid with Xs and food */
for(int i=0;i<obstacles*2;i++)
{
row= rand()%maxrow;
col= rand()%maxcol;
if(i<obstacles)
screen_grid[row][col]='x';
else
screen_grid[row][col]='.';
}
/* Create snake array of length
snake_length */
for(int i=0;i<snake_length;i++)
{
snake[i].row=snake_start_row;
snake[i].col=snake_start_col+i;
}
/* Draw playing board */
draw_line(1,1);
for(row=0;row<maxrow;row++)
{
gotoxy(1,row+2);
textcolor(LIGHTBLUE);
cprintf("|");
textcolor(WHITE);
for(col=0;col<maxcol;col++)
cprintf("%c",screen_grid[row][col]);
textcolor(LIGHTBLUE);
cprintf("|");
}
draw_line(1,maxrow+2);
show_score();
gotoxy(2,maxrow+5);
textcolor(LIGHTRED);
cprintf("~~ SNAKE GAME~~ Left: %c,
Right: %c, Up: %c, Down: %c, Exit: x.
Any key to start.",
left_key,right_key,up_key,down_key);
}
void draw_line(int col, int row)
{
gotoxy(col,row);
textcolor(LIGHTBLUE);
for (int col=0;col<maxcol+2;col++)
cprintf("=");
}
void show_score()
{
textcolor(LIGHTCYAN);
gotoxy(2,maxrow+3);
cprintf("Level: %05d",level);
gotoxy(40,maxrow+3);
textcolor(LIGHTGREEN);
cprintf("Score: %05d",score);
gotoxy(60,maxrow+3);
textcolor(LIGHTMAGENTA);
cprintf("High Score:
%05d",high_score);
}
void add_segment()
{
switch(direction)
{
case(right_key):
snake[snake_length].row=snake[snake_le
ngth-1].row;
snake[snake_length].col=snake[snake_le
ngth-1].col+1;
break;
case(left_key) :
snake[snake_length].row=snake[snake_le
ngth-1].row;
snake[snake_length].col=snake[snake_le
ngth-1].col-1;
break;
case(up_key) :
snake[snake_length].row=snake[snake_le
ngth-1].row-1;
snake[snake_length].col=snake[snake_le
ngth-1].col;
break;
case(down_key) :
snake[snake_length].row=snake[snake_le
ngth-1].row+1;
snake[snake_length].col=snake[snake_le
ngth-1].col;
}
}
Game Look:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
/* prototypes */
void draw_line(int col, int row);
void show_score();
void add_segment();
void setup_level();
/* constants */
const int maxrow=15, maxcol=77;
const int
snake_start_col=33,snake_start_row=7;
const char up_key='a', down_key='z',
left_key='o', right_key='p';
const int pause_length=500000;
/* global variables */
int score, snake_length, speed,
obstacles, level, firstpress,
high_score=0;
char screen_grid[maxrow][maxcol];
char direction = right_key;
struct snake_segment {
int row,col;
} snake[100];
void main()
{
/* Variable declarations within
main() only */
char keypress;
do /* restart game loop */
{
obstacles=4; level=1; score=0;
speed=14;
randomize(); /* Ensure random seed
initiated */
setup_level();
/* main loop */
do
{
for (int
i=0;i<(speed*pause_length);i++) int
j=1+i; /*pause*/
/* If key has been hit, then
check it is a direction key - if so,
change direction */
if (kbhit())
{
keypress=(char)getch();
if((keypress==right_key)||(keypress==l
eft_key)||
(keypress==up_key)||(keypress==down_ke
y))
direction = keypress;
}
/* Add a segment to the end of
the snake */
add_segment();
/* Blank last segment of snake
*/
gotoxy(snake[0].col,snake[0].row);
cprintf(" ");
/* ... and remove it from the
array */
for (int
i=1;i<=snake_length;i++)
snake[i-1]=snake[i];
/* Display snake in yellow */
textcolor(YELLOW);
for (int
i=0;i<=snake_length;i++)
{
gotoxy(snake[i].col,snake[i].row);
cprintf("O");
}
/* keeps cursor flashing in one
place instead of following snake */
gotoxy(1,1);
/* If first press on each level,
pause until a key is pressed */
if (firstpress) {
while(!kbhit()); firstpress = 0; }
/* Collision detection - walls
(bad!) */
if
((snake[snake_length-1].row>maxrow+1)|
|(snake[snake_length-1].row<=1)||
(snake[snake_length-1].col>maxcol+1)||
(snake[snake_length-1].col<=1)||
/* Collision detection -
obstacles (bad!) */
(screen_grid[snake[snake_length-1].row
-2][snake[snake_length-1].col-2]=='x')
)
keypress='x'; /* i.e. exit
loop - game over */
/* Collision detection - snake
(bad!) */
for (int
i=0;i<snake_length-1;i++)
if (
(snake[snake_length-1].row)==(snake[i]
.row) &&
(snake[snake_length-1].col)==(snake[i]
.col))
{
keypress='x'; /* i.e. exit
loop - game over */
break; /* no need to check
any more segments */
}
/* Collision detection - food
(good!) */
if
(screen_grid[snake[snake_length-1].row
-2][snake[snake_length-1].col-2]=='.')
{
/* increase score and length
of snake */
score+=snake_length*obstacles;
show_score(); snake_length++;
add_segment();
/* if length of snake reaches
certain size, onto next level */
if (snake_length==(level+3)*2)
{
score+=level*1000;
obstacles+=2; level++; /* add to
obstacles */
if ((level%5==0)&&(speed>1))
speed--; /* increase speed every 5
levels */
setup_level(); /* display
next level */
}
}
} while (keypress!='x');
/* game over message */
if (score > high_score) high_score
= score;
show_score();
gotoxy(30,6); textcolor(LIGHTRED);
cprintf("G A M E O V E R");
gotoxy(30,9); textcolor(YELLOW);
cprintf("Another Game (y/n)? ");
do keypress=getch();
while((keypress!='y')&&(keypress!='n')
);
} while (keypress=='y');
}
void setup_level()
{
/* variables local to setup_level()
*/
int row,col;
/* Set up global variables for new
level */
snake_length=level+4; direction =
right_key;
firstpress = 1;
/* Fill grid with blanks */
for(row=0;row<maxrow;row++)
for(col=0;col<maxcol;col++)
screen_grid[row][col]= ' ';
/* Fill grid with Xs and food */
for(int i=0;i<obstacles*2;i++)
{
row= rand()%maxrow;
col= rand()%maxcol;
if(i<obstacles)
screen_grid[row][col]='x';
else
screen_grid[row][col]='.';
}
/* Create snake array of length
snake_length */
for(int i=0;i<snake_length;i++)
{
snake[i].row=snake_start_row;
snake[i].col=snake_start_col+i;
}
/* Draw playing board */
draw_line(1,1);
for(row=0;row<maxrow;row++)
{
gotoxy(1,row+2);
textcolor(LIGHTBLUE);
cprintf("|");
textcolor(WHITE);
for(col=0;col<maxcol;col++)
cprintf("%c",screen_grid[row][col]);
textcolor(LIGHTBLUE);
cprintf("|");
}
draw_line(1,maxrow+2);
show_score();
gotoxy(2,maxrow+5);
textcolor(LIGHTRED);
cprintf("~~ SNAKE GAME~~ Left: %c,
Right: %c, Up: %c, Down: %c, Exit: x.
Any key to start.",
left_key,right_key,up_key,down_key);
}
void draw_line(int col, int row)
{
gotoxy(col,row);
textcolor(LIGHTBLUE);
for (int col=0;col<maxcol+2;col++)
cprintf("=");
}
void show_score()
{
textcolor(LIGHTCYAN);
gotoxy(2,maxrow+3);
cprintf("Level: %05d",level);
gotoxy(40,maxrow+3);
textcolor(LIGHTGREEN);
cprintf("Score: %05d",score);
gotoxy(60,maxrow+3);
textcolor(LIGHTMAGENTA);
cprintf("High Score:
%05d",high_score);
}
void add_segment()
{
switch(direction)
{
case(right_key):
snake[snake_length].row=snake[snake_le
ngth-1].row;
snake[snake_length].col=snake[snake_le
ngth-1].col+1;
break;
case(left_key) :
snake[snake_length].row=snake[snake_le
ngth-1].row;
snake[snake_length].col=snake[snake_le
ngth-1].col-1;
break;
case(up_key) :
snake[snake_length].row=snake[snake_le
ngth-1].row-1;
snake[snake_length].col=snake[snake_le
ngth-1].col;
break;
case(down_key) :
snake[snake_length].row=snake[snake_le
ngth-1].row+1;
snake[snake_length].col=snake[snake_le
ngth-1].col;
}
}
Game Look:
No comments:
Post a Comment