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; }
阅读全文

相关推荐

这段代码为什么无法按键控制 #include <stdlib.h> #include <stdio.h> #include <graphics.h> #include <conio.h> HWND hwnd = NULL; //表示主窗口 typedef struct pointxy { int x; int y; } MYPOINT;//坐标属性 struct snake { int num; //蛇的节数 MYPOINT xy[100]; //蛇最多100节 char position; //方向 }snake;//蛇属性 struct food { MYPOINT fdxy; //食物坐标 int eatgrade; //食物分数 int flag; //食物是否存在 }food;//食物属性 enum moveposition{right='D', left = 'A', down = 'S', up = 'W'};//枚举方向 //初始化蛇 void initsnake(); void initsnake() { snake.xy[2].x = 0; snake.xy[2].y = 0; snake.xy[1].x = 10; snake.xy[1].y = 0; snake.xy[0].x = 20; snake.xy[0].y = 0; snake.num = 3; snake.position = right; } //画蛇 void drawsnake(); void drawsnake() { for (int i = 0; i < snake.num; i++) { setlinecolor(BLACK); //矩形边框黑色 setfillcolor(GREEN); fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10); } } //移动蛇 void movesnake(); void movesnake() { for (int i = snake.num - 1; i > 0; i--) { snake.xy[i].x = snake.xy[i - 1].x; snake.xy[i].y = snake.xy[i - 1].y; } switch (snake.position) { case right: snake.xy[0].x += 10; break; case left: snake.xy[0].x -= 10; break; case down: snake.xy[0].y += 10; break; case up: snake.xy[0].y -= 10; break; default: break; } } //键盘控制 void keydown(); void keydown() { char userkey = 0; userkey = _getch(); switch (userkey) { case right: case'd' : case 77 : if (snake.position != left) snake.position = right; break; case left: case'a' : case 75 : if (snake.position != right) snake.position = left; break; case down: case's' : case 80 : if (snake.position != up) snake.position = down; break; case up: case'w': case 72: if (snake.position != down) snake.position = up; break; default: break; } } //初始化食物 void initfood(); //出现食物 void drawfood(); //吃食物 void eatfood(); //失败判定 void snakedie(); int main() { hwnd = initgraph(640, 480); IMAGE img; loadimage(&img,L"1.jpg", 640, 480); initsnake(); while (1) { cleardevice(); //刷新 putimage(0, 0, &img); drawsnake(); movesnake(); while (_kbhit()) { keydown(); } Sleep(50); } getchar(); //防止闪屏 closegraph(); //关闭图形系统 return 0; }

#include "stm32f10x.h" #include "oled.h" #include "USART.h" void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { uint8_t data = USART_ReceiveData(USART1); if (usart_rx_len < USART_RX_BUF_SIZE) { usart_rx_buf[usart_rx_len++] = data; } } } void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART1, ENABLE); }

最新推荐

recommend-type

通用的I/O模拟串口程序

1. init_uart():必须在开始通信之前调用该函数,以初始化串口。 2. get_rx_pin_status():返回接收引脚的状态,高电平或低电平。 3. set_tx_pin_high():将传输引脚设置为高电平。 4. set_tx_pin_low():将传输引脚...
recommend-type

JAVA发送http get/post请求,调用http接口、方法详解

