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

公众号:编程驿站

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

  • 13
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚大果壳

码文不易,晚上熬夜需要点咖啡钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值