c++实现贪吃蛇

#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <mmstream.h>

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

#include "Easyx/include/graphics.h"

using namespace std;


/*
 * 知识点:结构体、循环、函数、easyx、数组
 * */
#define SNAKE_NUM 500
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480

//设置方向
enum DIR {
    UP,
    DOWN,
    LEFT,
    RIGHT
};

//蛇的结构
struct Snake {
    int size;   //蛇的节数
    int dir;    //蛇的方向
    int speed;  //蛇的速度
    int radius = 5; //蛇的半径
    POINT coor[SNAKE_NUM]; //坐标
} snake;

//食物结构
struct Food {
    int x;
    int y;
    int r;  //食物大小
    bool flag; //食物是否被吃了
    DWORD color; //食物颜色

} food;

//数据初始化
void GameInit() {

    //播放背景音乐
    mciSendString("open ../res/7895.mp3 alias BGM", 0, 0, 0);
    mciSendString("play BGM repeat", 0, 0, 0);


    //init 初始化 graph 图形窗口
    initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
    //设置随机数种子  GetTickCount()获取系统开机,到现在所经过的毫秒数
    srand(GetTickCount());


    //设置初始的蛇
    snake.size = 3;
    snake.dir = RIGHT;
    snake.speed = 10;
    for (int i = 0; i < snake.size; i++) {
        snake.coor[i].x = snake.size * 10 - i * 10;
        snake.coor[i].y = snake.radius;
    }

    //初始化食物 rand()随机产生
    food.r = rand() % 10 + 5;
    food.x = rand() % (WINDOW_WIDTH - food.r);
    food.y = rand() % (WINDOW_HEIGHT - food.r);
    food.flag = true;


}

//窗口初始化
void GameDraw() {

    BeginBatchDraw();

    //设置背景颜色
    /*setbkcolor(RGB(28,115,119));
    */
    cleardevice();
    //绘制蛇
    setfillcolor(GREEN);
    for (int i = 0; i < snake.size; i++) {
        solidcircle(snake.coor[i].x, snake.coor[i].y, snake.radius);
    }

    if (food.flag) {
        setfillcolor(RED);
        solidcircle(food.x, food.y, food.r);
    }

    EndBatchDraw();
}

//通过键盘改变蛇的方向
void keyControl() {
    //判断有没有按键 ,如果有按键返回true
    if (_kbhit()) {
        //72 80 75 77   上下左右的键值
        switch (_getch()) {
            case 'w':
            case 'W':
            case 72:
                //不允许蛇头向反方向移动
                if (snake.dir != DOWN) {
                    snake.dir = UP;
                }
                break;
            case 's':
            case 'S':
            case 80:
                if (snake.dir != UP) {
                    snake.dir = DOWN;
                }

                break;
            case 'a':
            case 'A':
            case 75:
                if (snake.dir != RIGHT) {
                    snake.dir = LEFT;
                }
                break;
            case 'd':
            case 'D':
            case 77:
                if (snake.dir != LEFT) {
                    snake.dir = RIGHT;
                }
                break;
            case ' ':
                while (true) {
                    if (_getch() == ' ') {
                        return;
                    }
                }
                break;
        }
    }
}

//移动蛇
void moveSnake() {

    keyControl();

    //移动身体
    for (int i = snake.size - 1; i > 0; i--) {
        snake.coor[i] = snake.coor[i - 1];
    }
    //移动蛇头
    switch (snake.dir) {
        case UP:
            snake.coor[0].y -= snake.speed;
            //如果超出边界,使其从另一端出来
            if (snake.coor[0].y <= snake.radius) {
                snake.coor[0].y = WINDOW_HEIGHT;
            }
            break;
        case DOWN:
            snake.coor[0].y += snake.speed;
            //如果超出边界,使其从另一端出来
            if (snake.coor[0].y >= WINDOW_HEIGHT - snake.radius) {
                snake.coor[0].y = snake.radius;
            }
            break;
        case RIGHT:
            snake.coor[0].x += snake.speed;
            //如果超出边界,使其从另一端出来
            if (snake.coor[0].x >= WINDOW_WIDTH - snake.radius) {
                snake.coor[0].x = snake.radius;
            }
            break;
        case LEFT:
            snake.coor[0].x -= snake.speed;
            //如果超出边界,使其从另一端出来
            if (snake.coor[0].x <= snake.radius) {
                snake.coor[0].x = WINDOW_WIDTH - snake.radius;
            }
            break;

    }
}

//吃食物
void eatFood() {
    if (food.flag && snake.coor[0].x >= food.x - food.r && snake.coor[0].x <= food.x + food.r
        && snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r) {
        food.flag = false;
        snake.size++;
    }

    //如果食物消失,重新生成一个食物
    if (!food.flag) {
        food.r = rand() % 10 + 5;
        food.x = rand() % (WINDOW_WIDTH - 2 * food.r) + food.r;
        food.y = rand() % (WINDOW_HEIGHT - 2 * food.r);
        food.flag = true;

    }
}

int main() {

    GameInit();


    while (1) {
        GameDraw();
        moveSnake();
        eatFood();
        Sleep(50);
    }
    return 0;
}
  • 音频文件放在该cpp同一目录下的res文件夹下
  • 需要安装easyx库点击教程
  • 效果图:在这里插入图片描述
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值