public static void main(String[] args) throws Exception { // 创建HttpClient对象 HttpClient httpClient = new HttpClient(); // 创建PostMethod对象,指定请求URL PostMethod postMethod = new ...
recommend-type

Android 出现:java.lang.NoClassDefFoundError...错误解决办法

在Android开发过程中,有时会遇到一个常见的运行时异常——`java.lang.NoClassDefFoundError`。...同时,保持对项目依赖的清晰管理,使用条件编译和运行时检查,也能帮助我们构建更加健壮和兼容的应用程序。
recommend-type

C#中结构(struct)的部分初始化和完全初始化实例分析

本文将深入探讨结构的两种初始化方式:部分初始化和完全初始化,并通过实例分析其特点和注意事项。 首先,我们来看部分初始化。部分初始化是指在创建结构实例时只给一部分字段赋值,而其余字段保持默认状态。以下是...
recommend-type

Java中static静态变量的初始化完全解析

Java中的静态变量(static变量)是在类加载时初始化的,而不是在对象创建时。静态变量属于类,而不属于任何特定的对象,因此它们是共享的,所有类实例都可以访问。了解静态变量的初始化顺序对于理解和避免潜在的编程...
recommend-type

Fortify代码扫描工具完整用户指南与安装手册

Fortify是惠普公司推出的一套应用安全测试工具,广泛应用于软件开发生命周期中,以确保软件的安全性。从给定的文件信息中,我们可以了解到相关的文档涉及Fortify的不同模块和版本5.2的使用说明。下面将对这些文档中包含的知识点进行详细说明: 1. Fortify Audit Workbench User Guide(审计工作台用户指南) 这份用户指南将会对Fortify Audit Workbench模块提供详细介绍,这是Fortify产品中用于分析静态扫描结果的界面。文档可能会包括如何使用工作台进行项目创建、任务管理、报告生成以及结果解读等方面的知识。同时,用户指南也可能会解释如何使用Fortify提供的工具来识别和管理安全风险,包括软件中可能存在的各种漏洞类型。 2. Fortify SCA Installation Guide(软件组合分析安装指南) 软件组合分析(SCA)模块是Fortify用以识别和管理开源组件安全风险的工具。安装指南将涉及详细的安装步骤、系统要求、配置以及故障排除等内容。它可能会强调对于不同操作系统和应用程序的支持情况,以及在安装过程中可能遇到的常见问题和解决方案。 3. Fortify SCA System Requirements(软件组合分析系统需求) 该文档聚焦于列出运行Fortify SCA所需的硬件和软件最低配置要求。这包括CPU、内存、硬盘空间以及操作系统等参数。了解这些需求对于确保Fortify SCA能够正常运行以及在不同的部署环境中都能提供稳定的性能至关重要。 4. Fortify SCA User Guide(软件组合分析用户指南) 用户指南将指导用户如何使用SCA模块来扫描应用程序中的开源代码组件,识别已知漏洞和许可证风险。指南中可能含有操作界面的介绍、扫描策略的设置、结果解读方法、漏洞管理流程等关键知识点。 5. Fortify SCA Utilities Guide(软件组合分析工具指南) 此文档可能详细描述了SCA模块的附加功能和辅助工具,包括命令行工具的使用方法、报告的格式化和定制选项,以及与持续集成工具的集成方法等。 6. Fortify Secure Coding Package for Visual Studio User Guide(Visual Studio安全编码包用户指南) Visual Studio安全编码包是Fortify提供给Visual Studio开发者的插件,它能够在编码阶段就帮助开发者发现和修复代码中的安全问题。这份指南将详细说明如何在Visual Studio中集成和使用这个插件,以及如何通过它的各种特性提升代码质量和安全性。 7. IntroToSCAS(软件组合分析入门) 这本入门指南可能为初学者提供一个关于SCA概念的基础理解,包括其重要性、工作原理以及如何应对软件中依赖的开源组件所带来的安全风险。 这些文档涵盖了使用Fortify进行代码安全扫描的多个方面,从安装配置到使用指导,再到深入的漏洞管理。每一个文档都为用户提供了在软件开发生命周期中提高软件安全性所需的关键知识和工具。对于IT专业人士来说,熟悉这些文档的内容将有助于他们更好地在软件开发过程中实施安全措施,以防范潜在的安全威胁。 由于文档内容的丰富性,以上知识点仅是一部分概览。对于每个模块的具体使用方法、最佳实践、案例研究以及高级功能配置等内容,都需要在阅读官方文档后才能全面掌握。IT行业中的安全专家、开发人员、测试工程师等都应根据自己的职责范围来深入学习和应用这些文档中的知识。
recommend-type

【VS2010-MFC实战秘籍】:串口数据波形显示软件入门及优化全解析

# 摘要 本文系统地探讨了基于MFC的串口数据波形显示软件的开发过程,涵盖了从理论基础到实践应用的各个方面。首先介绍了MFC串口通信的理论知识和实际操作,包括串口工作原理、参数配置及使用MFC串口类进行数据收发。随后,文章深入讲解了波形显示软件的界面设计、实现及优化策略,强调了用户
recommend-type

freesurfer完成处理后,如何批量提取每个被试aseg.stats的某个脑区的体积(volume)到一个table中,每个被试的数据是单独的一行

在Freesurfer的处理流程结束后,如果你想要从每个被试的aseg.stats文件中提取特定脑区的体积并整理成表格,你可以按照以下步骤操作: 1. **定位aseg.stats文件**:首先需要找到每个被试的aseg.stats文件,通常它们位于`fsaverage/surf/lh/label`或`rh/label`目录下,对应于左右半球,名称包含被试ID。 2. **解析数据**:打开`aseg.stats`文件,这是一个文本文件,包含了各个脑区域的信息,包括名称(比如`lh.Cuneus.volume`)和值。使用编程语言如Python或Matlab可以方便地读取和解析这个文件。
recommend-type

汽车共享使用说明书的开发与应用

根据提供的文件信息,我们可以提炼出以下知识点: 1. 文件标题为“carshare-manual”,意味着这份文件是一份关于汽车共享服务的手册。汽车共享服务是指通过互联网平台,允许多个用户共享同一辆汽车使用权的模式。这种服务一般包括了车辆的定位、预约、支付等一系列功能,目的是为了减少个人拥有私家车的数量,提倡环保出行,并且能够提高车辆的利用率。 2. 描述中提到的“Descripción 在汽车上使用说明书的共享”,表明该手册是一份共享使用说明,用于指导用户如何使用汽车共享服务。这可能涵盖了如何注册、如何预约车辆、如何解锁和启动车辆、如何支付费用等用户关心的操作流程。 3. 进一步的描述提到了“通用汽车股份公司的股份公司 手册段CarShare 埃斯特上课联合国PROYECTO desarrollado恩11.0.4版本。”,这部分信息说明了这份手册属于通用汽车公司(可能是指通用汽车股份有限公司GM)的CarShare项目。CarShare项目在11.0.4版本中被开发或更新。在IT行业中,版本号通常表示软件的迭代,其中每个数字代表不同的更新或修复的内容。例如,“11.0.4”可能意味着这是11版本的第4次更新。 4. 标签中出现了“TypeScript”,这表明在开发该手册对应的CarShare项目时使用了TypeScript语言。TypeScript是JavaScript的一个超集,它添加了类型系统和一些其他特性,使得开发大型的、可维护的应用程序变得更加容易。TypeScript编译到JavaScript,因此它是JavaScript的一个严格的语法子集。通过使用TypeScript,开发者可以利用面向对象编程的特性,如接口、泛型、类、模块等。 5. 压缩包子文件的文件名称列表中只有一个文件名“carshare-manual-master”,这表明原始的CarShare项目文件可能被压缩打包成了一个压缩文件,并且该压缩文件的名称为“carshare-manual-master”。在IT项目管理中,“master”通常指的是主分支,这个分支通常用于生产环境或是软件的稳定发布版本。这说明“carshare-manual-master”可能是CarShare项目的主分支备份,包含了手册的最新版本。 综合以上信息,我们可以得出以下结论:这份“carshare-manual”是一份由通用汽车公司开发的汽车共享服务使用手册,该服务是CarShare项目的一部分,项目开发使用了TypeScript语言,并且与之相关的一个主分支备份文件被命名为“carshare-manual-master”。用户可以通过这份手册了解如何使用CarShare服务,包括注册、预约、使用和支付等环节,以便更好地享受汽车共享带来的便捷和环保出行理念。
recommend-type

BD3201电路维修全攻略:从入门到高级技巧的必备指南

# 摘要 本文系统地介绍了BD3201电路的维修流程和理论知识,旨在为相关技术人员提供全面的维修指导。首先概述了BD3201电路维修的基本概念,接着深入探讨了电路的基础理论,包括电路工作原理、电路图解读及故障分析基础。第三章详细描述了维修实践操作,涵盖了从准备工作到常见故障诊断与修复,以及性能测试与优化的完整过程。第四章提出了BD3201电路高级维修技巧,强调了微电子组件的焊接拆卸技术及高