前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 纯 C 实现贪吃蛇小游戏

C++ 纯 C 实现贪吃蛇小游戏

作者头像
一枚大果壳
发布2024-05-18 09:12:11
1500
发布2024-05-18 09:12:11
举报
文章被收录于专栏:编程驿站编程驿站

纯C实现贪吃蛇经典小游戏!

代码语言:javascript
复制
#include <stdio.h>
#include <windows.h>
#include  <stdlib.h>
#include <time.h>


//描述蛇的节点信息
typedef struct SnakeNode
{
    int x;
    int y;
} Snode;

//箱子:放置蛇的所有节点
Snode snakes[100];
//保存用户选择的方向
char dir='l'; // u d l r
//保存食物
Snode food;
//蛇身有效长度
int size=5;
//速度
int speed=300;
//保存计分
int count=0;

/**
自定义一个功能函数:给我一个坐标,我就能够把你定位
*/
void setPosition(int x,int y)
{
    COORD point;
    point.X=x;
    point.Y=y;
    //重置坐标
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}

/**
显示友好的游戏界面
*/
void wellcome()
{
    setPosition(30,10);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),9);
    printf("欢迎来到贪吃蛇的世界!");
    setPosition(30,15);
    //暂停
    system("pause");
    //清屏createFood
    system("cls");
    //输出操作提示
    setPosition(30,10);
    printf("使用向上、向下、向左、向右的方向键控制蛇的方向");
    setPosition(30,11);
    system("pause");
    system("cls");
}

/*
功能模块:绘制围墙 1B=8bit A:1B 中文:2B
*/
void paintWall()
{
    int index=0;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
    //上边。下边
    for(index=0; index<58; index=index+2)
    {
        setPosition(index,0);
        printf("■");
        setPosition(index,26);
        printf("■");
    }
    //左边、右边akes[0].x=oldX+2;
    for(index=1; index<=26; index++)
    {
        setPosition(0,index);
        printf("■");
        setPosition(56,index);
        printf("■");
    }

    srand(time(0));
    int x=rand()%54+2;
    int y=rand()%24+1;
    int l=4;
    for(index=0;index<l;index++){
        setPosition(x,y);
         printf("■");
         x=x+2;
    }
}

/*检查新生成的食物的坐标是否和蛇身重合
*/
int isTogether(int x,int y)
{
    int index=0;
    for(index=0; index<size; index++)
    {
        if(snakes[index].x==x && snakes[index].y==y)
        {
            //重合
            return 1;
        }
    }
    //没有重合
    return 0;
}

/*
创建食物
*/
void createFood()
{
    //随机数字
    //随机种子
    int randX=0;
    int randY=0;
    srand(time(0));
    //食物坐标随机
    randY=rand()%24+1;
    do
    {
        //只是能偶数
        randX=rand()%54+2;
        //检查是否和蛇身重合
    }
    while(!(randX%2==0  && isTogether(randX,randY)==0)) ;

    food.x=randX;
    food.y=randY;
    setPosition(food.x,food.y);
    printf("■");
}

/*
显示蛇:节点 蛇头 5节点
*/
void initSnake()
{
    //蛇的节点起点位置
    int x=24;
    int y=5;
    int index=0;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
    //输出5个节点
    for(index=0; index<size; index++, x=x+2)
    {
        //设置节点的坐标
        snakes[index].x=x;
        snakes[index].y=y;
        setPosition(snakes[index].x,snakes[index].y);
        printf("■");
    }
}

/*
清除蛇身图形
*/
void clearSnake()
{
    int index=0;
    for(index=0; index<size; index++)
    {
        setPosition(snakes[index].x,snakes[index].y);
        printf("  ");
    }
}

/*
解析用户的按键,改变方向值
*/
void selDir()
{

    if(GetAsyncKeyState(VK_UP) && dir!='d' )
    {
        dir='u';
    }
    else if(GetAsyncKeyState(VK_DOWN) && dir!='u' )
    {
        dir='d';
    }
    else if(GetAsyncKeyState(VK_LEFT) && dir!='r')
    {
        dir='l';
    }
    else if(GetAsyncKeyState(VK_RIGHT) && dir!='l')
    {
        dir='r';
    }
}

/*
移动蛇
*/
void moveSnake()
{

    //蛇头的原来坐标
    int oldX=snakes[0].x;
    int oldY=snakes[0].y;
    //两个临时变量
    int tempX=0;
    int tempY=0;
    int index=0;
    //重置一个新坐标
    switch(dir)
    {
    case 'u':
        snakes[0].x=oldX;
        snakes[0].y=oldY-1;
        break;
    case 'd':
        snakes[0].x=oldX;
        snakes[0].y=oldY+1;
        break;
    case 'l':
        snakes[0].x=oldX-2;
        snakes[0].y=oldY;
        break;
    case 'r':
        snakes[0].x=oldX+2;
        snakes[0].y=oldY;
        break;
    }

    //检查蛇头是否和食物重合
    if(snakes[0].x==food.x && snakes[0].y==food.y)
    {
        size++;
        createFood();
        //计分
        count=count+20;
        setPosition(60,10);
        printf("当前计分%d",count);
        speed-=50;
        if(speed<100)
        {
            speed=100;
        }
    }
    //检查蛇头是否碰到墙
    if( snakes[0].x<=2 || snakes[0].x>54 || snakes[0].y<1 || snakes[0].y>25  )
    {
        //碰到墙
        system("cls");
        printf("gameover");
        system("pause");
        exit(0);
    }
    //自己吃自己
    for(index=1; index<size; index++)
    {
        if(snakes[0].x==snakes[index].x && snakes[0].y==snakes[index].y)
        {
//碰到墙
            system("cls");
            printf("gameover");
            system("pause");
            exit(0);
        }
    }

    setPosition(snakes[0].x,snakes[0].y);
    printf("■");
    //移动除了蛇头之外的节点
    for(index=1; index<size; index++)
    {
        //在移动节点之前保存节点的坐标
        tempX=snakes[index].x;
        tempY=snakes[index].y;
        //重新指定新坐标,前一个节点留下的空白
        snakes[index].x=oldX;
        snakes[index].y=oldY;
        //指定光标点
        setPosition(snakes[index].x,snakes[index].y);
        printf("■");
        //重置原坐标
        oldX=tempX;
        oldY=tempY;
    }
}

//主函数:语法结构(固定)运行时候,起点
int main()
{
    wellcome();
    //绘制围墙
    paintWall();
    initSnake();
    createFood();
    //清除蛇原来的图形
    while(1)
    {
        selDir();
        clearSnake();
        moveSnake();
        Sleep(speed);
    }
    return 0;
}

纯C语言实现贪吃蛇小游戏!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档