用c++语言写贪吃蛇游戏,已经用vector创建2维数组,则对象蛇,含有哪些属性,如何构造蛇身,
时间: 2024-04-05 20:34:19 浏览: 78
蛇的属性可以包括:
1. 蛇身的长度
2. 蛇的方向(向上、向下、向左、向右)
3. 蛇头的位置
4. 蛇身的位置
构造蛇身可以使用一个 vector 来存储蛇的身体,其中每个元素表示一个蛇节的位置,这个位置可以使用一个二维数组中的坐标来表示。一开始,蛇身可以只包含一节,即蛇头,然后在游戏开始后,每当蛇吃到食物后,就可以在蛇尾添加一个蛇节,使得蛇身长度加一。添加蛇节的方法可以是在 vector 的末尾添加一个新元素,表示新的蛇节的位置。新蛇节的位置可以根据蛇身的方向和蛇尾的位置来计算得出。
相关问题
用c++语言面对对象思想,再用vector构建二维数组,写出一个贪吃蛇代码。其中食物类构成,代码
好的,我会尽力回答你的问题。以下是基于C++语言和面向对象思想的贪吃蛇代码,其中使用了vector构建二维数组,同时实现了食物类。
```c++
#include <iostream>
#include <vector>
#include <conio.h>
#include <windows.h>
using namespace std;
// 坐标类
class Coordinate {
public:
int x;
int y;
Coordinate(int _x = 0, int _y = 0) {
x = _x;
y = _y;
}
};
// 食物类
class Food {
public:
Coordinate coordinate;
Food() {
srand((unsigned)time(NULL));
coordinate.x = rand() % 20;
coordinate.y = rand() % 20;
}
void generateFood() {
srand((unsigned)time(NULL));
coordinate.x = rand() % 20;
coordinate.y = rand() % 20;
}
};
// 贪吃蛇类
class Snake {
public:
vector<Coordinate> body;
Coordinate direction;
int length;
Snake() {
length = 3;
direction.x = 1;
direction.y = 0;
body.push_back(Coordinate(0, 0));
body.push_back(Coordinate(1, 0));
body.push_back(Coordinate(2, 0));
}
void move() {
// 计算蛇头新的位置
Coordinate newHead = body[length - 1];
newHead.x += direction.x;
newHead.y += direction.y;
// 判断蛇头是否与食物重合
bool isEatFood = (newHead.x == food.coordinate.x && newHead.y == food.coordinate.y);
// 将蛇头插入到身体最后面
body.push_back(newHead);
// 判断是否吃到了食物
if (!isEatFood) {
// 如果没有吃到食物,将蛇尾移除
body.erase(body.begin());
}
else {
// 如果吃到了食物,重新生成一个食物
food.generateFood();
length++;
}
}
bool isDead() {
// 判断蛇头是否超过边界
if (body[length - 1].x < 0 || body[length - 1].x >= 20 || body[length - 1].y < 0 || body[length - 1].y >= 20) {
return true;
}
// 判断蛇头是否与身体重合
for (int i = 0; i < length - 1; i++) {
if (body[i].x == body[length - 1].x && body[i].y == body[length - 1].y) {
return true;
}
}
return false;
}
private:
Food food;
};
// 游戏类
class Game {
public:
void start() {
while (true) {
// 清空屏幕
system("cls");
// 输出地图
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 20; j++) {
bool isSnake = false;
// 判断该位置是否为蛇身
for (int k = 0; k < snake.length; k++) {
if (snake.body[k].x == j && snake.body[k].y == i) {
isSnake = true;
break;
}
}
// 输出地图
if (isSnake) {
cout << "■";
}
else if (food.coordinate.x == j && food.coordinate.y == i) {
cout << "★";
}
else {
cout << "□";
}
}
cout << endl;
}
// 判断是否死亡
if (snake.isDead()) {
cout << "Game Over" << endl;
break;
}
// 接收用户输入
if (_kbhit()) {
switch (_getch()) {
case 'w':
if (snake.direction.y != 1) {
snake.direction.x = 0;
snake.direction.y = -1;
}
break;
case 's':
if (snake.direction.y != -1) {
snake.direction.x = 0;
snake.direction.y = 1;
}
break;
case 'a':
if (snake.direction.x != 1) {
snake.direction.x = -1;
snake.direction.y = 0;
}
break;
case 'd':
if (snake.direction.x != -1) {
snake.direction.x = 1;
snake.direction.y = 0;
}
break;
}
}
// 移动蛇
snake.move();
// 延时
Sleep(100);
}
}
private:
Snake snake;
Food food;
};
int main() {
Game game;
game.start();
return 0;
}
```
其中,贪吃蛇类包含了蛇的身体、移动方向和长度等信息,食物类包含了食物的位置信息,游戏类包含了游戏的开始、结束和循环等逻辑。整个游戏的流程如下:
1. 初始化贪吃蛇和食物,输出地图;
2. 接收用户输入,移动蛇;
3. 判断是否死亡,如果死亡则结束游戏,否则继续循环;
4. 延时一段时间,再次循环。
希望这个代码能够帮助到你!
根据上述部分可以解决了贪吃蛇问题代码,写一段自己写代码的感受和收获。包括但不限于搞不清类Foodclass Food { private: int food_x; int food_y; public: Food(int Length,int Width); int getfood_x(); int getfood_y(); Food(); };和类Snake#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; };可以用面对对象方法联系起来,一点也不清楚vector的情况下,在csdn网站上找资料,使用容器vector创建2维数组,如代码const int Length = 20;//场景的高度 const int Width = 30;//场景的宽度 body = std::vector<std::vector<int>>(20, std::vector<int>(30, 0));最后做出程序内心的喜悦,仿佛煎熬全部褪去,要求详细和精准,在代码中找出例子,并进行描述
写代码的感受和收获:
在编写贪吃蛇游戏的代码过程中,我深刻体会到了面向对象编程思想的重要性。通过将游戏中的蛇和食物封装成各自的类,实现了游戏功能的模块化设计。同时,使用容器vector创建二维数组,方便地存储了游戏场景中的各个元素。这让我更加深入理解了C++中的容器和面向对象编程的思想。
在实现过程中,我遇到了一些问题,例如不清楚如何使用vector创建二维数组、如何实现蛇的移动和碰撞检测等。但是通过在CSDN等网站上查找和学习相关资料,我成功地解决了这些问题,并实现了游戏的基本功能。这种通过自学和探索解决问题的过程,让我更加自信和热爱编程。
最终,当我看到自己编写的贪吃蛇游戏可以正常运行、玩家可以操作蛇吃掉食物并不断变长、游戏会自动检测蛇与边界和自身的碰撞等情况时,我内心充满了喜悦和满足感。这种感觉就像是经历了煎熬,最终迎来了胜利,让我更加热爱编程并愿意不断学习和探索。
下面是一个使用vector创建二维数组的例子,可以在游戏场景中存储各个元素:
```c++
const int Length = 20; // 场景的高度
const int Width = 30; // 场景的宽度
std::vector<std::vector<int>> body(Length, std::vector<int>(Width, 0)); // 创建二维数组
// 对二维数组进行操作,例如获取元素、修改元素等
int element = body[row][col]; // 获取(row, col)位置的元素
body[row][col] = 1; // 将(row, col)位置的元素设置为1
```
这段代码定义了场景的高度和宽度,并使用vector容器创建了一个二维数组body。在创建时,使用了vector的构造函数,将数组初始化为指定的高度和宽度,并将所有元素初始化为0。之后可以通过数组下标的方式访问和修改二维数组的元素。
阅读全文