void InitSnake() { //对蛇的初始化 snake.len = g_len; //蛇身初识长度 snake.x = COL / 2; snake.y = ROW / 2; //蛇头坐标 g_map[snake.y][snake.x] = HEAD; snake.body = (Body*)malloc(sizeof(Body) * ROW * COL); if (snake.body == NULL) { perror("InitSnack::malloc"); exit(1); } memset(snake.body, 0, sizeof(Body) * ROW * COL); int i = 0; while (i < g_len) { snake.body[i].x = snake.x - (i + 1); snake.body[i].y = snake.y; g_map[snake.body[i].y][snake.body[i].x] = BODY; ++i; } //蛇身初始化 g_rate = RATE; //速度初始化 }
时间: 2024-02-14 10:22:23 浏览: 106
这段代码的作用是初始化一个蛇,并将其放置在游戏地图上。具体来说,这个蛇有一个长度,一个头部和若干个身体部分。函数中首先初始化了蛇的长度,然后将蛇头放在地图的中央,标记为头部。接着分配了一个大小为 ROW * COL 的 Body 数组来存储蛇的身体部分,注意这里使用了动态内存分配(malloc 函数)来避免数组过大而导致的栈溢出。然后使用了 memset 函数将这个数组的值全部初始化为 0。接下来使用一个循环来初始化蛇的身体部分,将它们依次放在蛇头的左边,标记为身体部分。最后,将游戏速度初始化为一个常量 RATE。
相关问题
void can_stop(uint8_t ret,uint8_t *d,uint16_t len) //ret:确认回答 *d:数据 len:长度范围 16位 { uint32_t is_OK=1;//需要返回确认,这里为测试,永远返回成功 if (ret) { /返回确认数据/ CAN_frame_t tx_fram; tx_fram.FIR.B.FF = CAN_frame_std; tx_frame.MsgID = ((uint32_t)SLAVE_ADDR<<6)|((uint32_t)CMD_STOP<<1)|(is_OK);//11bit tx_frame.FIR.B.DLC = 0;//不带数据 tx_frame.FIR.B.RTR = CAN_no_RTR;//数据帧 ESP32Can.CANWriteFrame(&tx_frame);//发送数据 } }
这是一个函数定义,名称为can_stop,接受三个参数:ret、d、len。其中ret是确认回答的值,d是一个指向数据的指针,len是数据的长度(16位)。
在函数中,定义了一个uint32_t类型的变量is_OK,并赋值为1,表示需要返回确认,但这里只是用于测试目的,永远返回成功。
接下来,如果ret的值为非零(即为真),则执行以下操作:
1. 创建一个CAN_frame_t类型的结构体变量tx_fram。
2. 设置tx_fram的FIR.B.FF字段为CAN_frame_std,表示使用标准帧格式。
3. 设置tx_fram的MsgID字段为((uint32_t)SLAVE_ADDR<<6)|((uint32_t)CMD_STOP<<1)|(is_OK),表示设置CAN消息的ID。
4. 设置tx_fram的FIR.B.DLC字段为0,表示不带数据。
5. 设置tx_fram的FIR.B.RTR字段为CAN_no_RTR,表示数据帧。
6. 调用ESP32Can.CANWriteFrame(&tx_frame)函数发送数据。
这段代码的功能是根据传入的参数发送CAN消息,并根据ret的值决定是否发送确认数据。
增加开始界面包括开始游戏、游戏说明、退出游戏 #include <graphics.h> #include <stdio.h> #include <time.h> #include <conio.h> #pragma comment(lib,"winmm.lib") //最简单的贪吃蛇 #define NUM 100 //蛇的最大长度 //枚举4个方向 72 80 75 77 ↑↓←→ enum Ch{up=72,down=80,left=75,right=77}; //坐标 struct Coor { int x; int y; }; //蛇的结构体 struct Snake { int n; //蛇当前的节数 Ch ch; //方向 Coor szb[NUM]; //蛇每一节的坐标 }snake; //snake //食物 struct Food { int x; int y; bool isEat; }food; //游戏的初始化函数 void InitGame() { srand((unsigned int)time(NULL)); mciSendString(L"open 甩葱歌.mp3 alias BGM", 0, 0, 0); mciSendString(L"play BGM", 0, 0, 0); //先得到一条蛇 1节 right 320 240 snake.n = 4; snake.ch = right; snake.szb[0].x = 320; snake.szb[0].y = 240; sna
ke.szb[1].x = 300; snake.szb[1].y = 240; snake.szb[2].x = 280; snake.szb[2].y = 240; snake.szb[3].x = 260; snake.szb[3].y = 240; //初始化食物 food.isEat = true; //随机生成一个食物 food.x = rand() % 640; food.y = rand() % 480; } //绘制游戏界面 void DrawGame() { cleardevice(); //绘制蛇 for (int i = 0; i < snake.n; i++) { setfillcolor(RED); solidcircle(snake.szb[i].x, snake.szb[i].y, 10); } //绘制食物 setfillcolor(GREEN); solidcircle(food.x, food.y, 10); } //更新蛇的位置 void UpdateSnake() { //移动蛇 for (int i = snake.n - 1; i > 0; i--) { snake.szb[i].x = snake.szb[i - 1].x; snake.szb[i].y = snake.szb[i - 1].y; } //根据方向更新蛇头 switch (snake.ch) { case up: snake.szb[0].y -= 20; break; case down: snake.szb[0].y += 20; break; case left: snake.szb[0].x -= 20; break; case right: snake.szb[0].x += 20; break; default: break; } //判断是否吃到食物 if (snake.szb[0].x == food.x && snake.szb[0].y == food.y) { snake.n++; food.isEat = true; food.x = rand() % 640; food.y = rand() % 480; } } //判断游戏是否结束 bool IsGameOver() { //判断是否撞墙 if (snake.szb[0].x < 0 || snake.szb[0].x > 640 || snake.szb[0].y < 0 || snake.szb[0].y > 480) { return true; } //判断是否撞到自己 for (int i = 1; i < snake.n; i++) { if (snake.szb[0].x == snake.szb[i].x && snake.szb[0].y == snake.szb[i].y) { return true; } } return false; } //游戏结束 void GameOver() { //关闭音乐 mciSendString(L"close BGM", 0, 0, 0); //输出得分 printf("Game Over! You got %d score!\n", snake.n - 4); } //主函数 int main() { //初始化窗口 initgraph(640, 480); //初始化游戏 InitGame(); //游戏循环 while (1) { //绘制游戏界面 DrawGame(); //更新蛇的位置 UpdateSnake(); //判断游戏是否结束 if (IsGameOver()) { GameOver(); break; } //延时一段时间 Sleep(200); //判断是否需要重新生成食物 if (food.isEat) { food.isEat = false; } } //关闭窗口 closegraph(); return 0; }
阅读全文