贪吃蛇游戏的C语言实现

刚学习完C语言基础知识,希望通过制作简单的游戏来提高自己的能力

//2020年12月2日23:19:54  begin

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

using namespace std;

#define SNAKESIZE 100               //蛇的最大长度
#define MAPHIGHT 24
#define MAPWIDTH 78
#define GAMEINFX 82
#define GAMEINFY 10


void movetoxy(int x,int y)          //光标移动函数
{
    COORD p;
    p.X = x;
    p.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p);
}

struct          //食物的坐标
{
    int x;
    int y;
}food;

struct
{
    int speed;              //蛇的速度
    int len;
                   //蛇 长度
    int x[SNAKESIZE];       //蛇身体的x坐标
    int y[SNAKESIZE];       //        y坐标
}snake;

int key = 77;               //向"→"移动

int changeFlag = 0;         //判断蛇是否吃到食物
int endFlag = 0;            //结束标识变量
int score = 0;              //分数变量
int speed = 10;

void huanying(void);
void mapDraw(void);
void foodCreat(void);
void keyCtr(void);           //返回移动方向的int值
void snakeMove(int dir);     //蛇移动的方向
void conCtr(void);           //控制得分及失败条件
void gameInf(void);          //游戏信息,包括得分等

int main()
{
    huanying();
    if(endFlag)
        return 0;
    cout << endl << "\t按'↑'↓'←'→'以控制蛇移动的方向" << endl << endl << "\t按任意键以继续!";
    getchar();
    getchar();
    system("cls");
    mapDraw();
    foodCreat();
    while(1)
    {
        if(endFlag)
            break;
        keyCtr();
        snakeMove(key);
        conCtr();
        gameInf();
        Sleep(snake.speed);
        movetoxy(0,MAPHIGHT+1);
    }
    Sleep(5000);
    system("exit");

    return 0;
}

void huanying(void)
{
    int a;
    cout << endl << "\t\t贪吃蛇 V1.0" << endl;
    cout << "\t1.开始游戏" << endl;
    cout << "\t2.退出游戏" << endl << endl << "\t";
    cin >> a;
    if(a==1)
        endFlag = 0;
    else if(a==2)
        endFlag = 1;
    else
    {
        cout << endl << "\t请输入正确信息";
        endFlag = 1;
    }

}

void mapDraw(void)              //2020年12月3日00:09:25 完成
{
    //蛇属性初始化
    snake.len = 3;
    snake.speed = 300;
    snake.x[0] = MAPWIDTH/2+1;          //蛇头初始位置
    snake.y[0] = MAPHIGHT/2;

    int i = 0,j;
    for(i = 2;i<MAPWIDTH;i+=2)      //打印内部
    {
        for(j = 1;j<MAPHIGHT;j++)
        {
            movetoxy(i,j);
            cout << " ";
        }
    }
    for(i = 0;i<MAPWIDTH;i+=2)       //打印上下边界
    {
        movetoxy(i,0);
        std::cout << "□";
        movetoxy(i,MAPHIGHT);
        std::cout << "□";
    }
    for(i = 0;i<=MAPHIGHT;i++)          //打印左右边界
    {
        movetoxy(0,i);
        cout << "□";
        movetoxy(MAPWIDTH,i);
        cout << "□";
    }
                                        //打印游戏信息边框
    for(i = 0;i<28;i++)
    {
        movetoxy(GAMEINFX+i,0);
        cout << "+";
        movetoxy(GAMEINFX+i,GAMEINFY);
        cout << "+";
    }
    for(i = 0;i<GAMEINFY;i++)
    {
        movetoxy(GAMEINFX,i);
        cout << "+";
        movetoxy(GAMEINFX+27,i);
        cout << "+";
    }
    //打印蛇的身体
    i = 0;
    movetoxy(snake.x[0],snake.y[0]);
    cout << "●";       //■
    for(i = 1;i<snake.len;i++)
    {
        snake.x[i] = snake.x[i-1] - 2;
        snake.y[i] = snake.y[i-1];
        movetoxy(snake.x[i],snake.y[i]);
        cout << "○";
    }

}

