首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言小游戏贪吃蛇

C语言小游戏贪吃蛇

作者头像
对弈
发布2019-09-04 15:50:21
5.6K1
发布2019-09-04 15:50:21
举报
#include <stdio.h>

#include <graphics.h> //图形界面头文件

#include <time.h>

#include <conio.h>

#include <mmsystem.h>

#pragma comment(lib,"winmm.lib")



#define N 1000 //蛇的最大节数



struct Coor //坐标

{

    int x;

    int y;

};



enum Ch{ up = 72, down = 80, left = 75, right = 77 }; //上下左右四个方向



//一条蛇 N节 数组

struct Snake

{

    int n;           //当前蛇的节数

    struct Coor scr[N]; //100节蛇的坐标数组

    enum Ch ch;         //蛇的方向

}snake;



struct Food

{

    struct Coor fsr; //食物坐标

    int flag; //标志,食物有没有被吃掉,1代表没有

}food;



void GameInit(); //初始化游戏

void SnakePaint(); //绘制蛇

void SnakeMove(); //蛇移动

void ChangeSnakeCh(); //改变蛇的方向

void FoodCoor(); //食物坐标

void FoodPaint();       //绘制食物

void EatFood(); //吃食物

void GameBreak(); //判断游戏退出

void OverGame(); //游戏结束标志



//主函数

int main()

{

    GameInit(); //初始化的函数.

    while (1)

    {

        while (!kbhit()) //kbhit(检测键盘是否有消息)

        {

            if (food.flag == 0)//没有食物

                FoodCoor(); //生成一个食物坐标

            cleardevice(); //刷新

            FoodPaint(); //绘制食物

            SnakePaint(); //绘制蛇

            SnakeMove(); //蛇移动

            Sleep(100); //蛇的移动速度

            EatFood(); //吃食物

            GameBreak(); //判断游戏是否结束

        }

        ChangeSnakeCh();

    }



    return 0;

}




//游戏初始化

void GameInit()

{

    //打开一个窗口

    initgraph(640, 480);

    srand((unsigned int)time(NULL));

    

    setbkcolor(RGB(50, 70, 80));

    cleardevice(); //使用设置好的背景颜色刷新屏幕

    



    //蛇初始化

    snake.scr[0].x = 0;     //蛇头的x,y初始化为0

    snake.scr[0].y = 0;

    snake.n = 3;            //当前有一节蛇

    snake.ch = down;        //方向往下

    

    

    //初始化一条小蛇

    //roundrect(0, 0, 10, 10, 10, 10);



    food.flag = 0; //初始化没有食物

    

}




//绘制蛇

void SnakePaint()

{

    //n节蛇 最大的下标是多少? n-1 100

    for (int i = snake.n - 1; i >= 0; i--)

    {

        setlinecolor(RGB(rand() % 100 + 156, rand() % 100 + 156, rand() % 100 + 156));

        rectangle(snake.scr[i].x, snake.scr[i].y, snake.scr[i].x + 10, snake.scr[i].y + 10);

    }

}




//蛇移动

void SnakeMove()

{

    for (int i = snake.n - 1; i > 0; i--)

    {

        snake.scr[i].x = snake.scr[i - 1].x;

        snake.scr[i].y = snake.scr[i - 1].y;

    }



    switch (snake.ch)

    {

    case up:

        snake.scr[0].y -= 10;

        break;

    case down:

        snake.scr[0].y += 10;

        break;

    case left:

        snake.scr[0].x -= 10;

        break;

    case right:

        snake.scr[0].x += 10;

        break;

    }

}



//人来控制 检测到按键getchar getch

//通过不同的按键(分支结构 switch if)

// 改变蛇的方向

void ChangeSnakeCh()

{

    switch (getch())

    {

    case 72: //up

        if (snake.ch != down)

            snake.ch = up;

        break;

    case 80: //down

        if (snake.ch != up)

            snake.ch = down;

        break;

    case 75:

        if (snake.ch != right)

            snake.ch = left;

        break;

    case 77:

        if (snake.ch != left)

            snake.ch = right;

        break;

    }

}



void FoodCoor() //食物坐标

{

    food.fsr.x = rand() % 64 * 10; //0 10 20 30 40 50 ... 630 0-63 *10

    food.fsr.y = rand() % 48 * 10; //0 10 20 30... 470 0-47 *10



    food.flag = 1; //食物没有被吃

}



void FoodPaint()//绘制食物

{

    setfillcolor(LIGHTRED);

    solidroundrect(food.fsr.x, food.fsr.y, food.fsr.x + 10, food.fsr.y + 10, 10, 10);

}



void EatFood()//吃食物

{

    if (snake.scr[0].x == food.fsr.x&&snake.scr[0].y == food.fsr.y)

    {

        snake.n++;

        food.flag = 0;

    }

}



//判断游戏退出

void GameBreak()

{

    //撞墙

    if (snake.scr[0].y < -1 || snake.scr[0].y>471 || snake.scr[0].x < -1 || snake.scr[0].x>631)

    {

        //退出

        OverGame();

    }



    for (int i = snake.n - 1; i > 0; i--)

    {

        if (snake.scr[0].x == snake.scr[i].x&&snake.scr[0].y == snake.scr[i].y)

        {

            //退出

            OverGame();

        }

    }

}



void OverGame()

{

    cleardevice();

    settextcolor(GREEN);

    settextstyle(50, 0, L"黑体");

    outtextxy(200, 200, L"game over");

    Sleep(30000);

    exit(0);

}

声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/c%e5%ae%9e%e7%8e%b0%e9%9b%b7%e9%9c%86%e6%88%98%e6%9c%ba-52/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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