#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#define ROW 22
#define COL 42
#define KONG 0
#define WALL 1
#define FOOD 2
#define HEAD 3
#define BODY 4
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define SPACE 32
#define ESC 27
struct Snake{
int len,x,y;
}snake;
struct Body{
int x,y;
}body[ROW*COL];
int face[ROW][COL];
void HideCursor();
void CursorJump(int x,int y);
void InitInterface();
void color(int c);
void ReadGrade();
void WriteGrade();
void InitSnake();
void RandFood();
void JudgeFunc(int x,int y);
void DrawSnake(int flag);
void MoveSnake(int x,int y);
void run(int x,int y);
void Game();
int max,grade;
int main(){
max=0,grade=0;
system("title 贪吃蛇");
system("mode con cols=84 lines=23");
HideCursor();
ReadGrade();
InitInterface();
InitSnake();
srand((unsigned int)time(NULL));
RandFood();
DrawSnake(1);
Game();
return 0;
}void HideCursor(){
CONSOLE_CURSOR_INFO curInfo;
curInfo.dwSize=1;
curInfo.bVisible=FALSE;
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &curInfo);
return ;
}void CursorJump(int x, int y){
COORD pos;
pos.X=x;
pos.Y=y;
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(handle, pos);
return ;
}void InitInterface(){
color(6);
for(int i=0;i<ROW;i++)for(int j=0;j<COL;j++){
if(j==0||j==COL-1){
face[i][j]=WALL;
CursorJump(2*j,i);
printf("■");
}else if(i==0||i==ROW-1){
face[i][j]=WALL;
printf(" ■");
}else face[i][j]=KONG;
}color(7);
CursorJump(0,ROW);
printf("当前得分:%d",grade);
CursorJump(COL,ROW);
printf("历史最高得分:%d",max);
return ;
}void color(int c){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
return ;
}void ReadGrade(){
FILE* pf=fopen("贪吃蛇最高得分记录.txt", "r");
if (pf==NULL){
pf=fopen("贪吃蛇最高得分记录.txt", "w");
fwrite(&max, sizeof(int),1,pf);
}fseek(pf,0,SEEK_SET);
fread(&max,sizeof(int),1,pf);
fclose(pf);
pf=NULL;
return ;
}void WriteGrade(){
FILE* pf=fopen("贪吃蛇最高得分记录.txt","w");
if(pf==NULL){
printf("保存最高得分记录失败\n");
exit(0);
}fwrite(&grade,sizeof(int),1,pf);
fclose(pf);
pf=NULL;
return ;
}void InitSnake(){
snake.len=2;
snake.x=COL/2;
snake.y=ROW/2;
body[0].x=COL/2-1;
body[0].y=ROW/2;
body[1].x=COL/2-2;
body[1].y=ROW/2;
face[snake.y][snake.x]=HEAD;
face[body[0].y][body[0].x]=BODY;
face[body[1].y][body[1].x]=BODY;
return ;
}void RandFood(){
int i,j;
do{
i=rand()%ROW;
j=rand()%COL;
}while(face[i][j]!=KONG);
face[i][j]=FOOD;
color(12);
CursorJump(2*j,i);
printf("●");
return ;
}void JudgeFunc(int x,int y){
if(face[snake.y+y][snake.x+x]==FOOD){
snake.len++;
grade+=10;
color(7);
CursorJump(0,ROW);
printf("当前得分:%d",grade);
RandFood();
}if(face[snake.y+y][snake.x+x]==WALL||face[snake.y+y][snake.x+x]==BODY){
Sleep(1000);
system("cls");
color(7);
CursorJump(2*(COL/3),ROW/2-3);
if(grade>max){
printf("恭喜你打破最高记录,最高记录更新为%d",grade);
WriteGrade();
}else if(grade==max)printf("与最高记录持平,加油再创佳绩");
else printf("请继续加油,当前与最高记录相差%d",max-grade);
CursorJump(2*(COL/3),ROW/2);
printf("GAME OVER");
while(true){
char ch;
CursorJump(2 * (COL / 3), ROW / 2 + 3);
printf("再来一局?(y/n):");
scanf("%c", &ch);
if(ch=='y'||ch=='Y'){
system("cls");
main();
}else if(ch=='n'||ch=='N'){
CursorJump(2*(COL/3),ROW/2+5);
exit(0);
}
else{
CursorJump(2*(COL/3),ROW/2+5);
printf("选择错误,请再次选择");
}
}
}return ;
}
void DrawSnake(int flag){
if(flag==1){
color(10);
CursorJump(2*snake.x,snake.y);
printf("■");
for(int i=0;i<snake.len;i++){
CursorJump(2*body[i].x,body[i].y);
printf("□");
}
}else{
if(body[snake.len-1].x!=0){
CursorJump(2*body[snake.len-1].x,body[snake.len-1].y);
printf(" ");
}
}return ;
}
void MoveSnake(int x,int y){
DrawSnake(0);
face[body[snake.len-1].y][body[snake.len-1].x]=KONG;
face[snake.y][snake.x]=BODY;
for(int i=snake.len-1;i>0;i--)body[i].x=body[i-1].x,body[i].y=body[i-1].y;
body[0].x=snake.x,body[0].y=snake.y,snake.x=snake.x+x,snake.y=snake.y+y;
DrawSnake(1);
return ;
}void run(int x, int y){
int t=0;
while(1){
if(t==0)t=5000;
while(--t){
if(kbhit()!=0)
break;
}if(t==0){
JudgeFunc(x, y);
MoveSnake(x, y);
}else break;
}return ;
}void Game(){
int n=RIGHT;
int tmp=0;
goto first;
while(1){
n=getch();
switch(n){
case 'W':
case 'w':
case 'S':
case 's':
case UP:
case DOWN:
if(tmp!=LEFT&&tmp!=RIGHT)n=tmp;
break;
case 'A':
case 'a':
case 'D':
case 'd':
case LEFT:
case RIGHT:
if(tmp!=UP&&tmp!=DOWN)n=tmp;
case SPACE:
case ESC:
case 'r':
case 'R':
break;
default:
n=tmp;
break;
}
first:
switch(n){
case 'W':
case 'w':
case UP:
run(0, -1);
tmp=UP;
break;
case 'S':
case 's':
case DOWN:
run(0,1);
tmp=DOWN;
break;
case 'A':
case 'a':
case LEFT:
run(-1,0);
tmp=LEFT;
break;
case 'D':
case 'd':
case RIGHT:
run(1,0);
tmp=RIGHT;
break;
case SPACE:
system("pause>nul");
break;
case ESC:
system("cls");
color(7);
CursorJump(COL - 8, ROW / 2);
printf(" 游戏结束 ");
CursorJump(COL - 8, ROW / 2 + 2);
exit(0);
case 'r':
case 'R':
system("cls");
main();
}
}return ;
}
02-25
07-04