Created
January 27, 2020 12:59
-
-
Save souravrax/01038e799fd1460f81665fc9ef3752fd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <time.h> | |
#include <stdlib.h> | |
#include <conio.h> | |
#include <time.h> | |
#include <ctype.h> | |
#include <time.h> | |
#include <windows.h> | |
#include <process.h> | |
#define UP 72 | |
#define DOWN 80 | |
#define LEFT 75 | |
#define RIGHT 77 | |
int length; | |
int bend_no; | |
int len; | |
char key; | |
void record(); | |
void load(); | |
int life; | |
void Delay(long double); | |
void Move(); | |
void Food(); | |
int Score(); | |
void Print(); | |
void gotoxy(int x, int y); | |
void GotoXY(int x, int y); | |
void Bend(); | |
void Boarder(); | |
void Down(); | |
void Left(); | |
void Up(); | |
void Right(); | |
void ExitGame(); | |
int Scoreonly(); | |
struct coordinate | |
{ | |
int x; | |
int y; | |
int direction; | |
}; | |
typedef struct coordinate coordinate; | |
coordinate head, bend[500], food, body[30]; | |
int main() | |
{ | |
// char key; | |
Print(); | |
system("cls"); | |
load(); | |
length = 5; | |
head.x = 25; | |
head.y = 20; | |
head.direction = RIGHT; | |
Boarder(); | |
Food(); //to generate food coordinates initially | |
life = 3; //number of extra lives | |
bend[0] = head; | |
Move(); //initialing initial bend coordinate | |
return 0; | |
} | |
void Move() | |
{ | |
int a, i; | |
do | |
{ | |
Food(); | |
fflush(stdin); | |
len = 0; | |
for (i = 0; i < 30; i++) | |
{ | |
body[i].x = 0; | |
body[i].y = 0; | |
if (i == length) | |
break; | |
} | |
Delay(length); | |
Boarder(); | |
if (head.direction == RIGHT) | |
Right(); | |
else if (head.direction == LEFT) | |
Left(); | |
else if (head.direction == DOWN) | |
Down(); | |
else if (head.direction == UP) | |
Up(); | |
ExitGame(); | |
} while (!kbhit()); | |
a = getch(); | |
if (a == 27) | |
{ | |
system("cls"); | |
exit(0); | |
} | |
key = getch(); | |
if ((key == RIGHT && head.direction != LEFT && head.direction != RIGHT) || (key == LEFT && head.direction != RIGHT && head.direction != LEFT) || (key == UP && head.direction != DOWN && head.direction != UP) || (key == DOWN && head.direction != UP && head.direction != DOWN)) | |
{ | |
bend_no++; | |
bend[bend_no] = head; | |
head.direction = key; | |
if (key == UP) | |
head.y--; | |
if (key == DOWN) | |
head.y++; | |
if (key == RIGHT) | |
head.x++; | |
if (key == LEFT) | |
head.x--; | |
Move(); | |
} | |
else if (key == 27) | |
{ | |
system("cls"); | |
exit(0); | |
} | |
else | |
{ | |
printf("\a"); | |
Move(); | |
} | |
} | |
void gotoxy(int x, int y) | |
{ | |
COORD coord; | |
coord.X = x; | |
coord.Y = y; | |
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); | |
} | |
void GotoXY(int x, int y) | |
{ | |
HANDLE a; | |
COORD b; | |
fflush(stdout); | |
b.X = x; | |
b.Y = y; | |
a = GetStdHandle(STD_OUTPUT_HANDLE); | |
SetConsoleCursorPosition(a, b); | |
} | |
void load() | |
{ | |
int r, q; | |
gotoxy(36, 14); | |
printf("loading..."); | |
gotoxy(30, 15); | |
for (r = 1; r <= 20; r++) | |
{ | |
for (q = 0; q <= 100000000; q++) | |
; //to display the character slowly | |
printf("%c", 177); | |
} | |
getch(); | |
} | |
void Down() | |
{ | |
int i; | |
for (i = 0; i <= (head.y - bend[bend_no].y) && len < length; i++) | |
{ | |
GotoXY(head.x, head.y - i); | |
{ | |
if (len == 0) | |
printf("v"); | |
else | |
printf("*"); | |
} | |
body[len].x = head.x; | |
body[len].y = head.y - i; | |
len++; | |
} | |
Bend(); | |
if (!kbhit()) | |
head.y++; | |
} | |
void Delay(long double k) | |
{ | |
Score(); | |
long double i; | |
for (i = 0; i <= (10000000); i++) | |
; | |
} | |
void ExitGame() | |
{ | |
int i, check = 0; | |
for (i = 4; i < length; i++) //starts with 4 because it needs minimum 4 element to touch its own body | |
{ | |
if (body[0].x == body[i].x && body[0].y == body[i].y) | |
{ | |
check++; //check's value increases as the coordinates of head is equal to any other body coordinate | |
} | |
if (i == length || check != 0) | |
break; | |
} | |
if (head.x <= 10 || head.x >= 70 || head.y <= 10 || head.y >= 30 || check != 0) | |
{ | |
life--; | |
if (life >= 0) | |
{ | |
head.x = 25; | |
head.y = 20; | |
bend_no = 0; | |
head.direction = RIGHT; | |
Move(); | |
} | |
else | |
{ | |
system("cls"); | |
printf("All lives completed\nBetter Luck Next Time!!!\nPress any key to quit the game\n"); | |
record(); | |
exit(0); | |
} | |
} | |
} | |
void Food() | |
{ | |
if (head.x == food.x && head.y == food.y) | |
{ | |
length++; | |
time_t a; | |
a = time(0); | |
srand(a); | |
food.x = rand() % 70; | |
if (food.x <= 10) | |
food.x += 11; | |
food.y = rand() % 30; | |
if (food.y <= 10) | |
food.y += 11; | |
} | |
else if (food.x == 0) /*to create food for the first time coz global variable are initialized with 0*/ | |
{ | |
food.x = rand() % 70; | |
if (food.x <= 10) | |
food.x += 11; | |
food.y = rand() % 30; | |
if (food.y <= 10) | |
food.y += 11; | |
} | |
} | |
void Left() | |
{ | |
int i; | |
for (i = 0; i <= (bend[bend_no].x - head.x) && len < length; i++) | |
{ | |
GotoXY((head.x + i), head.y); | |
{ | |
if (len == 0) | |
printf("<"); | |
else | |
printf("*"); | |
} | |
body[len].x = head.x + i; | |
body[len].y = head.y; | |
len++; | |
} | |
Bend(); | |
if (!kbhit()) | |
head.x--; | |
} | |
void Right() | |
{ | |
int i; | |
for (i = 0; i <= (head.x - bend[bend_no].x) && len < length; i++) | |
{ | |
//GotoXY((head.x-i),head.y); | |
body[len].x = head.x - i; | |
body[len].y = head.y; | |
GotoXY(body[len].x, body[len].y); | |
{ | |
if (len == 0) | |
printf(">"); | |
else | |
printf("*"); | |
} | |
/*body[len].x=head.x-i; | |
body[len].y=head.y;*/ | |
len++; | |
} | |
Bend(); | |
if (!kbhit()) | |
head.x++; | |
} | |
void Bend() | |
{ | |
int i, j, diff; | |
for (i = bend_no; i >= 0 && len < length; i--) | |
{ | |
if (bend[i].x == bend[i - 1].x) | |
{ | |
diff = bend[i].y - bend[i - 1].y; | |
if (diff < 0) | |
for (j = 1; j <= (-diff); j++) | |
{ | |
body[len].x = bend[i].x; | |
body[len].y = bend[i].y + j; | |
GotoXY(body[len].x, body[len].y); | |
printf("*"); | |
len++; | |
if (len == length) | |
break; | |
} | |
else if (diff > 0) | |
for (j = 1; j <= diff; j++) | |
{ | |
/*GotoXY(bend[i].x,(bend[i].y-j)); | |
printf("*");*/ | |
body[len].x = bend[i].x; | |
body[len].y = bend[i].y - j; | |
GotoXY(body[len].x, body[len].y); | |
printf("*"); | |
len++; | |
if (len == length) | |
break; | |
} | |
} | |
else if (bend[i].y == bend[i - 1].y) | |
{ | |
diff = bend[i].x - bend[i - 1].x; | |
if (diff < 0) | |
for (j = 1; j <= (-diff) && len < length; j++) | |
{ | |
/*GotoXY((bend[i].x+j),bend[i].y); | |
printf("*");*/ | |
body[len].x = bend[i].x + j; | |
body[len].y = bend[i].y; | |
GotoXY(body[len].x, body[len].y); | |
printf("*"); | |
len++; | |
if (len == length) | |
break; | |
} | |
else if (diff > 0) | |
for (j = 1; j <= diff && len < length; j++) | |
{ | |
/*GotoXY((bend[i].x-j),bend[i].y); | |
printf("*");*/ | |
body[len].x = bend[i].x - j; | |
body[len].y = bend[i].y; | |
GotoXY(body[len].x, body[len].y); | |
printf("*"); | |
len++; | |
if (len == length) | |
break; | |
} | |
} | |
} | |
} | |
void Boarder() | |
{ | |
system("cls"); | |
int i; | |
GotoXY(food.x, food.y); /*displaying food*/ | |
printf("F"); | |
for (i = 10; i < 71; i++) | |
{ | |
GotoXY(i, 10); | |
printf("!"); | |
GotoXY(i, 30); | |
printf("!"); | |
} | |
for (i = 10; i < 31; i++) | |
{ | |
GotoXY(10, i); | |
printf("!"); | |
GotoXY(70, i); | |
printf("!"); | |
} | |
} | |
void Print() | |
{ | |
//GotoXY(10,12); | |
printf("\tWelcome to the Snake game\n"); | |
getch(); | |
system("cls"); | |
printf("\t\tGame instructions\n"); | |
printf("\n1. Use arrow keys to move the snake.\n\n2. Press any key to pause the game. To continue press any other key once again\n\n3. Press esc key to exit \n"); | |
printf("\n\nPress any key..."); | |
if (getch() == 27) | |
exit(0); | |
} | |
void record() | |
{ | |
char plname[20], nplname[20], cha, c; | |
int i, j, px; | |
FILE *info; | |
info = fopen("record.txt", "a+"); | |
getch(); | |
system("cls"); | |
printf("Enter your name\n"); | |
scanf("%[^\n]", plname); | |
//************************ | |
for (j = 0; plname[j] != '\0'; j++) | |
{ //to convert the first letter after space to capital | |
nplname[0] = toupper(plname[0]); | |
if (plname[j - 1] == ' ') | |
{ | |
nplname[j] = toupper(plname[j]); | |
nplname[j - 1] = plname[j - 1]; | |
} | |
else | |
nplname[j] = plname[j]; | |
} | |
nplname[j] = '\0'; | |
//***************************** | |
//sdfprintf(info,"\t\t\tPlayers List\n"); | |
fprintf(info, "Player Name :%s\n", nplname); | |
//for date and time | |
time_t mytime; | |
mytime = time(NULL); | |
fprintf(info, "Played Date:%s", ctime(&mytime)); | |
//************************** | |
fprintf(info, "Score:%d\n", px = Scoreonly()); //call score to display score | |
//fprintf(info,"\nLevel:%d\n",10);//call level to display level | |
for (i = 0; i <= 50; i++) | |
fprintf(info, "%c", '_'); | |
fprintf(info, "\n"); | |
fclose(info); | |
printf("wanna see past records press 'y'\n"); | |
cha = getch(); | |
system("cls"); | |
if (cha == 'y') | |
{ | |
info = fopen("record.txt", "r"); | |
do | |
{ | |
putchar(c = getc(info)); | |
} while (c != EOF); | |
} | |
fclose(info); | |
} | |
int Score() | |
{ | |
int score; | |
GotoXY(20, 8); | |
score = length - 5; | |
printf("SCORE : %d", (length - 5)); | |
score = length - 5; | |
GotoXY(50, 8); | |
printf("Life : %d", life); | |
return score; | |
} | |
int Scoreonly() | |
{ | |
int score = Score(); | |
system("cls"); | |
return score; | |
} | |
void Up() | |
{ | |
int i; | |
for (i = 0; i <= (bend[bend_no].y - head.y) && len < length; i++) | |
{ | |
GotoXY(head.x, head.y + i); | |
{ | |
if (len == 0) | |
printf("^"); | |
else | |
printf("*"); | |
} | |
body[len].x = head.x; | |
body[len].y = head.y + i; | |
len++; | |
} | |
Bend(); | |
if (!kbhit()) | |
head.y--; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment