// 更新蛇的位置 void updateSnake() { // 记录蛇尾位置 int tailx = snake[length - 1][0]; int taily = snake[length - 1][1]; // 更新蛇身位置 for (int i = length - 1; i > 0; i--) { snake[i][0] = snake[i - 1][0]; snake[i][1] = snake[i - 1][1]; } // 更新蛇头位置 if (direction== UP) headx--; else if (direction == DOWN) headx++; else if (direction == LEFT) heady--; else if (direction == RIGHT) heady++; snake[0][0] = headx; snake[0][1] = heady; // 清除蛇尾 weizhi(tailx, taily); printf(" "); } // 创建食物 void createFood() { srand((unsigned)time(NULL)); while (1) { foodx = rand() % (ROW - 2) + 1; foody = rand() % (COL - 2) + 1; int flag = 1; for (int i = 0; i < length; i++) { if (foodx == snake[i][0] && foody == snake[i][1]) { flag = 0; break; } } if (flag) break; } }解释这段代码
时间: 2023-11-24 21:07:27 浏览: 26
这是一段C语言代码,实现了贪吃蛇游戏中蛇的移动和食物的生成。其中,updateSnake函数用于更新蛇的位置,首先记录蛇尾的位置,然后将蛇身的位置依次向前移动一格,最后根据蛇头的方向更新蛇头的位置,并将新的蛇头位置记录在数组snake的第一个元素中。最后,通过调用weizhi函数清除原来的蛇尾位置并打印一个空格。
createFood函数用于生成食物,首先通过srand函数设置随机数种子,然后在游戏区域内随机生成食物的位置。通过循环判断食物的位置是否与蛇的位置重复,如果重复则重新生成,直到找到一个不与蛇的位置重复的位置为止。最后将食物的位置记录在变量foodx和foody中。
相关问题
根据上述部分可以解决了贪吃蛇问题代码,写一段自己写代码的感受和收获。包括但不限于搞不清类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。之后可以通过数组下标的方式访问和修改二维数组的元素。
把它转换成代码格式按照以下思路写出贪吃蛇代码int max, grade; //全局变量 int main() { #pragma warning (disable:4996) //消除警告 max = 0, grade = 0; //初始化变量 system(“title 贪吃蛇”); //设置cmd窗口的
标题
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define MAX_X 40
#define MAX_Y 20
#define SNAKE_MAX_LENGTH 100
int map[MAX_Y][MAX_X]; //游戏地图
int snake[SNAKE_MAX_LENGTH][2]; //蛇身
int snake_length; //蛇的长度
int direction; //蛇的方向
int food_x, food_y; //食物的坐标
int score, max_score; //分数和最高分
void init_map() { //初始化地图
int i, j;
for (i = 0; i < MAX_Y; i++) {
for (j = 0; j < MAX_X; j++) {
if (i == 0 || i == MAX_Y - 1 || j == 0 || j == MAX_X - 1) {
map[i][j] = -1; //边界
} else {
map[i][j] = 0; //空地
}
}
}
}
void draw_map() { //绘制地图
int i, j;
system("cls"); //清屏
for (i = 0; i < MAX_Y; i++) {
for (j = 0; j < MAX_X; j++) {
switch (map[i][j]) {
case -1: printf("#"); break; //边界
case 0: printf(" "); break; //空地
case 1: printf("*"); break; //蛇身
case 2: printf("$"); break; //食物
}
}
printf("\n");
}
printf("得分:%d 最高分:%d\n", score, max_score);
}
void init_snake() { //初始化蛇
snake_length = 3;
snake[0][0] = MAX_X / 2; snake[0][1] = MAX_Y / 2; //蛇头
snake[1][0] = snake[0][0] - 1; snake[1][1] = snake[0][1]; //蛇身
snake[2][0] = snake[1][0] - 1; snake[2][1] = snake[1][1]; //蛇尾
direction = 'd'; //初始方向向右
}
void create_food() { //生成食物
int x, y;
do {
x = rand() % (MAX_X - 2) + 1; //随机生成x坐标,不能在边界上
y = rand() % (MAX_Y - 2) + 1; //随机生成y坐标,不能在边界上
} while (map[y][x] != 0); //如果生成的位置不是空地,则重新生成
food_x = x;
food_y = y;
}
void move_snake() { //移动蛇
int i;
int new_head_x = snake[0][0], new_head_y = snake[0][1];
switch (direction) {
case 'w': new_head_y--; break; //向上
case 's': new_head_y++; break; //向下
case 'a': new_head_x--; break; //向左
case 'd': new_head_x++; break; //向右
}
if (map[new_head_y][new_head_x] == -1 || map[new_head_y][new_head_x] == 1) { //撞墙或咬到自己
if (score > max_score) {
max_score = score;
}
score = 0;
init_map();
init_snake();
create_food();
return;
}
if (new_head_x == food_x && new_head_y == food_y) { //吃到食物
snake_length++;
score += 10;
create_food();
} else { //移动蛇身
map[snake[snake_length - 1][1]][snake[snake_length - 1][0]] = 0; //清除蛇尾
for (i = snake_length - 1; i > 0; i--) { //蛇身向前移动
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
map[snake[i][1]][snake[i][0]] = 1; //更新地图
}
}
snake[0][0] = new_head_x;
snake[0][1] = new_head_y;
map[new_head_y][new_head_x] = 1; //更新地图
}
void game_loop() { //游戏循环
int ch;
while (1) {
draw_map();
move_snake();
if (_kbhit()) { //检测按键
ch = _getch();
switch (ch) {
case 'w': case 's': case 'a': case 'd': direction = ch; break; //改变方向
case 'q': return; //退出游戏
}
}
Sleep(100); //延时
}
}
int main() {
srand((unsigned)time(NULL)); //随机数种子
init_map();
init_snake();
create_food();
game_loop();
return 0;
}
```
相关推荐
![c](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.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)