问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求C语言贪吃蛇代码能在DEV上运行通过的贪吃蛇,不要TC上的啊我们老师上课...

发布网友 发布时间:2023-11-17 21:08

我来回答

1个回答

热心网友 时间:2024-05-26 08:01

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>


#define U 1
#define D 2
#define L 3
#define R 4       //蛇的状态,U:上 ;D:下;L:左 R:右

typedef struct SNAKE { //蛇身的一个节点
    int x;
    int y;
    struct SNAKE *next;
} snake;

//全局变量//
int score=0,add=10;//总得分与每次吃食物得分。
int status,sleeptime=200;//每次运行的时间间隔
snake *head, *food;//蛇头指针,食物指针
snake *q;//遍历蛇的时候用到的指针
int endgamestatus=0; //游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。

//声明全部函数//
void Pos();
void creatMap();
void initsnake();
int biteself();
void createfood();
void cantcrosswall();
void snakemove();
void pause();
void gamecircle();
void welcometogame();
void endgame();
void gamestart();

void Pos(int x,int y)//设置光标位置
{
    COORD pos;
    HANDLE hOutput;
    pos.X=x;
    pos.Y=y;
    hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOutput,pos);
}

void creatMap()//创建地图
{
    int i;
    for(i=0; i<58; i+=2) { //打印上下边框
        Pos(i,0);
        printf("■");
        Pos(i,26);
        printf("■");
    }
    for(i=1; i<26; i++) { //打印左右边框
        Pos(0,i);
        printf("■");
        Pos(56,i);
        printf("■");
    }
}

