请用C++写一个贪吃蛇游戏
时间: 2023-12-27 22:16:15 浏览: 77
c++编写贪吃蛇游戏
好的,以下是一个简单的贪吃蛇游戏的 C++ 代码示例,供参考:
```c++
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <deque>
#include <ctime>
using namespace std;
const int MAP_WIDTH = 40; // 地图宽度
const int MAP_HEIGHT = 20; // 地图高度
// 定义方向常量
const int DIR_LEFT = 0;
const int DIR_UP = 1;
const int DIR_RIGHT = 2;
const int DIR_DOWN = 3;
// 定义游戏角色常量
const char CHAR_WALL = '#'; // 墙
const char CHAR_SNAKE = '*'; // 蛇
const char CHAR_FOOD = '$'; // 食物
// 定义游戏角色结构体
struct Point {
int x;
int y;
Point(int x, int y) : x(x), y(y) {}
bool operator==(const Point& p) const {
return x == p.x && y == p.y;
}
};
// 定义全局变量
deque<Point> snake; // 蛇
Point food(0, 0); // 食物位置
int dir = DIR_RIGHT; // 蛇的方向
bool isDead = false; // 是否死亡
int score = 0; // 得分
// 初始化游戏
void InitGame() {
// 初始化蛇的位置
snake.push_back(Point(3, 1));
snake.push_back(Point(2, 1));
snake.push_back(Point(1, 1));
// 初始化食物的位置
srand((unsigned)time(NULL));
food.x = rand() % MAP_WIDTH;
food.y = rand() % MAP_HEIGHT;
while (food == snake.front()) {
food.x = rand() % MAP_WIDTH;
food.y = rand() % MAP_HEIGHT;
}
}
// 绘制地图
void DrawMap() {
system("cls"); // 清屏
// 绘制上边界
for (int i = 0; i < MAP_WIDTH + 2; i++) {
cout << CHAR_WALL;
}
cout << endl;
// 绘制左右边界和游戏角色
for (int i = 0; i < MAP_HEIGHT; i++) {
cout << CHAR_WALL;
for (int j = 0; j < MAP_WIDTH; j++) {
if (Point(j, i) == food) {
cout << CHAR_FOOD;
}
else if (find(snake.begin(), snake.end(), Point(j, i)) != snake.end()) {
cout << CHAR_SNAKE;
}
else {
cout << " ";
}
}
cout << CHAR_WALL << endl;
}
// 绘制下边界
for (int i = 0; i < MAP_WIDTH + 2; i++) {
cout << CHAR_WALL;
}
cout << endl;
// 显示得分
cout << "Score: " << score << endl;
}
// 处理用户输入
void HandleInput() {
if (_kbhit()) { // 如果有按键按下
switch (_getch()) {
case 'a':
dir = DIR_LEFT;
break;
case 'w':
dir = DIR_UP;
break;
case 'd':
dir = DIR_RIGHT;
break;
case 's':
dir = DIR_DOWN;
break;
}
}
}
// 更新游戏状态
void UpdateGame() {
// 移动蛇
Point newHead(0, 0);
switch (dir) {
case DIR_LEFT:
newHead.x = snake.front().x - 1;
newHead.y = snake.front().y;
break;
case DIR_UP:
newHead.x = snake.front().x;
newHead.y = snake.front().y - 1;
break;
case DIR_RIGHT:
newHead.x = snake.front().x + 1;
newHead.y = snake.front().y;
break;
case DIR_DOWN:
newHead.x = snake.front().x;
newHead.y = snake.front().y + 1;
break;
}
if (newHead == food) { // 如果吃到了食物
score++;
snake.push_front(newHead);
food.x = rand() % MAP_WIDTH;
food.y = rand() % MAP_HEIGHT;
while (food == snake.front()) {
food.x = rand() % MAP_WIDTH;
food.y = rand() % MAP_HEIGHT;
}
}
else {
// 判断是否撞到墙或自己的身体
if (newHead.x < 0 || newHead.x >= MAP_WIDTH || newHead.y < 0 || newHead.y >= MAP_HEIGHT ||
find(snake.begin() + 1, snake.end(), newHead) != snake.end()) {
isDead = true;
}
else {
snake.push_front(newHead);
snake.pop_back();
}
}
}
// 主函数
int main() {
InitGame(); // 初始化游戏
while (!isDead) {
DrawMap(); // 绘制地图
HandleInput(); // 处理用户输入
UpdateGame(); // 更新游戏状态
Sleep(100); // 等待100毫秒
}
DrawMap(); // 绘制地图
cout << "Game Over! Your score is " << score << endl;
return 0;
}
```
这个示例代码使用了 Windows.h 库中的 Sleep 函数来等待一段时间,如果在 Linux 中编译需要使用 Linux 中的等效函数,例如使用 unistd.h 库中的 usleep 函数。
阅读全文