通过easyx的方法,写一个贪吃蛇小游戏
时间: 2024-01-07 17:05:23 浏览: 78
基于easyx的贪吃蛇代码
好的,下面是一个简单的贪吃蛇小游戏,使用了easyx图形库。
```C++
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
const int WIDTH = 800; // 窗口宽度
const int HEIGHT = 600; // 窗口高度
const int ROWS = 30; // 行数
const int COLS = 40; // 列数
const int CELL_WIDTH = WIDTH / COLS; // 格子宽度
const int CELL_HEIGHT = HEIGHT / ROWS; // 格子高度
const int MAX_LEN = 100; // 蛇的最大长度
const int FOOD_SCORE = 10; // 吃到食物的分数
// 蛇的结构体
struct Snake {
int x[MAX_LEN]; // 蛇的每一节的x坐标
int y[MAX_LEN]; // 蛇的每一节的y坐标
int len; // 蛇的长度
};
// 食物的结构体
struct Food {
int x; // 食物的x坐标
int y; // 食物的y坐标
};
// 初始化蛇
void initSnake(Snake& snake) {
int x = COLS / 2;
int y = ROWS / 2;
snake.len = 3;
snake.x[0] = x;
snake.y[0] = y;
snake.x[1] = x - 1;
snake.y[1] = y;
snake.x[2] = x - 2;
snake.y[2] = y;
}
// 初始化食物
void initFood(Food& food) {
srand(time(NULL));
food.x = rand() % COLS;
food.y = rand() % ROWS;
}
// 绘制格子
void drawCell(int x, int y, COLORREF color) {
setfillcolor(color);
setlinecolor(WHITE);
rectangle(x * CELL_WIDTH, y * CELL_HEIGHT, (x + 1) * CELL_WIDTH, (y + 1) * CELL_HEIGHT);
floodfill(x * CELL_WIDTH + 1, y * CELL_HEIGHT + 1, WHITE);
}
// 绘制蛇
void drawSnake(Snake& snake) {
for (int i = 0; i < snake.len; i++) {
drawCell(snake.x[i], snake.y[i], GREEN);
}
}
// 绘制食物
void drawFood(Food& food) {
drawCell(food.x, food.y, RED);
}
// 移动蛇
void moveSnake(Snake& snake, int dx, int dy) {
// 将蛇身体往前移动一格
for (int i = snake.len - 1; i >= 1; i--) {
snake.x[i] = snake.x[i - 1];
snake.y[i] = snake.y[i - 1];
}
// 将蛇头移动一格
snake.x[0] += dx;
snake.y[0] += dy;
}
// 判断蛇是否吃到了食物
bool isEatFood(Snake& snake, Food& food) {
if (snake.x[0] == food.x && snake.y[0] == food.y) {
return true;
}
return false;
}
// 更新食物位置
void updateFood(Food& food) {
srand(time(NULL));
food.x = rand() % COLS;
food.y = rand() % ROWS;
}
// 判断蛇是否撞到了墙
bool isHitWall(Snake& snake) {
if (snake.x[0] < 0 || snake.x[0] >= COLS || snake.y[0] < 0 || snake.y[0] >= ROWS) {
return true;
}
return false;
}
// 判断蛇是否撞到了自己
bool isHitSelf(Snake& snake) {
for (int i = 1; i < snake.len; i++) {
if (snake.x[0] == snake.x[i] && snake.y[0] == snake.y[i]) {
return true;
}
}
return false;
}
// 更新蛇的长度
void updateSnakeLen(Snake& snake) {
snake.len++;
}
// 游戏结束
void gameOver() {
settextcolor(RED);
settextstyle(50, 0, "黑体");
outtextxy(WIDTH / 2 - 150, HEIGHT / 2 - 25, "GAME OVER");
}
int main() {
initgraph(WIDTH, HEIGHT);
Snake snake;
initSnake(snake);
Food food;
initFood(food);
int dx = 1, dy = 0; // 蛇的移动方向
while (true) {
drawCell(food.x, food.y, RED); // 绘制食物
drawSnake(snake); // 绘制蛇
if (kbhit()) { // 检测键盘输入
int key = getch();
if (key == 'w' && dy == 0) {
dx = 0;
dy = -1;
} else if (key == 's' && dy == 0) {
dx = 0;
dy = 1;
} else if (key == 'a' && dx == 0) {
dx = -1;
dy = 0;
} else if (key == 'd' && dx == 0) {
dx = 1;
dy = 0;
}
}
moveSnake(snake, dx, dy); // 移动蛇
if (isEatFood(snake, food)) { // 判断蛇是否吃到了食物
updateFood(food); // 更新食物位置
updateSnakeLen(snake); // 更新蛇的长度
}
if (isHitWall(snake) || isHitSelf(snake)) { // 判断游戏是否结束
gameOver();
break;
}
Sleep(100); // 延时
cleardevice(); // 清屏
}
getch();
closegraph();
return 0;
}
```
在Visual Studio中,需要在项目属性中的`C/C++ -> 预处理器 -> 预处理器定义`中加入`_CRT_SECURE_NO_WARNINGS`,否则会报`fopen`函数不安全的错误。
阅读全文