菜鸟上路之用C写的贪吃蛇

    一直想自己编写一款游戏,终于,因为疫情实在没事干,我动手了。 作为一个菜鸟,虽然心比天高,奈何实际动手能力为零,写写贪吃蛇它不香吗?就这样,我双击点开了百度。

    网上代码挺多,大同小异,随便挑选了一篇开始了我的借鉴之路。越看我越明白一个道理,基础不牢地动山摇,看个贪吃蛇代码都挺费劲,我这么菜吗?

    我选择狗带。  

    咸鱼几天后,突然想起来我的雄心壮志,连忙从侧卧改成平躺,还是绿婆娘好看。

    时间的脚步不会因为你流下的口水而暂缓,开学的钟声已然快要漫进耳旁,往日里娇憨可爱的绿婆娘在我眼里变得索然无味,我该干点什么了。

    小目标还没完成,贪吃蛇我对不起你!

    我敲下了第一行代码  #include<stdio.h>

    脑袋空空的???什么模块化、自顶向下、逐步求精???

    我又打开别人的代码,一边借鉴一边理解,原来要分这么多个函数,这个是模块化吧。用多个函数把贪吃蛇骨架搭起来,我终于找到了方向,剩下的只是把函数的内容填充上去就可以了。

    有些函数由于实在看不懂,只得照搬,这个:

    

void gotoxy(int x,int y)
{
    COORD pos;        
    HANDLE hOutput;        
    pos.X = x; 
    pos.Y = y;        
    hOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleCursorPosition(hOutput, pos);
}

    控制光标移动,以前确实没见过,具体怎么实现的我不知道,能用就行。

    在控制蛇的速度一块,之前我想的是用无意义的计算来占用时间,以达到控制效果:

    for(i=0;i<99999999;i++);

    后来百度一下,发现还有 sleep() 这么好用的函数,当即采用。

    这个

int ClickControl()
{
    while (1)
    {
        if (jieshu() == 0)return 0;
        if (_kbhit())
        {
            click = _getch();
        }
        move();
        eat();
    }
    return 1;
}

    _kbhit()是一个非阻塞函数,可以获得键盘信号,无动作返回0,有动作返回1,通过这个函数可以控制蛇的方向,当键盘输入上下左右后,执行句就会将方向赋给click,这样就可以在后面的选择语句中进入转向函数。

    我真是太厉害了。

    把代码全部理解后的那种成就感,就好像解开了一道高数题。

    然后我就开始敲自己的代码,调试、运行、调试、运行、调试......

    叮!恭喜玩家捕捉贪吃蛇一条。

    代码放这了,还有很多问题,我也不改了

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#define up 'w'
#define down 's'
#define right 'd'
#define left 'a'
#define up 'W'
#define down 'S'
#define right 'D'
#define left 'A'

void welcome();//开始界面//
void finish();//结束//
void gotoxy(int x, int y);//控制光标//
void creatwall();//打印围墙//
void gotohua(int x, int y);//打印//
void gotochu(int x, int y);//删除//
void creatfood();//产生食物//
int ClickControl();//获取键盘信号函数//
int jieshu();//判断结束//
void move();//移动身体//
void eat();//吃到食物//
void changebody(int a,int b);//改变身体//
void stop();

typedef struct snakes
{
    int x;
    int y;
    struct snakes* next;
}snake;

snake* tou, * wei;

struct food
{
    int x;
    int y;
}food;

char name[20] = { 0 };
int score = 0;
char click = right;
int nandu=5; 

int main()
{
    system("color 0B");
    welcome();
    creatwall();
    creatfood();
    if (ClickControl() == 0)
    {
        finish();
        return 0;
    }
    return 0;
}

void gotoxy(int x,int y)
{
    COORD pos;        
    HANDLE hOutput;        
    pos.X = x; 
    pos.Y = y;        
    hOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleCursorPosition(hOutput, pos);
}

void welcome()
{
    gotoxy(30, 3);
    printf("********************************************************");
    gotoxy(43, 10);
    printf("玩家你好,欢迎来到贪吃蛇游戏!");
    gotoxy(50, 12);
    printf("请输入名字:");
    gotoxy(46,17);
    printf("请输入难度(请填数字):");
    gotoxy(23,19);
    printf("1:白痴都能通关  2:平凡如你  3:哟?有点厉害啊  4:卧槽!牛逼  5:嘶!恐怖如斯");
    gotoxy(30, 26);
    printf("********************************************************");
    gotoxy(61,12) ;
    scanf("%s",&name);    
    gotoxy(67,17) ;
    scanf("%d",&nandu);
    
}

void gotohua(int x, int y)
{
    gotoxy(x, y);
    printf("*");
}

void gotochu(int x, int y)
{
    gotoxy(x, y);
    printf(" ");
}

