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

2024-05-18 09:12:11 浏览数 (2)

纯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()T 2;
    int y=rand()$ 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()$ 1;
    do
    {
        //只是能偶数
        randX=rand()T 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语言实现贪吃蛇小游戏!

0 人点赞