贪吃蛇

#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);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淮城一只猫

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值