void initsnake()//初始化蛇身
{
    snake *tail;
    int i;
    tail=(snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置//
    tail->x=24;
    tail->y=5;
    tail->next=NULL;
    for(i=1; i<=4; i++) {
        head=(snake*)malloc(sizeof(snake));
        head->next=tail;
        head->x=24+2*i;
        head->y=5;
        tail=head;
    }
    while(tail!=NULL) { //从头到为,输出蛇身
        Pos(tail->x,tail->y);
        printf("■");
        tail=tail->next;
    }
}

int biteself()//判断是否咬到了自己
{
    snake *self;
    self=head->next;
    while(self!=NULL) {
        if(self->x==head->x && self->y==head->y) {
            return 1;
        }
        self=self->next;
    }
    return 0;
}

void createfood()//随机出现食物
{
    snake *food_1;
    srand((unsigned)time(NULL));
    food_1=(snake*)malloc(sizeof(snake));
    while((food_1->x%2)!=0) {  //保证其为偶数,使得食物能与蛇头对其
        food_1->x=rand()%52+2;
    }
    food_1->y=rand()%24+1;
    q=head;
    while(q->next==NULL) {
        if(q->x==food_1->x && q->y==food_1->y) { //判断蛇身是否与食物重合
            free(food_1);
            createfood();
        }
        q=q->next;
    }
    Pos(food_1->x,food_1->y);
    food=food_1;
    printf("■");
}

void cantcrosswall()//不能穿墙
{
    if(head->x==0 || head->x==56 ||head->y==0 || head->y==26) {
        endgamestatus=1;
        endgame();
    }
}

void snakemove()//蛇前进,上U,下D,左L,右R
{
    snake * nexthead;
    cantcrosswall();

    nexthead=(snake*)malloc(sizeof(snake));
    if(status==U) {
        nexthead->x=head->x;
        nexthead->y=head->y-1;
        if(nexthead->x==food->x && nexthead->y==food->y) { //如果下一个有食物//
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            score=score+add;
            createfood();
        } else {                                           //如果没有食物//
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q->next->next!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            Pos(q->next->x,q->next->y);
            printf("  ");
            free(q->next);
            q->next=NULL;
        }
    }
    if(status==D) {
        nexthead->x=head->x;
        nexthead->y=head->y+1;
        if(nexthead->x==food->x && nexthead->y==food->y) { //有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            score=score+add;
            createfood();
        } else {                           //没有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q->next->next!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            Pos(q->next->x,q->next->y);
            printf("  ");
            free(q->next);
            q->next=NULL;
        }
    }
    if(status==L) {
        nexthead->x=head->x-2;
        nexthead->y=head->y;
        if(nexthead->x==food->x && nexthead->y==food->y) { //有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            score=score+add;
            createfood();
        } else {                            //没有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q->next->next!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            Pos(q->next->x,q->next->y);
            printf("  ");
            free(q->next);
            q->next=NULL;
        }
    }
    if(status==R) {
        nexthead->x=head->x+2;
        nexthead->y=head->y;
        if(nexthead->x==food->x && nexthead->y==food->y) { //有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            score=score+add;
            createfood();
        } else {                                     //没有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q->next->next!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            Pos(q->next->x,q->next->y);
            printf("  ");
            free(q->next);
            q->next=NULL;
        }
    }
    if(biteself()==1) {     //判断是否会咬到自己
        endgamestatus=2;
        endgame();
    }
}

void pause()//暂停
{
    while(1) {
        Sleep(300);
        if(GetAsyncKeyState(VK_SPACE)) {
            break;
        }

    }
}

void gamecircle()//控制游戏
{

    Pos(64,15);
    printf("不能穿墙,不能咬到自己\n");
    Pos(64,16);
    printf("用↑.↓.←.→分别控制蛇的移动.");
    Pos(64,17);
    printf("F1 为加速,F2 为减速\n");
    Pos(64,18);
    printf("ESC :退出游戏.space:暂停游戏.");
    Pos(64,20);
    //
    status=R;
    while(1) {
        Pos(64,10);
        printf("得分:%d  ",score);
        Pos(64,11);
        printf("每个食物得分:%d分",add);
        if(GetAsyncKeyState(VK_UP) && status!=D) {
            status=U;
        } else if(GetAsyncKeyState(VK_DOWN) && status!=U) {
            status=D;
        } else if(GetAsyncKeyState(VK_LEFT)&& status!=R) {
            status=L;
        } else if(GetAsyncKeyState(VK_RIGHT)&& status!=L) {
            status=R;
        } else if(GetAsyncKeyState(VK_SPACE)) {
            pause();
        } else if(GetAsyncKeyState(VK_ESCAPE)) {
            endgamestatus=3;
            break;
        } else if(GetAsyncKeyState(VK_F1)) {
            if(sleeptime>=50) {
                sleeptime=sleeptime-30;
                add=add+2;
                if(sleeptime==320) {
                    add=2;//防止减到1之后再加回来有错
                }
            }
        } else if(GetAsyncKeyState(VK_F2)) {
            if(sleeptime<350) {
                sleeptime=sleeptime+30;
                add=add-2;
                if(sleeptime==350) {
                    add=1;  //保证最低分为1
                }
            }
        }
        Sleep(sleeptime);
        snakemove();
    }
}

void welcometogame()//开始界面
{
    Pos(40,12);

    //
    printf("欢迎来到贪食蛇游戏!");
    Pos(40,25);
    //
    system("pause");
    system("cls");
    Pos(25,12);
    printf("用↑.↓.←.→分别控制蛇的移动, F1 为加速,2 为减速\n");
    Pos(25,13);
    printf("加速将能得到更高的分数。\n");
    system("pause");
    system("cls");
}

void endgame()//结束游戏
{

    system("cls");
    Pos(24,12);
    if(endgamestatus==1) {
        printf("对不起,您撞到墙了。游戏结束.");
    } else if(endgamestatus==2) {
        printf("对不起,您咬到自己了。游戏结束.");
    } else if(endgamestatus==3) {
        printf("您的已经结束了游戏。");
    }
    Pos(24,13);
    printf("您的得分是%d\n",score);
    exit(0);
}

void gamestart()//游戏初始化
{
    system("mode con cols=100 lines=30");
    welcometogame();
    creatMap();
    initsnake();
    createfood();
}

int main()
{
    gamestart();
    gamecircle();
    endgame();
    return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
单位高温防护欠缺致员工中暑如何对待 狗狗为什么爱看视频 360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 火车上可以带电动车锁吗10 火车上可以带指纹锁吗? 乘坐火车能带锁吗?7 我的梦生活作文600字 这个手机屏幕是什么型号啊?哪位大神知道啊,我要确定机型,好像... Vivo请大神帮忙鉴定,这是vivo手机的什么型号?y85还... 玩泡泡堂时 怎样才能搞成窗口模式 手不离方向盘,转弯如何打转向灯,还有雨刮器? 沉睡的书阅读答案 炸田鸡怎么做329 梦见和情人见面她不讲话的预兆 庄子与惠子游于濠梁之上 翻译问题21 广东电信3G上网卡 1元5小时卡 1元包5小时 30元包150小时可信度多高好... 庄子与惠子游于濠梁之上的翻译是什么,求翻译???50 庄子与惠子游于濠梁之上 翻译问题2 白铅粉和化妆品一起涂在脸上会有什么后果? 潜水猫可以下载吗 天蝎男人分手后还想做朋友是出于什么心理395 Mate40Pro下载东西中病毒了? 杭州逸城在哪里? 座火车过安检车锁可以带吗1 一年内怎么改第二次 火车上可以带指纹锁吗?指纹锁锁体很大,而且是铁器,会不会当成... 骑自行车旅游沈阳附近那里最好2 有没有故事情节很好的巫术类电影?就像是(万能钥匙)和(坠入地狱)一样的... 怎么样加回删除的微信好友误删了我的微信好友,但又没有它的,怎么... 华硕主板X79-DELUXE CPU LED 亮 ,主板显示... 杭州华立永通逸城在哪里? 统计学假设检验有几种方法?具体是什么?14 Mate 40 Pro下载东西中病毒了? 用铅粉涂脸,古人真的什么都敢往脸上涂4 梅干菜酱肉包的做法,梅干菜酱肉包怎么做好吃,梅干菜2 街头篮球PG如何连背2? 如果被盗我把实名认证注销了并且把银行卡解绑了出了事情我还会... 数什么寒什么6 有没有用广东电信1元包5小时上网卡的吧友 国产航母甲板有多厚3 电信1元5小时wap上网卡网速怎样? 航空母舰的甲板有多厚?143 360借条办理&#xF236;&#xFE0F;手续费吗?