贪吃蛇小游戏C语言实现

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

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

//坐标
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 SnakeMove();
void SnakePaint();
void ChangeSnakeCh();
void FoodCoor();
void FoodPaint();        //绘制食物
void EatFood();
void GameBreak();
void OverGame();

//主函数
int main()
{
    GameInit();  //初始化的函数.

    //按键控制 不按键->移动循环 按键-->退出移动循环-->改变方向-->回到移动循环
    while (1)
    {
        while (!kbhit())  //kbhit(检测键盘是否有消息) getch conio.h
        {
            if (food.flag == 0)
                FoodCoor();
            Sleep(200);
            cleardevice();
            FoodPaint();
            SnakePaint();
            SnakeMove();
            EatFood();
            GameBreak();
        }
        ChangeSnakeCh();
    }

    return 0;
}

//游戏初始化
void GameInit()
{
    //打开一个窗口
    initgraph(640, 480);
    srand((unsigned int)time(NULL));


    //设置背景颜色 颜色的三基色 红R 绿G 蓝B
    setbkcolor(RGB(220, 120, 150));  //set bk color
    cleardevice(); //使用设置好的背景颜色刷新屏幕  system("cls")

    //初始化一条小蛇
    rectangle(0, 0, 10, 10);

    //蛇的结构初始化
    snake.scr[0].x = 0;        //蛇头的x,y初始化为0
    snake.scr[0].y = 0;
    snake.n = 1;            //当前有一节蛇
    snake.ch = down;        //方向往下

    food.flag = 0; //食物初始化被吃掉的
}

//绘制蛇
void SnakePaint()
{
    //n节蛇  最大的下标是多少? n-1 100
    for (int i = snake.n - 1; i >= 0; i--)
    {
        rectangle(snake.scr[i].x, snake.scr[i].y, snake.scr[i].x + 10, snake.scr[i].y + 10);
    }
}

//right  往右走  n节蛇  C C++ win32
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)
// snake.scr[0].ch
void ChangeSnakeCh()
{
    //键值  wasd  上下左右(键值!=ASCII)
    //上 72  下80  左75  右77
    int move;

    move = getch();  //头文件  conio.h

    switch (move)
    {
    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()//绘制食物
{
    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();
    outtextxy(300, 200, L"game over");
    getch();
    closegraph();
}

发布了15 篇原创文章 · 获赞 2 · 访问量 1949

猜你喜欢

转载自blog.csdn.net/conimade/article/details/79484693