void foodCreat(void)        //蛇的食物创造  2020年12月3日00:17:12
{
    int i = 0;
    srand(time(NULL));
    while(1)
    {
        food.x = rand()%(MAPWIDTH-1);
        food.y = rand()%(MAPHIGHT-1);
        for(i = 0;i<snake.len;i++)
        {
            if(food.x!=snake.x[i]&&food.y!=snake.y[i])
            {
                break;
            }
        }
        if(food.x%2==0&&food.x!=0&&food.x!=MAPWIDTH&&food.y!=0&&food.y!=MAPHIGHT)
            break;
    }
    movetoxy(food.x,food.y);
    cout << "■";
}

void keyCtr(void)
{
    //*“↑”:72
	//*“↓”:80
	//*“←”:75
	//*“→”:77
    int pre_key = key;       //创建个pre_key来存储之前的方向
    if(_kbhit()!=0)
    {
        fflush(stdin);

        key = _getch();
        key = _getch();
    }
    //若方向与移动方向相反,则按键无效
    if(pre_key==77&&key==75)
        key = 77;
    if(pre_key==75&&key==77)
        key = 75;
    if(pre_key==80&&key==72)
        key = 80;
    if(pre_key==72&&key==80)
        key = 72;


}

void snakeMove(int dir)
{
    int i = 0;
    if(changeFlag==0)
    {
        movetoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
        cout << "  ";
    }
    if(changeFlag==1)
    {
        snake.len++;
    }
    for(i = snake.len - 1;i>0;i--)
    {
        snake.x[i] = snake.x[i-1];
        snake.y[i] = snake.y[i-1];
        movetoxy(snake.x[i],snake.y[i]);
        cout << "○";
    }
    switch(dir)
    {
        case 77: snake.x[0] += 2;break;
        case 75: snake.x[0] -= 2;break;
        case 72: snake.y[0]--;break;
        case 80: snake.y[0]++;break;
        default: break;
    }

    if(snake.x[0]==food.x&&snake.y[0]==food.y)
        {
            changeFlag = 1;
            score += 10;
            if(score%100==0)
                {
                    speed += 5;
                    snake.speed -= 50;
                }
            foodCreat();
        }
    else
        changeFlag = 0;

    movetoxy(snake.x[0],snake.y[0]);
    cout << "●";

    movetoxy(0,MAPHIGHT);
}

void conCtr(void)
{
    int i = 0;
    //条件1:蛇不能撞到墙上,否则结束游戏
    if(snake.y[0]==0||snake.y[0]==MAPHIGHT||snake.x[0]==0||snake.x[0]==MAPWIDTH)
        {
            movetoxy(snake.x[0],snake.y[0]);
            cout << "□";
            endFlag = 1;
            return;
        }
    //条件2:蛇不能撞到自己
    for(i = 1;i<snake.len-1;i++)
    {
        if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
        {
            endFlag = 1;
            break;
        }
    }



}

void gameInf(void)
{
    movetoxy(GAMEINFX+5,3);
    cout << "长度:" << snake.len;
    movetoxy(GAMEINFX+15,3);
    cout << "速度:" << speed;
    movetoxy(GAMEINFX+10,5);
    cout << "得分:" << score;
    if(endFlag)
    {
        movetoxy(GAMEINFX+8,7);
        cout << "  游戏结束     ";
    }
    else
    {
        movetoxy(GAMEINFX+8,7);
        cout << "游戏进行中...";
        movetoxy(0,MAPHIGHT+1);
    }
}

简单的游戏,实现原理较简单,不过本人能力不足,按键输入及x、y坐标处理方面参考另外一篇文章“C语言贪吃蛇完整代码

posted @   Goper  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示