#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帮我写出void moveSnakeByDirection();来完成贪吃蛇游戏
时间: 2024-03-19 10:45:42 浏览: 51
C语言头文件避免重复包含、#pragma once和#ifndef区别
好的,根据你提供的类`Snake`,我来帮你实现`moveSnakeByDirection()`函数,该函数可以根据蛇当前的运动方向移动蛇身,并更新蛇身位置:
```
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[snaketail_x][snaketail_y] / 30;
snaketail_y = body[snaketail_x][snaketail_y] % 30;
// 更新蛇身的位置
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;
}
}
```
该函数的主要流程如下:
1. 根据当前运动方向移动蛇头的位置
2. 判断蛇头是否撞到边界,如果是,游戏结束
3. 判断蛇头是否碰到食物,如果是,增加蛇身长度并生成新的食物
4. 更新蛇身的位置,将蛇头的位置更新到蛇身的第一个位置,将蛇尾的位置更新到原来的蛇身的最后一个位置
5. 更新蛇身的标记,用一个整数来表示每个蛇身位置的状态,便于后续的碰撞检测
希望这能对你有所帮助。
阅读全文