std::vector<vector<int>> body; // 存储蛇身位置for (int i = 0; i < 20; i++) { for (int j = 0; j < 30; j++) { body[i][j] = 0; } }
时间: 2024-03-18 14:40:17 浏览: 49
上述代码存在问题,如果直接使用`body[i][j] = 0`对二维vector中的元素进行赋值,会导致程序崩溃。
这是因为在这里,`body`是一个空的vector,它没有任何元素,因此对`body[i][j]`进行访问会导致访问越界的错误。
为了解决这个问题,可以在初始化`body`时指定它的大小,例如:
```
std::vector<vector<int>> body(20, vector<int>(30, 0)); // 初始化二维vector
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 30; j++) {
body[i][j] = 0; // 对元素进行赋值
}
}
```
这里使用了vector的嵌套构造函数来初始化二维vector,创建了一个20行30列的二维数组,每个元素的初值为0。然后,使用双重循环来对二维vector进行遍历,使用下标来对其元素进行赋值。
相关问题
std::vector<std::vector<int>> body; // 存储蛇身位置中std::是是啥意思
`std` 是 C++ 标准库的命名空间,表示标准库中的命名空间。在 C++ 中,类、函数、变量等都需要放在命名空间中,以避免命名冲突。在这个例子中,`std` 表示这个 vector 是 C++ 标准库中的 vector,可以存储类型为 `std::vector<int>` 的元素,即一个包含整数的 vector。因此,`std::vector<std::vector<int>>` 表示一个二维 vector,每个元素是一个包含整数的一维 vector。
#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();来完成贪吃蛇游戏
好的,根据你提供的类`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. 更新蛇身的标记,用一个整数来表示每个蛇身位置的状态,便于后续的碰撞检测
希望这能对你有所帮助。
阅读全文