用C++面向对象的思想完成贪吃蛇
时间: 2024-03-13 19:46:38 浏览: 95
好的,我可以为您提供一个基本的贪吃蛇游戏的代码示例,代码如下所示:
```c++
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <deque>
using namespace std;
const int width = 25; // 游戏界面宽度
const int height = 25; // 游戏界面高度
// 枚举类型,表示方向
enum Direction { STOP = 0, LEFT, RIGHT, UP, DOWN };
class Snake {
private:
deque<pair<int, int>> body; // 蛇的身体,使用deque实现
Direction dir; // 蛇的运动方向
public:
Snake() {
// 初始化蛇的位置和方向
body.push_back(make_pair(height / 2, width / 2));
dir = STOP;
}
// 获取蛇头的坐标
pair<int, int> getHead() {
return body.front();
}
// 获取蛇的身体
deque<pair<int, int>> getBody() {
return body;
}
// 获取蛇的长度
int getLength() {
return body.size();
}
// 设置蛇的运动方向
void setDirection(Direction d) {
dir = d;
}
// 移动蛇
void move() {
// 根据方向移动蛇头
int x = body.front().first;
int y = body.front().second;
switch (dir) {
case LEFT:
y--;
break;
case RIGHT:
y++;
break;
case UP:
x--;
break;
case DOWN:
x++;
break;
default:
break;
}
// 将新的蛇头位置加入到队列头
body.push_front(make_pair(x, y));
// 删除队列尾,实现蛇的移动
body.pop_back();
}
// 增加蛇的长度
void grow() {
// 在队列尾增加一个元素
body.push_back(body.back());
}
};
class Game {
private:
int score; // 得分
int speed; // 游戏速度
bool gameOver; // 游戏是否结束
Snake snake; // 蛇
pair<int, int> food; // 食物的位置
public:
Game() {
score = 0;
speed = 100;
gameOver = false;
// 随机生成食物的位置
srand((unsigned)time(NULL));
food.first = rand() % height;
food.second = rand() % width;
}
// 显示游戏界面
void display() {
system("cls");
// 打印游戏界面
for (int i = 0; i < width + 2; i++)
cout << "#";
cout << endl;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (j == 0)
cout << "#";
// 判断当前位置是否为蛇头
if (i == snake.getHead().first && j == snake.getHead().second)
cout << "O";
// 判断当前位置是否为蛇身体
else if (find(snake.getBody().begin(), snake.getBody().end(), make_pair(i, j)) != snake.getBody().end())
cout << "o";
// 判断当前位置是否为食物
else if (i == food.first && j == food.second)
cout << "F";
else
cout << " ";
if (j == width - 1)
cout << "#";
}
cout << endl;
}
for (int i = 0; i < width + 2; i++)
cout << "#";
cout << endl;
// 打印得分和速度
cout << "Score: " << score << endl;
cout << "Speed: " << speed << endl;
}
// 处理键盘输入
void handleInput() {
if (_kbhit()) {
switch (_getch()) {
case 'a':
snake.setDirection(LEFT);
break;
case 'd':
snake.setDirection(RIGHT);
break;
case 'w':
snake.setDirection(UP);
break;
case 's':
snake.setDirection(DOWN);
break;
case 'x':
gameOver = true;
break;
default:
break;
}
}
}
// 更新游戏状态
void update() {
// 移动蛇
snake.move();
// 判断是否吃到食物
if (snake.getHead() == food) {
// 增加得分
score++;
// 增加蛇的长度
snake.grow();
// 重新生成食物的位置
food.first = rand() % height;
food.second = rand() % width;
}
// 判断是否撞到墙或自身
if (snake.getHead().first < 0 || snake.getHead().first >= height ||
snake.getHead().second < 0 || snake.getHead().second >= width ||
find(snake.getBody().begin() + 1, snake.getBody().end(), snake.getHead()) != snake.getBody().end()) {
gameOver = true;
}
// 根据得分调整游戏速度
if (score < 10)
speed = 100;
else if (score < 20)
speed = 80;
else if (score < 30)
speed = 60;
else if (score < 40)
speed = 40;
else
speed = 20;
// 暂停一段时间,实现游戏速度
Sleep(speed);
}
// 运行游戏
void run() {
while (!gameOver) {
display();
handleInput();
update();
}
cout << "Game Over!" << endl;
}
};
int main() {
Game game;
game.run();
return 0;
}
```
这个代码中使用了面向对象的思想,将蛇和游戏分别封装成了一个类。其中,Snake类表示蛇,包括蛇的身体、运动方向、移动、增加长度等操作;Game类表示游戏,包括得分、速度、游戏状态、显示游戏界面、处理键盘输入、更新游戏状态、运行游戏等操作。
在main函数中,创建了一个Game对象,然后调用run方法运行游戏。当游戏结束时,输出"Game Over!"。
阅读全文