c++使用easyx做贪吃蛇
时间: 2023-09-24 17:03:24 浏览: 125
c++程序设计课程大作业:EasyX实现贪吃蛇小游戏
好的,下面是一个简单的贪吃蛇实现,使用了EasyX图形库:
```c++
#include <graphics.h>
#include <conio.h>
#include <time.h>
const int MAP_SIZE = 20; // 地图大小
const int BLOCK_SIZE = 30; // 方块大小
const int SPEED = 200; // 蛇移动速度(ms)
struct Point {
int x, y;
Point(int x = 0, int y = 0):x(x), y(y) {}
};
class Snake {
public:
Snake(int size = 3); // 构造函数,size为蛇的初始长度
~Snake(); // 析构函数
void move(); // 移动蛇
bool isDead(); // 判断蛇是否死亡
void draw(); // 绘制蛇
void changeDir(int dir); // 改变蛇的方向
Point getHead(); // 获取蛇头位置
private:
Point *body; // 蛇的身体,用数组保存每个方块的位置
int length; // 蛇的长度
int dir; // 蛇的方向,0表示上,1表示右,2表示下,3表示左
};
class Food {
public:
Food(); // 构造函数
void generate(); // 生成新的食物
void draw(); // 绘制食物
Point getPos(); // 获取食物位置
private:
Point pos; // 食物位置
};
Snake::Snake(int size) {
body = new Point[size];
length = size;
dir = 2;
for (int i = 0; i < length; i++) {
body[i].x = MAP_SIZE / 2;
body[i].y = MAP_SIZE / 2 + i;
}
}
Snake::~Snake() {
delete[] body;
}
void Snake::move() {
Point head = getHead();
Point newHead(head.x, head.y);
switch (dir) {
case 0: newHead.y--; break;
case 1: newHead.x++; break;
case 2: newHead.y++; break;
case 3: newHead.x--; break;
}
for (int i = length - 1; i > 0; i--) {
body[i] = body[i - 1];
}
body[0] = newHead;
}
bool Snake::isDead() {
Point head = getHead();
if (head.x < 0 || head.x >= MAP_SIZE || head.y < 0 || head.y >= MAP_SIZE) {
return true; // 撞到墙了
}
for (int i = 1; i < length; i++) {
if (head.x == body[i].x && head.y == body[i].y) {
return true; // 撞到自己了
}
}
return false;
}
void Snake::draw() {
setfillcolor(RGB(0, 255, 0));
for (int i = 0; i < length; i++) {
fillrectangle(body[i].x * BLOCK_SIZE, body[i].y * BLOCK_SIZE,
(body[i].x + 1) * BLOCK_SIZE, (body[i].y + 1) * BLOCK_SIZE);
}
}
void Snake::changeDir(int d) {
if (abs(d - dir) == 2) {
return; // 禁止掉头
}
dir = d;
}
Point Snake::getHead() {
return body[0];
}
Food::Food() {
generate();
}
void Food::generate() {
srand(time(NULL));
pos.x = rand() % MAP_SIZE;
pos.y = rand() % MAP_SIZE;
}
void Food::draw() {
setfillcolor(RGB(255, 0, 0));
fillrectangle(pos.x * BLOCK_SIZE, pos.y * BLOCK_SIZE,
(pos.x + 1) * BLOCK_SIZE, (pos.y + 1) * BLOCK_SIZE);
}
Point Food::getPos() {
return pos;
}
int main() {
initgraph(MAP_SIZE * BLOCK_SIZE, MAP_SIZE * BLOCK_SIZE);
setbkcolor(RGB(255, 255, 255));
cleardevice();
Snake snake;
Food food;
while (!snake.isDead()) {
snake.draw();
food.draw();
Sleep(SPEED);
snake.move();
if (snake.getHead().x == food.getPos().x && snake.getHead().y == food.getPos().y) {
snake.length++;
food.generate();
}
if (_kbhit()) {
int ch = _getch();
switch (ch) {
case 'w': snake.changeDir(0); break;
case 'd': snake.changeDir(1); break;
case 's': snake.changeDir(2); break;
case 'a': snake.changeDir(3); break;
}
}
cleardevice();
}
outtextxy(MAP_SIZE / 2 * BLOCK_SIZE - 50, MAP_SIZE / 2 * BLOCK_SIZE - 12, "Game Over");
_getch();
closegraph();
return 0;
}
```
该贪吃蛇实现使用了EasyX图形库进行绘制,具体实现可以参考代码中的注释。
阅读全文