Ads

Wednesday, April 27, 2011

SNAKE GAME IN C++

<br /> #include<stdlib.h><br /> #include<stdio.h><br /> #include<conio.h><br /> <br /> /* prototypes */<br /> <br /> void draw_line(int col, int row);<br /> <br /> void show_score();<br /> <br /> void add_segment();<br /> <br /> void setup_level();<br /> <br /> <br /> <br /> /* constants */<br /> <br /> const int maxrow=15, maxcol=77;<br /> <br /> const int snake_start_col=33,snake_start_row=7;<br /> <br /> const char up_key='a', down_key='z', left_key='o', right_key='p';<br /> <br /> const int pause_length=500000;<br /> <br /> <br /> <br /> /* global variables */<br /> <br /> int score, snake_length, speed, obstacles, level, firstpress, high_score=0;<br /> <br /> char screen_grid[maxrow][maxcol];<br /> <br /> char direction = right_key;<br /> <br /> struct snake_segment {<br /> <br /> int row,col;<br /> <br /> } snake[100];<br /> <br /> <br /> void main()<br /> <br /> {<br /> <br /> <br /> <br /> /* Variable declarations within main() only */<br /> <br /> char keypress;<br /> <br /> <br /> <br /> do /* restart game loop */<br /> <br /> {<br /> <br /> obstacles=4; level=1; score=0; speed=14;<br /> <br /> <br /> <br /> randomize(); /* Ensure random seed initiated */<br /> <br /> <br /> <br /> setup_level();<br /> <br /> <br /> <br /> /* main loop */<br /> <br /> do<br /> <br /> {<br /> <br /> 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==left_key)|| (keypress==up_key)||(keypress==down_key)) 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 */<br /> <br /> setup_level(); /* display next level */<br /> <br /> }<br /> <br /> }<br /> <br /> } while (keypress!='x');<br /> <br /> <br /> <br /> /* game over message */<br /> <br /> if (score > high_score) high_score = score;<br /> <br /> show_score();<br /> <br /> gotoxy(30,6); textcolor(LIGHTRED); cprintf("G A M E O V E R");<br /> <br /> gotoxy(30,9); textcolor(YELLOW); cprintf("Another Game (y/n)? ");<br /> <br /> do keypress=getch(); while((keypress!='y')&&(keypress!='n'));<br /> <br /> <br /> <br /> } while (keypress=='y');<br /> <br /> }<br /> <br /> <br /> <br /> void setup_level()<br /> <br /> {<br /> <br /> <br /> <br /> /* variables local to setup_level() */<br /> <br /> int row,col;<br /> <br /> <br /> <br /> /* Set up global variables for new level */<br /> <br /> snake_length=level+4; direction = right_key;<br /> <br /> firstpress = 1;<br /> <br /> /* Fill grid with blanks */<br /> <br /> 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_length-1].row; snake[snake_length].col=snake[snake_length-1].col+1; break; case(left_key) : snake[snake_length].row=snake[snake_length-1].row; snake[snake_length].col=snake[snake_length-1].col-1; break; case(up_key) : snake[snake_length].row=snake[snake_length-1].row-1; snake[snake_length].col=snake[snake_length-1].col; break; case(down_key) : snake[snake_length].row=snake[snake_length-1].row+1; snake[snake_length].col=snake[snake_length-1].col; } }

No comments:

Post a Comment