void creatwall()
{
    int i,j;
    for(i=0;i<30;i++)
        for(j=0;j<150;j++)
        {
            gotochu(j,i);
        }

    for (i = 0;i < 80;i+=2)
    {
        gotohua(i, 0);
        gotohua(i, 29);
    }
    for (i = 0;i < 30; i++)
    {
        gotohua(0, i);
        gotohua(80, i);
    }
    gotoxy(87, 9);
    printf("亲爱的%s玩家,快来玩我呀!", name);
    gotoxy(84, 14);
    printf("你已经吃了 0 个了,偶!真是遭极了。");
    gotoxy(86, 19);
    printf("本游戏由**工作室荣誉开发");
    gotoxy(93,28);
    printf("wsad控制方向"); 
    gotoxy(85,29);
    printf("其余任意键暂停,双击wsad恢复"); 
    snake* p, * q,*z;
    tou = (snake*)malloc(sizeof(snake));
    tou->x = 7;
    tou->y = 15;
    wei= (snake*)malloc(sizeof(snake));
    wei->x = 4;
    wei->y = 15;
    p= (snake*)malloc(sizeof(snake));
    p->x = 6;
    p->y = 15;
    z= (snake*)malloc(sizeof(snake));
    z->x = 5;
    z->y = 15;
    tou->next = p;
    p->next = z;
    z->next = wei;
    wei->next = NULL;
    q = tou;
    while(q != NULL) {gotohua(q->x, q->y);q = q->next; }
}

void creatfood()
{
    srand((unsigned)time(NULL));
    food.x = rand() % 80 + 1;
    food.y= rand() % 28 + 1;
    snake* p;
    p = tou;
    while (1)
    {
        if (p->x == food.x && p->y == food.y)
        {
            food.x = rand() % 80 + 1;
            food.y = rand() % 28 + 1;
            p = tou;
        }
        else 
        {
            p = p->next;
        }
        if (p == NULL)break;
    }
    gotoxy(food.x,food.y);
    printf("*");
}

int jieshu()
{
    if (tou->x == 0 || tou->x == 80 || tou->y == 0 || tou->y == 29)return 0;
    snake* p;
    p = tou->next;
    while (p != NULL)
    {
        if (p->x == tou->x && p->y == tou->y)return 0;
        p = p->next;
    }
    return 1;
}

int ClickControl()
{
    while (1)
    {
        if (jieshu() == 0)return 0;
        if (_kbhit())
        {
            click = _getch();
        }
        move();
        eat();
    }
    return 1;
}

void move()
{
    int a = tou->x, b = tou->y;
    snake* p = tou;
    while (p!=NULL)
    {
        gotochu(p->x, p->y);
        p = p->next;
    }
        switch (click)
        {
        case up:
        case '24': 
            tou->y -= 1;
            changebody(a, b);
            break;
        case down:
        case '25':
            tou->y += 1;
            changebody(a, b);
            break;
        case right:
        case '26':
            tou->x += 1;
            changebody(a, b);
            break;
        case left:
        case '27':
            tou->x -= 1;
            changebody(a, b);
            break;
        default:
            stop();
            break;
        }
        
        
        switch (nandu)//调节速度 
        {
        case 1:
            Sleep(20);
            break;
        case 2:
            Sleep(50);
            break;
        case 3:
            Sleep(70);
            break;
        case 4:
            Sleep(100);
            break;
        case 5:
            Sleep(200);
            break;
        }
}

void changebody(int a, int b)
{
    snake* p = tou->next;
    int q1, q2, qq1, qq2;
    q1 = p->x, q2 = p->y;
    while (p->next!=NULL)
    {
        qq1 = p->next->x;
        qq2 = p->next->y;
        p->next->x = q1;
        p->next->y = q2;
        q1 = qq1;
        q2 = qq2;
        p = p->next;
    }
    p = tou->next;
    p->x = a;
    p->y = b;
    snake *pp;
    pp=tou;
    while(pp!=NULL)
    {
        gotohua(pp->x,pp->y);
        pp=pp->next;
    }
}

void eat()
{
    if (tou->x == food.x && tou->y == food.y)
    {
        creatfood();
        snake* _new = (snake*)malloc(sizeof(snake));
        snake* p;
        p = tou;
        while (1) 
        { 
            if (p->next->next == NULL) break;            
            p = p->next;
        }        
        p->next = _new;        
        _new->next = wei;        
        score += 1;        
        gotoxy(95, 14);        
        printf("%d", score);
    }
}

void finish()
{
    int i,j;
    for(i=0;i<30;i++)
        for(j=0;j<150;j++)
        {
            gotochu(j,i);
        }
    gotoxy(30, 6);
    printf("********************************************************");
    gotoxy(44, 13);
    printf("欧,我的上帝!你真是逊毙了。");
    gotoxy(53, 15);
    printf("游戏结束");
    gotoxy(30, 21);
    printf("********************************************************");
    gotoxy(0,25);
}

void stop()
{
    snake *p;
    p=tou;
    while(p!=NULL)
    {
        gotohua(p->x,p->y);
        p=p->next;
    }
    getch();
}

  

    

    

猜你喜欢

转载自www.cnblogs.com/rimo/p/12307792.html