#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <mmstream.h>
#pragma comment(lib, "Winmm.lib")
#include "Easyx/include/graphics.h"
using namespace std;
#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);
initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
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;
}
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();
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() {
if (_kbhit()) {
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库点击教程
- 效果图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a3cfa0ee5e16445a975a10d3ff363d33.png)