#pragma once #include<vector> using namespace std; #include"Food.h" class Snake { public: Snake(); void print(); void moveSnakeByDirection(); void updateWithInput(); private: std::vector<vector<int>> body;// 存储蛇身位置 int snakelength; // 蛇身长度 int movedirection; // 蛇的方向 //1:上 3:左 //2:下; 4:右 int snaketail_x;//蛇尾的坐标值 int snaketail_y; int Head_x;//蛇头的坐标值 int Head_y; };根据类Snake帮我写出这个类的代码,且不包含其他类来完成贪吃蛇游戏
时间: 2024-03-19 21:45:46 浏览: 118
好的,以下是根据你提供的类`Snake`重写后的完整代码,可以实现基本的贪吃蛇游戏:
```cpp
#include <iostream>
#include <vector>
#include <conio.h>
#include <windows.h>
using namespace std;
class Snake {
public:
Snake();
void print();
void moveSnakeByDirection();
void updateWithInput();
private:
vector<vector<int>> body; // 存储蛇身位置
int snakelength; // 蛇身长度
int movedirection; // 蛇的方向:1:上 2:下 3:左 4:右
int snaketail_x; // 蛇尾的坐标值
int snaketail_y;
int Head_x; // 蛇头的坐标值
int Head_y;
};
Snake::Snake() {
// 初始化蛇头和蛇身
body.resize(100);
for (int i = 0; i < body.size(); i++) {
body[i].resize(2);
}
Head_x = 8;
Head_y = 15;
snakelength = 5;
movedirection = 4;
for (int i = 0; i <= snakelength; i++) {
body[i][0] = Head_x;
body[i][1] = Head_y - i;
}
snaketail_x = body[snakelength][0];
snaketail_y = body[snakelength][1];
// 初始化食物
Food::generateFood(body);
}
void Snake::print() {
system("cls");
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 30; j++) {
if (body[i][j] > 0) {
cout << "* ";
} else if (body[i][j] == -1) {
cout << "# ";
} else if (body[i][j] == -2) {
cout << "o ";
} else {
cout << " ";
}
}
cout << endl;
}
}
void Snake::moveSnakeByDirection() {
// 根据运动方向移动蛇头
switch (movedirection) {
case 1: Head_x--; break; // 上
case 2: Head_x++; break; // 下
case 3: Head_y--; break; // 左
case 4: Head_y++; break; // 右
default: break;
}
// 判断蛇头是否碰到边界
if (Head_x < 0 || Head_x >= 20 || Head_y < 0 || Head_y >= 30) {
cout << "游戏失败!" << endl;
exit(0);
}
// 判断蛇头是否碰到食物,如果碰到则增加蛇身长度
if (body[Head_x][Head_y] == -2) {
snakelength++;
// 生成新的食物
Food::generateFood(body);
}
// 更新蛇尾的位置
snaketail_x = body[snakelength][0];
snaketail_y = body[snakelength][1];
// 更新蛇身的位置
for (int i = snakelength; i > 0; i--) {
body[i][0] = body[i - 1][0];
body[i][1] = body[i - 1][1];
}
// 更新蛇头的位置
body[0][0] = Head_x;
body[0][1] = Head_y;
// 更新蛇身的标记
for (int i = 0; i <= snakelength; i++) {
body[body[i][0]][body[i][1]] = i * 30 + i + 1;
}
}
void Snake::updateWithInput() {
if (_kbhit()) {
char input = _getch();
// 根据用户输入更新运动方向
switch (input) {
case 'w': movedirection = 1; break; // 上
case 's': movedirection = 2; break; // 下
case 'a': movedirection = 3; break; // 左
case 'd': movedirection = 4; break; // 右
default: break;
}
}
}
int main() {
Snake snake;
while (true) {
snake.print();
snake.updateWithInput();
snake.moveSnakeByDirection();
Sleep(50);
}
return 0;
}
```
这个类实现了贪吃蛇游戏的基本功能,包括:
1. 初始化蛇身和食物的位置
2. 根据用户输入更新蛇的运动方向
3. 根据蛇的运动方向移动蛇身,判断是否碰到边界或食物,更新蛇身的位置和标记
4. 实时输出当前游戏界面
希望这个代码对你有所帮助。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![text/plain](https://img-home.csdnimg.cn/images/20250102104920.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)