贪吃蛇简易代码(肝了快一天,球赞啊)

#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 ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值