void Snake::moveSnakeByDirection() { for (int i = 0; i < 20; i++)//蛇身数值+1 { for (int j = 0; j < 30; j++) { if (body[i][j] > 0) body[i][j]++; } } for (int i = 0; i < 20; i++)//找老蛇头 { for (int j = 0; j < 30; j++) { if (body[i][j] == 2) { Head_x = i; Head_y = j; break; } } } int Max; Max = body[0][0];//查找最大值 for (int i = 0; i < 20; i++)//去蛇尾 { for (int j = 0; j < 30; j++) { if (body[i][j] > Max) { Max = body[i][j]; snaketail_x = i; snaketail_y = j; } } if (movedirection == 1) { Head_x -= 1; if (body[Head_x][Head_y] == -2) { int food_x; int food_y; food_x = rand() % 20; food_y = rand() % 30; body[food_x][food_y] = -2; } else { body[snaketail_x][snaketail_y] = 0; } if (body[Head_x][Head_y] == -1) { if (Head_x == 0) { Head_x = 18; } else if (Head_x == 19) { Head_x = 1; } } if (body[Head_x][Head_y] > 0) { cout << "游戏失败!\n"; Sleep(2000); exit(0); } else body[Head_x][Head_y] = 1; } } if (movedirection == 2) { Head_x += 1; if (body[Head_x][Head_y] == -2) { int food_x; int food_y; food_x = rand() % 20; food_y = rand() % 30; body[food_x][food_y] = -2; } else { body[snaketail_x][snaketail_y] = 0; } if (body[Head_x][Head_y] == -1) { if (Head_x == 0) { Head_x = 18; } else if (Head_x == 19) { Head_x = 1; } } if (body[Head_x][Head_y] > 0) { cout << "游戏失败!\n"; Sleep(2000); exit(0); } else body[Head_x][Head_y] = 1; } if (movedirection == 3) { Head_y -= 1; if (body[Head_x][Head_y] == -2) { int food_x; int food_y; food_x = rand() % 20; food_y = rand() % 30; body[food_x][food_y] = -2; } else { body[snaketail_x][snaketail_y] = 0; } if (body[Head_x][Head_y] == -1) { if (Head_y == 0) { Head_y = 28; } else if (Head_y == 29) { Head_y = 1; } } if (body[Head_x][Head_y] > 0) { cout << "游
时间: 2024-04-05 12:31:21 浏览: 16
戏失败!\n"; Sleep(2000); exit(0); } else body[Head_x][Head_y] = 1; } if (movedirection == 4) { Head_y += 1; if (body[Head_x][Head_y] == -2) { int food_x; int food_y; food_x = rand() % 20; food_y = rand() % 30; body[food_x][food_y] = -2; } else { body[snaketail_x][snaketail_y] = 0; } if (body[Head_x][Head_y] == -1) { if (Head_y == 0) { Head_y = 28; } else if (Head_y == 29) { Head_y = 1; } } if (body[Head_x][Head_y] > 0) { cout << "游戏失败!\n"; Sleep(2000); exit(0); } else body[Head_x][Head_y] = 1; } }
这是一个贪吃蛇游戏的代码,这段代码实现了蛇的移动和游戏规则的判断。你有没有看懂这段代码呢?
相关问题
void Snake::moveSnakeByDirection() { for (int i = 0; i < 20; i++)//蛇身数值+1 { for (int j = 0; j < 30; j++) { if (body[i][j] > 0) body[i][j]++; } } for (int i = 0; i < 20; i++)//找老蛇头 { for (int j = 0; j < 30; j++) { if (body[i][j] == 2) { Head_x = i; Head_y = j; break; } } } int Max; Max = body[0][0];//查找最大值 for (int i = 0; i < 20; i++)//去蛇尾 { for (int j = 0; j < 30; j++) { if (body[i][j] > Max) { Max = body[i][j]; snaketail_x = i; snaketail_y = j; } } if (movedirection == 1) { Head_x -= 1; if (body[Head_x][Head_y] == -2) { Food snakefood; snakefood.generateRandomPosition(body); body[snakefood.getfood_x()][snakefood.getfood_y()] = -2; } else { body[snaketail_x][snaketail_y] = 0; } if (body[Head_x][Head_y] == -1) { if (Head_x == 0) { Head_x = 18; } else if (Head_x == 19) { Head_x = 1; } } if (body[Head_x][Head_y] > 0) { cout << "游戏失败!\n"; Sleep(2000); exit(0); } else body[Head_x][Head_y] = 1; } }为什么movedirection=1就游戏结束了。
根据代码,如果 `movedirection` 等于 1,即蛇往上移动时,会进行一系列的判断。其中,如果蛇头碰到了食物(`body[Head_x][Head_y] == -2`),则生成新的食物,并将其位置设置为 -2。如果蛇头碰到了身体(`body[Head_x][Head_y] > 0`),则会输出“游戏失败!”并退出程序。这可能是因为蛇头与身体重叠,导致判断错误,从而使程序认为蛇头碰到了身体,从而退出程序。需要检查程序代码,找出具体的错误原因并进行修复。
#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帮我写出这个类的代码,且不包含其他类来完成贪吃蛇游戏
好的,以下是根据你提供的类`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. 实时输出当前游戏界面
希望这个代码对你有所帮助。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.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)
![](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)