Code:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define startx 10
#define starty 13
struct t_koor {
int x,y;
} snake[100];
struct t_score {
char name[25];
int score;
} sscr[10];
int spda=50,bdy=10,i,j;
int grid[25][80],pos;
FILE *scr;
void bubblesort(int a)
{
int temp,b,c;
char temp2[25];
for(i=0;i<9;i++) for(j=9;j>i;j--)
{
if(a==1) {b = j;c = j-1;}
else if(a==2) {b = j-1;c = j;}
if(sscr[b].score>sscr[c].score)
{
temp = sscr[j].score;
sscr[j].score = sscr[j-1].score;
sscr[j-1].score = temp;
strcpy(temp2,sscr[j].name);
strcpy(sscr[j].name,sscr[j-1].name);
strcpy(sscr[j-1].name,temp2);
}
}
}
void i_score(int score)
{
char name[25];
clrscr();
scr = fopen("C:\snkscr.dat","r+");
for(i=0;i<10;i++) fread(&sscr[i],sizeof(struct t_score),1,scr);
fclose(scr);
printf("HIGH SCORE :\n\n");
for(i=0;i<10;i++) printf("%2d. %s - %d\n",i+1,sscr[i].name,sscr[i].score);
gotoxy(1,14);printf("Your score is %3d\n",score);getch();
if(score>=sscr[9].score)
{
do{
gotoxy(1,16);clreol();
printf("Please input your name! [MAX = 11] ");
gets(name);
} while(strlen(name)>11);
for(i=0;i<10;i++)
{
if(score==sscr[9].score) sscr[9].score = score;
else if(score>=sscr[i+1].score && score<=sscr[i].score)
{
for(j=9;j>i+1;j--)
{
sscr[j].score = sscr[j-1].score;
strcpy(sscr[j].name,sscr[j-1].name);
}
strcpy(sscr[i+1].name,name);
sscr[i+1].score = score;
break;
}
}
}
scr = fopen("C:\snkscr.dat","w");
for(i=0;i<10;i++) fwrite(&sscr[i],sizeof(struct t_score),1,scr);
fclose(scr);
printf("\nPress any key to go back to main menu");
getch();
}
void s_score(void)
{
char key,sure;
scr = fopen("C:\snkscr.dat","r+");
for(i=0;i<10;i++) fread(&sscr[i],sizeof(struct t_score),1,scr);
fclose(scr);
do {
clrscr();
gotoxy(35,2);textcolor(YELLOW);cprintf("HIGH SCORE");
gotoxy(25,5);textcolor(LIGHTRED);for(i=0;i<30;i++) cprintf("=");
for(i=0;i<12;i++) {gotoxy(25,i+6);textcolor(LIGHTRED);cprintf("=");}
for(i=0;i<10;i++) {gotoxy(29,7+i);printf("%2d. %s - %4d\n",i+1,sscr[i].name,sscr[i].score);}
for(i=0;i<12;i++) {gotoxy(54,i+6);textcolor(LIGHTRED);cprintf("=");}
gotoxy(25,18);textcolor(LIGHTRED);for(i=0;i<30;i++) cprintf("=");
gotoxy(1,22);
printf("1. Reset Highscore\n");
printf("2. Sort Descending\n");
printf("3. Sort Ascending\n");
printf("4. Back to Main Menu\n");
key = (char) getch();
if(key=='1')
{
printf("Are you sure ? [Y/N]");
sure = (char) getch();
if(sure=='y')
{
for(i=0;i<10;i++)
{
strcpy(sscr[i].name,"Snake Mania");
sscr[i].score = ((2000/(i+1))/10)*10;
}
scr = fopen("C:\snkscr.dat","w");
for(i=0;i<10;i++) fwrite(&sscr[i],sizeof(struct t_score),1,scr);
fclose(scr);
}
}
else if(key=='2') bubblesort(1);
else if(key=='3') bubblesort(2);
} while(key!='4');
}
void speed(int sec)
{
clock_t timesec;
timesec = clock();
while((clock() - timesec) < sec);
}
void move(char arah,int body)
{
switch(arah)
{
case 72:
{
snake[body].x = snake[body-1].x;
snake[body].y = snake[body-1].y - 1;
}
break;
case 75:
{
snake[body].x = snake[body-1].x - 1;
snake[body].y = snake[body-1].y;
}
break;
case 77:
{
snake[body].x = snake[body-1].x + 1;
snake[body].y = snake[body-1].y;
}
break;
case 80:
{
snake[body].x = snake[body-1].x;
snake[body].y = snake[body-1].y + 1;
}
}
}
void lvlgrid(int lvl)
{
if(lvl==1)
{
for(i=0;i<80;i++) grid[0][i] = 1;
for(i=0;i<80;i++) grid[23][i] = 1;
for(i=1;i<24;i++) grid[i][0] = 1;
for(i=1;i<24;i++) grid[i][79] = 1;
}
else if(lvl==2)
{
for(i=19;i<60;i++) grid[6][i] = 1;
for(i=19;i<60;i++) grid[16][i] = 1;
}
else if(lvl==3)
{
for(i=5;i<21;i++) grid[i][5] = 1;
for(i=5;i<21;i++) grid[i][75] = 1;
}
else if(lvl==4)
{
for(i=10;i<13;i++) grid[i][19] = 1;
for(i=10;i<13;i++) grid[i][59] = 1;
}
else if(lvl==5)
{
for(i=24;i<55;i++) grid[4][i] = 1;
for(i=24;i<55;i++) grid[19][i] = 1;
}
else if(lvl==6)
{
for(i=0;i<25;i++) for(j=0;j<80;j++) grid[i][j] = 0;
for(i=0;i<80;i++) {grid[0][i] = 1;grid[23][i] = 1;}
for(i=0;i<30;i++) {grid[5][i] = 1;grid[5][i+50] = 1;grid[18][i] = 1;grid[18][i+50] = 1;}
for(i=1;i<5;i++) {grid[i][0] = 1;grid[i+18][0] = 1;grid[i][79] = 1;grid[i+18][79] = 1;}
for(i=0;i<14;i++) {grid[i+5][30] = 1;grid[i+5][49] = 1;}
for(i=0;i<11;i++) grid[i+7][39] = 1;
grid[11][30] = 0;grid[12][30] = 0;
grid[11][49] = 0;grid[12][49] = 0;
}
textcolor(LIGHTBLUE);
for(i=0;i<25;i++) for(j=0;j<80;j++)
{
if(grid[i][j]==1)
{
gotoxy(j+1,i+1);
cprintf("=");
}
}
}
void ular(int spd,int body)
{
int foodx,foody,chc;
int bonusx,bonusy;
int xtx,xty,xttm,xtchc;
int score=0,lvl=1;
int t1=1,t2=1,b1=1,b2=1;
char key,arah=77,game,new = 1;
clrscr();
pos = 1;
chc = random(2);
xttm = random(5);
for(i=0;i<25;i++) for(j=0;j<80;j++) grid[i][j] = 0;
lvlgrid(1);
for(i=0;i<body;i++)
{
snake[i].y = starty;
snake[i].x = startx + i;
}
do {
foodx = random(78) + 2;
foody = random(22) + 2;
bonusx = random(78) + 2;
bonusy = random(22) + 2;
for(i=0;i<body;i++) if((snake[i].x==foodx && snake[i].y==foody) || (snake[i].x==bonusx && snake[i].y==bonusy)) break;
} while((bonusx==foodx && bonusy==foody) || grid[bonusy-1][bonusx-1]==1 || grid[foody-1][foodx-1]==1 || i!=body);
gotoxy(1,25);
textcolor(LIGHTRED);
cprintf("SCORE :");
gotoxy(14,25);
cprintf("BODY LENGTH :");
gotoxy(33,25);
cprintf("LEVEL :");
do{
gotoxy(9,25);
textcolor(YELLOW);
cprintf("%3d ",score);
gotoxy(27,25);
cprintf("%3d ",body);
gotoxy(41,25);
cprintf("%d",lvl);
gotoxy(50,25);clreol();
textcolor(LIGHTRED);
cprintf("<P> = PAUSE THE GAME!");
if(pos!=lvl)
{
pos = lvl;
gotoxy(50,25);clreol();
textcolor(LIGHTRED);
cprintf("LEVEL UP!");
speed(2000);
gotoxy(60,25);clreol();
for(i=0;i<body;i++)
{
gotoxy(snake[i].x,snake[i].y);
printf(" ");
}
gotoxy(t1,t2);printf(" ");
gotoxy(b1,b2);printf(" ");
body = bdy;
arah = 77;
new = 1;
for(i=0;i<body;i++)
{
snake[i].y = starty;
snake[i].x = startx + i;
}
lvlgrid(lvl);
do {
foodx = random(78) + 2;
foody = random(22) + 2;
for(i=0;i<body;i++) if(snake[i].x==foodx && snake[i].y==foody) break;
} while((bonusx==foodx && bonusy==foody) || grid[foody-1][foodx-1]==1 || i!=body);
}
if(lvl>=3 && xttm==0)
{
xtchc = random(1271);
if(xtchc==random(774)-body+53)
{
do {
xtx = random(78) + 2;
xty = random(22) + 2;
for(i=0;i<body;i++) if(snake[i].x==xtx && snake[i].y==xty) break;
} while((xtx==foodx && xty==foody) || (xtx==bonusx && xty==bonusy) || grid[xty-1][xtx-1]==1 || i!=body);
xttm = random(25) + 26;
}
}
if(xttm!=0)
{
gotoxy(xtx,xty);
textcolor(YELLOW);
cprintf("§");
xttm--;
}
if(xttm==0) {gotoxy(xtx,xty);printf(" ");}
if(chc==1)
{
gotoxy(bonusx,bonusy);
textcolor(LIGHTRED);
cprintf("$");
}
gotoxy(foodx,foody);textcolor(LIGHTGREEN);cprintf("@");
for(i=0;i<body;i++)
{
gotoxy(snake[i].x,snake[i].y);
textcolor(YELLOW);cprintf("*");
}
if(kbhit())
{
key = (char) getch();
if(key=='p')
{
gotoxy(50,25);clreol();
textcolor(LIGHTRED);
cprintf("PRESS ANY KEY TO RESUME GAME!");
getch();
}
else if((key==72 && arah!=80) || (key==75 && arah!=77) || (key==77 && arah!=75) || (key==80 && arah!=72)) arah = key;
speed(30);
if(kbhit())
{
key = (char) getch();
if((key==72 && arah!=80) || (key==75 && arah!=77) || (key==77 && arah!=75) || (key==80 && arah!=72)) arah = key;
}
}
if(new==1)
{
gotoxy(50,25);clreol();
textcolor(LIGHTRED);
cprintf("PRESS ANY KEY TO START!");
getch();
gotoxy(50,25);clreol();
new = 0;
}
move(arah,body);
speed(spd);
gotoxy(snake[0].x,snake[0].y);printf(" ");
for(i=0;i<body;i++) snake[i] = snake[i+1];
if(snake[body-1].x==81) snake[body-1].x = 1;
else if(snake[body-1].x==0) snake[body-1].x = 80;
for(i=1;i<body;i++) if((snake[body-1].x)==(snake[i-1].x) && (snake[body-1].y)==(snake[i-1].y))
{
game='x';
gotoxy(50,25);clreol();
textcolor(LIGHTRED);
cprintf("YOU LOSE!");
getch();
break;
}
if(grid[snake[body-1].y-1][snake[body-1].x-1]==1)
{
gotoxy(50,25);clreol();
textcolor(LIGHTRED);
cprintf("YOU LOSE!");
game = 'x';
getch();
}
b1 = bonusx;b2 = bonusy;
t1 = foodx;t2 = foody;
if(snake[body-1].x==foodx && snake[body-1].y==foody)
{
do {
foodx = random(78) + 2;
foody = random(22) + 2;
for(i=0;i<body;i++) if(snake[i].x==foodx && snake[i].y==foody) break;
} while((bonusx==foodx && bonusy==foody) || grid[foody-1][foodx-1]==1 || i!=body);
score+=10;
body++;
}
if(snake[body-1].x==bonusx && snake[body-1].y==bonusy)
{
do {
bonusx = random(78) + 2;
bonusy = random(22) + 2;
for(i=0;i<body;i++) if(snake[i].x==bonusx && snake[i].y==bonusy) break;
} while((bonusx==foodx && bonusy==foody) || grid[bonusy-1][bonusx-1]==1 || i!=body);
score+=50;
chc = random(2);
}
if(snake[body-1].x==xtx && snake[body-1].y==xty)
{
do {
xtx = random(78) + 2;
xty = random(22) + 2;
for(i=0;i<body;i++) if(snake[i].x==xtx && snake[i].y==xty) break;
} while((xtx==foodx && xty==foody) || (xtx==bonusx && xty==bonusy) || grid[xty-1][xtx-1]==1 || i!=body);
score+=200;
xttm = 0;
}
if(score>=250 && score<500) lvl = 2;
else if(score>=500 && score<850) lvl = 3;
else if(score>=850 && score<1200) lvl = 4;
else if(score>=1200) lvl = 5;
else if(score>=1500) lvl = 6;
} while(game!='x' && key!=27);
i_score(score);
}
void diff(void)
{
char sel;
do {
gotoxy(1,12);
printf("================\n");
printf("1. Very Easy ||\n");
printf("2. Easy ||\n");
printf("3. Normal ||\n");
printf("4. Medium ||\n");
printf("5. Hard ||\n");
printf("6. Very Hard ||\n");
printf("================\n");
sel = (char) getch();
switch(sel)
{
case '1': spda = 100;bdy = 5;
break;
case '2': spda = 75;bdy = 8;
break;
case '3': spda = 40;bdy = 10;
break;
case '4': spda = 20;bdy = 13;
break;
case '5': spda = 15;bdy = 17;
break;
case '6': spda = 5;bdy = 20;
}
} while(sel!='1' && sel!='2' && sel!='3' && sel!='4' && sel!='5' && sel!='6');
gotoxy(1,12);clreol();gotoxy(1,13);clreol();gotoxy(1,14);clreol();
gotoxy(1,15);clreol();gotoxy(1,16);clreol();gotoxy(1,17);clreol();
gotoxy(1,18);clreol();gotoxy(1,19);clreol();gotoxy(1,20);clreol();
}
void title(void)
{
gotoxy(21,2);textcolor(LIGHTBLUE);cprintf("======================================");
gotoxy(21,3);textcolor(YELLOW);cprintf("**** ** * * * * *****");
gotoxy(21,4);cprintf("* * * * * * * * *");
gotoxy(21,5);cprintf("**** * * * * * * * *****");
gotoxy(21,6);cprintf(" * * ** ******* * * *");
gotoxy(21,7);cprintf("**** * * * * * * *****");
gotoxy(21,8);textcolor(LIGHTRED);cprintf("======================================");
gotoxy(1,24);for(i=0;i<80;i++) printf("_");
}
void menu(void)
{
int exit=0,temp;
int SATU=15,DUA=0,TIGA=0,EMPAT=0,TEXT=15;
char key;
title();
do {
textcolor(TEXT);
gotoxy(36,11);textbackground(SATU);cprintf("NEW GAME");
gotoxy(35,13);textbackground(DUA);cprintf("DIFFICULTY");
gotoxy(35,15);textbackground(TIGA);cprintf("HIGH SCORE");
gotoxy(38,17);textbackground(EMPAT);cprintf("EXIT");
textbackground(BLACK);
key = (char) getch();
switch(key)
{
case 72:
{
temp = SATU;
SATU = DUA;
DUA = TIGA;
TIGA = EMPAT;
EMPAT = temp;
}
break;
case 80:
{
temp = EMPAT;
EMPAT = TIGA;
TIGA = DUA;
DUA = SATU;
SATU = temp;
}
break;
case 13:
{
if(SATU==15) {ular(spda,bdy);clrscr();title();}
else if(DUA==15) diff();
else if(TIGA==15) {s_score();clrscr();title();}
else if(EMPAT==15) exit = 1;
}
}
} while(!exit);
}
int main()
{
_setcursortype(_NOCURSOR);
randomize();
if((scr = fopen("C:\snkscr.dat","r"))==NULL)
{
scr = fopen("C:\snkscr.dat","w");
for(i=0;i<10;i++)
{
strcpy(sscr[i].name,"Snake Mania");
sscr[i].score = ((2000/(i+1))/10)*10;
}
for(i=0;i<10;i++) fwrite(&sscr[i],sizeof(struct t_score),1,scr);
}
fclose(scr);
menu();
return 0;
}