ImageVerifierCode 换一换
格式:DOC , 页数:69 ,大小:638KB ,
资源ID:3396844      下载积分:14 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/3396844.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(贪吃蛇项目报告.doc)为本站上传会员【丰****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

贪吃蛇项目报告.doc

1、 C语言项目设计报告 ——贪吃蛇游戏 课程:标准C语言 指导老师:XXX 项目:贪吃蛇游戏 班级:XXXX班 成员:XXX、XXX、XXX、XXX 姓名:XXX 学号:XXXXXXX 日期:2023/7/7 目录 一.项目开发文档…………………………(3) 1 项目基本分析……………………………(3) 1.1项目目的…………………………(4) 1.2功能描述…………………………(4) 1.3小组分工…………………………(7) 2 总体设计报告

2、……………………………(8) 2.1 函数分块…………………………(9) 2.2 接口设计…………………………(9) 3 具体设计报告……………………………(14) 3.1 程序结构…………………………(14) 3.2 算法流程…………………………(17) 4 操作指南…………………………………(29) 4.1 运营及结果截图…………………(29) 5 项目总结…………………………………(32) 5.1 优点与局限性………………………(32) 5.2 我的收获与总结(※)……………(

3、33) 二.项目代码…………………………………(36) 贪吃蛇游戏 一 项目开发文档 1 项目基本分析 在我进行编写贪吃蛇游戏之前,我所做的必须是可行性分析,由于一旦进行贪吃蛇游戏项目的开发,就必须保证自己在规定的时间内可以独立的完整整个程序的所有功能,并且必须是最优的,因此,在开发贪吃蛇游戏之前,我必须要做的是可行性分析。通过查找相关文档和技术支持,了解了VS环境下的开发过程,熟悉了C语言的开发技巧,通过以下几个方面,进行可行性分析: 1. 参考文献 :《贪吃蛇游戏用户描述文档》、在网上找了相关源代码,拟定自己可以在自己能力范围内开发出这个贪

4、吃蛇游戏项目。 2. 功能规定:在进行整个项目开发之前,我必须要做的就是拟定贪吃蛇游戏的重要功能,必须明确贪吃蛇游戏的功能,由于要进行游戏功能可行性分析,通过自己的查阅相关资料,我拟定了贪吃蛇游戏的具体功能,详见后续部分具体设计。 3. 性能需求:必须保证自己开发的贪吃蛇游戏可以整体尽也许做到高效快速,不占用大量的使用资源,由于我做的是一个应用窗体控制台的游戏开发项目,必须要考虑资源使用情况,规定尽也许少用资源,在有限的资源范围内实现最大的可运用价值。 4. 运营环境:VS2023上编写并进行调试,通过安装软件,拟定可以进行项目程序的编写。 5. 界面规定:采用Win7应用窗体标准界面

5、只需要使用键盘。 6. 完毕期限,一个学期完毕整个系统,涉及程序的编写以及最终的调试,测试阶段。 1.1 项目目的 1 熟悉函数的调用与程序的模块化设计,加深对所学知识的理解 2 加强自学能力,碰到不了解的函数或者方法,通过图书及网络资源学习,提高学习能力 3 完毕贪吃蛇游戏,通过小项目来检查一学期的学习效果,增长学习爱好 1.2 功能描述 该游戏在继承传统同类游戏规则的基础上,我们添加了我们自己的想法与功能,设计如下: 游戏规则涉及蛇的运动范围、蛇的生命周期问题、分数记录、关卡判断。 其中蛇的运动范围是一个15*15的数组呢,蛇运动的地图抽

6、象成为一个15*15的二维整形数组,每个数组值代表一个小方块的坐标值,这样,蛇只能在规定好的二维数组内运动 当蛇碰到数组左右边界值(我们在这里抽象成为上、下、左、右四个边界,其中上边界坐标值中纵坐标都是0,横坐标任意,下边界为纵坐标是15,同理横坐标不变,左边界为横坐标为0,纵坐标任意,同理右边界为横坐标为15,纵坐标任意)时,宣告蛇生命周期结束(上下边界不限定),贪吃蛇死亡,这个是第一个规则;此外,当蛇自己吃到自己身体的某一部分时,也宣告游戏结束,在程序里通过循环判断蛇头下一个前进方向的节点是不是蛇身上的某一部分节点即可,假如是那么蛇死亡,否则继续运营游戏。 分数记录算法的思想是每次

7、蛇吃到一个果实时,相加的分数为一个定值10来记录分数,这样可以随着游戏难度的增长,分数值也随之增多。关卡功能设立通过与分数相关联而体现的,初始化游戏分数为0,关卡障碍物选择由玩家键入,当玩家玩到一定的分数时(例如是100)关卡加一,变为第二关,同时,蛇前进速度相应增长一个等级,障碍物的设立也变化,这样就实现了不同关卡,不同速度的贪吃蛇,从而增长了游戏的难度。 蛇: 1、可以实现贪吃蛇自动前线移动,也就是贪吃蛇可以“活动”的外观效果,根据相同的时间间隔,每一次将贪吃蛇自身的蛇头向前移动一个小格子,同时蛇尾向前移动一个小格子,移动方向为贪吃蛇行走的方向。 2、每当一个食物时

8、蛇长度增长一格 3、蛇头碰到自身时则游戏结束 4、通过键盘来控制蛇的移动 食物: 1、 每当蛇吃到食物时,重置食物 2、 吃到特定食物时,蛇的长度可以缩短 边界和障碍物: 1、 碰到边界和障碍物则游戏终止 成绩记录: 1、当贪吃蛇吃到果实时,玩家的分数就应当随着吃到的果实而增长,增长的规则就是每一个吃到一个食物则乘以10得到分数。 2、可以与历史成绩进行比较,显示高分排行榜 输入与输出: 1、 通过键盘选择障碍物关卡数 2、 通过键盘选择蛇的速度 3、 显示游戏指南 4、 可以即时显示当次游戏的关卡数及游戏分数 5、 显示游戏界面

9、 贪吃蛇的总体功能图 1.3小组成员分工 小组成员 XXX XXX XXX XXX 功能分析 小组讨论,拟定项目题目和基本方案, 成员提出想实现的功能,分析可行性 讨论建议 整理方案 分工安排 接口实现 成绩,特效 蛇的基本功能 障碍物功能 边界问题 关卡递进 最初源代码 添加注释 基本功能 添加边界 成绩存档 食物重置 特殊效果 障碍物

10、关卡功能 汇总整理 测试改善 2 总体设计报告 考虑到要实现的功能太多,所以宜采用模块化设计,把功能分块(在介绍功能时已经按这个方式介绍了),然后设计各个模块之间参数的传递,衔接起来,最后实现每个功能的算法。 一方面我们定义了所需要的数据类型 1. Node(结点)型定义 用来作为蛇的头,身,尾的数据类型以及障碍物的数据类型 每个成员的设计已在注释中注明,其中蛇和障碍物均用链表结构表达 struct Node { int x; /*蛇某一节的横坐标*/ int

11、 y; /*蛇某一节的纵坐标*/ struct Node *pre; /*蛇某一节的前驱结点*/ struct Node *next; /*蛇某一节的后继结点*/ }; 2.Food(食物)型定义 用来储存食物的横纵坐标及显示的字母 3.Player(玩家)型定义 储存玩家的姓名和成绩 2.1函数分块 总的来说,我们把所有功能提成了以下几个大块: main snake food barrier and block grade

12、 共五个大块,分别实现相应功能,见名知意,各块的功能显而易见,依次实现重要的运营(main),蛇的控制、移动、增减(snake),食物的重置(food),障碍物的设立及边界的判断(barrier and block),成绩的记录与存档(grade) 每个模块均存在一个CPP中,截图如下: 2.2接口设计 下面分别介绍每个大块的内部函数接口设计 main: 主函数: int main() 其中main函数里定义了游戏必须的一些变量 输入函数: int input(char*pname,int*barrierkind) 第一个形参为cha

13、r*类型,用来接受main函数里面的玩家名字,便于输入赋值,由于要进行写操作修改其值,所以定义成一级指针;第二个形参为障碍物类型,即初始化的障碍物分布,同样要在input里赋值,所以用int*型。 返回值为速度值,是一个整数,游戏通过这个数来控制蛇前进的速度,所以定义为int 屏幕显示函数: void screenshow(int score,int stage,Node*head,Node*firstbar,Food*food) 要显示当前的分数和关卡,所以传两个整型参数score和stage;又要通过二位数组扫描,根据横纵坐标来看输出“”(空格)还是蛇“■ ”,或障碍物“※”,

14、或食物,所以要传结构体参数Node*和Food Snake: 蛇的初始化函数: void initalsnake(int*grade,Node**head,Node**rear) 顺便把成绩也初始化,所以传了个int型参数grade;然后由于要修改main函数中Node*head目的空间的的横纵坐标,所以这里用了一个二级指针,否则,若设计成Node*型,则形参改的值只在该函数有效,对main函数里的head无影响(此处曾调试很久,在5.2.2心得体会里在具体说明) 方向输入函数: char directioninput(char c) 由键盘键入一个值,传回有效值

15、故返回值类型为char, 由主函数传过来而不内部定义时避免输入无效值时犯错,所以此处相称于输入无效值则还是原值(内部最后一句为return c)。 蛇移动函数: void snakeheadmove(char c,Node**head) 传前进的方向,为字母值,用char,头要移动,需要改值,所以用二级指针 添加和删除结点函数: void addpoint(Node**head,Node**rear) void deletepoint(Node**head,Node**rear) 由于用的是双向链表,所以要传头尾两个参数,需改值,故用二级指针 Food: 食

16、物重置函数: void foodreset(char c,Food*food,Node*head,Node*firstbar) 当玩到最后蛇身较长时,重置多次也许还不行,所以会内定为在蛇前进方向的前两个出食物,所以要传前进方向,用char;需改变食物的横纵坐标及显示字母,故第二个参数用一级指针;要判断食物是否重置到蛇身或障碍物上,所以传两者参数,由于只是判断不需要改值,所以一级指针即可 barrier and block: 障碍物初始化函数: void initalbarrier(int barrierkind,Node**firstbar,Node**lastbar)

17、 要调用障碍物重置函数void barrierset(int barrierkind,Node**firstbar,Node**lastbar) ,需要主函数里的实参,所以第一个参数用int,便于内部传值调用其他函数;要修改主函数中firstbar和lastbar的目的空间的值,所以用二级指针; 判断出界函数 int Block(Node *head) 看头部的坐标是否出界,所以只需Node*即可;对判断结果进行记录,返回0或1,所以用int; 障碍物重置函数 void barrierset(int barrierkind,Node**firstbar,Node**last

18、bar) 接受关卡数,故第一个参数定义为int; 要修改主函数中firstbar和lastbar的目的空间的值,所以用二级指针; 判断游戏结束函数: int Gameover(Node*head,Node*firstbar) 需要判断头是否触到障碍物,所以传参数Node*;对判断结果进行记录,返回0或1,所以用int; Grade: 成绩插入函数: void scorecompare(Player*top,Player*player) 把该次的成绩与本来的前十名成绩进行比较,需要记录名字,所以传结构体Player*; 历史成绩复制函数: void filei

19、nital(Player*topplayer) 由于要把文献中的历史成绩赋值给主函数的结构体数组,所以传一级指针Player* 成绩存档函数: void file(Player*top) 把排序后的新的TOP10的成绩写入文档,由于是一维数组,所以只能传指针; 参数传递图: main grade snake bolck fileinital Input initalsnake initalbarrier derectioninput Block snakem

20、ove main barrierset addpoint gameover deletepoint scorecompare file screenshow 注明:单项箭头的指向为参数传递的方向; 双向箭头说明有传递返回值; 重要采用指针参数改动值,所以很少有返回值; 3 具体设计报告 3.1程序结构 程序流程图 3.1.1各种宏定义以及说明 #define boundary 15 /* 边界定义为15*15 */ #define N 10 /

21、 只存取和展示前10名玩家 */ 3.1.2重要函数声明如下 int input(char*,int*); 显示最初的提醒界面,实现难度和关卡的选择输入; void foodreset(char c,Food*food,Node*head,Node*firstbar); 实现食物的随机重置; void initalsnake(int*,Node**,Node**); 给蛇头动态分派空间,顺便初始化成绩; void initalbarrier(int,Node**,Node**); 给障碍物初始化空间,同时调用食物重置函数; void barrier

22、set(int,Node**,Node**); 根据现在的关卡信息重置障碍物; int Block(Node*head) ; 判断头是否出界 char directioninput(char); 方向控制键入函数;从键盘过去键入值; void snakeheadmove(char,Node**); 根据键入的值执行蛇头移动; void addpoint(Node**,Node**); 吃到食物时增长结点,蛇身增长; void deletepoint(Node**,Node**); 吃到特定食物蛇身变短; int Gameover(Node*,No

23、de*); 判断游戏是否终止; void screenshow(int,int,Node*,Node*,Food*); 显示游戏界面; void scorecompare(struct Player*,struct Player*); 每个玩家游戏结束即时排序插入高分榜; void fileinital(Player*); 文献初始化; void file(Player*); 成绩存档; 3.2算法流程 3.2.1 main模块的函数算法: int main() {//初始化信息,调用文献初始化函数; while(1)

24、 //玩家循环(外循环) { 定义必要的变量; 初始化该玩家信息(姓名“XXX”,0分); 清屏; 调用输入函数,返回速度值; 调用蛇和障碍物的初始化函数; 运用time函数产生随机数; While(1) //游戏的进程循环(内循环) { if(蛇头吃到食物) { (字母“o”)?(减短):(增长); 调用食物重置函数; 玩家成绩增长; } if(有键盘输入) { 调用方向输入函数;} pt=rear; while(pt不指向蛇头) {将蛇头

25、后面的结点分别等于前驱结点;}//相称于前移 调用蛇头移动函数; if(游戏过关) { 速度延时减(20毫秒*关卡等级),直到为零; 释放障碍物空间; 重置障碍物; } if(游戏结束) { 输出鼓励的话; 跳出本次循环; } 调用屏幕显示函数; 调用Sleep函数延时; }//内循环结束 释放蛇头空间; 释放障碍物空间; 调用分数插入函数; 调用文献存档函数; 延时一秒; 清屏; 显示英雄榜; 判断继续游戏还是退出; } //外循环结束 return 0; } int input(c

26、har*pname,int*barrierkind) { 定义速度变量; printf("欢迎来到贪吃蛇游戏"); printf("请输入名字"); scanf("%s",pname); ……………… (后面是类似的输入障碍物类型和难度) return speed*50; } void screenshow(int score,int stage,Node*head,Node*firstbar,Food*food) { 定义要用的变量; 清屏; 输出提醒游戏规则的话; for(i=1;i

27、ry;i++) printf("—"); printf("\n");//上边界输出 for(i=0;i

28、har('\n'); } //i的循环完 printf(" "); for(i=1;i

29、 { char c1='d'; c1=getch(); if(c1==27) /*当输入的是Esc时,直接退出*/ exit(1); /*判断输入是否有效,不能逆向前进*/ if(c!='d' && c1=='a') c=c1; else if(c!='a' && c1=='d') c=c1; else if(c!='w

30、' && c1=='s') c=c1; else if(c!='s' && c1=='w') c=c1; return (c); } void snakeheadmove(char c,Node**head) { switch(c) { case 'd':(*head)->y+=1; if((*head)->y>=boundary) (*head)->y-=boundary; break

31、 …………………… (后面几个同理) } void addpoint(Node**head,Node**rear) { struct Node *pt,*p; p=(struct Node *)malloc(sizeof(struct Node)); pt=*head; /*分派结点p的地址空间并将其指向蛇头结点*/ while(pt->next!=NULL) pt=pt->next ; /*当p的next域不为空时将p指向下一个结点

32、/ p->pre= pt; pt->next = p; p->next=NULL; *rear=p; /*将p结点插到蛇链表的末尾,后插法*/ } void deletepoint(Node**head,Node**rear) { (*head)->next=*rear; (*rear)->pre=*head; //删除所有节点,只留首尾 } 3.2.3 food模块的函数算法: void foodreset(char c,Food*food,No

33、de*head,Node*firstbar) { 定义变量; 重置食物; for(t=0,flag=1;flag==1;t++) { for(pt=head;pt!=NULL;pt=pt->next) { if(食物坐标等于蛇身坐标) { 重置食物; break; } } for(pt=firstbar;pt!=NULL;pt=pt->next) { if(食物坐标等于蛇身坐标) { 重置食物; break; } } } if(t>5) /*

34、当5次重置,食物坐标均等于蛇的坐标,则将食物置于蛇的前进方向的前一格*/ { switch(c) { case 'd':food->x=head->x+1; food->y=head->y; if(food->x>=boundary) food->x-=boundary; break; ……………… (后面的选项类似) } } } 3.2.4 block and barrier模块函数算法:

35、 void initalbarrier(int barrierkind,Node**firstbar,Node**lastbar) { *firstbar=new Node[5]; //用new运算动态分派空间 (*firstbar)->x=10; //设立初始坐标 (*firstbar)->y=10; (*firstbar)->pre=NULL; (*firstbar)->next=NULL; *lastbar=*firstbar; barrierset(barrierkind,first

36、bar,lastbar); //调用障碍物设立函数 } int Block(Node *head) { if(蛇头坐标出界) return 1; else return 0; } void barrierset(int barrierkind,Node**firstbar,Node**lastbar) { 定义变量; for(i=0;i<5;i++) //用后插法一次插入五个障碍物 { p=*firstbar+i; pt=*firstbar;

37、 while(pt->next!=NULL) pt=pt->next ; p->pre= pt; pt->next = p; p->next=NULL; *lastbar=p; } switch(barrierkind) //给障碍物赋坐标值 { case 1: (*lastbar)->x=(*lastbar)->pre->x-1; (*lastbar)->y=(*lastbar)->pr

38、e->y; break; case 2: (*lastbar)->x=(*lastbar)->pre->x; (*lastbar)->y=(*lastbar)->pre->y-1; break; default: (*lastbar)->x=(*lastbar)->pre->x-1; (*lastbar)->y=(*lastbar)->pre->y-1; } } int Gameover(Node*head,Node*firstbar) { 定义变量; for(pt=he

39、ad->next;pt!=NULL;pt=pt->next) { if(蛇头坐标等于蛇身的坐标) return 1; } for(pt=firstbar;pt!=NULL;pt=pt->next) { if(蛇头坐标等于障碍物坐标) return 1; } if (Block(head)) //调用Block函数 { return 1; } return 0; } 3.2.5 grade模块函数的算法: void scorecompare(Player*top,Player*

40、player) { 定义变量; 遍历top数组比较大小,标记下player的成绩的位置; 从后往前遍历,把player的信息插入到标记的位置; (具体代码见源代码,此处只写算法和思绪) } void fileinital(Player*topplayer) { FILE*fp; //定义结构体FILE型的指针 if(打开的只读文献为空) { if(打开的只写文献为空) //此处一般不为空,由于打开只写没有的话会自动创建 { 提醒运营错误; exit(0); } Player inital[N];

41、 //定义结构体P int i; for(i=0;i

42、 关闭读文献; } void file(Player*top) { FILE*fp; 打开写文献; 把topplayer数组里的信息拷贝到写文献; 关闭写文献; } 4 操作指南 由于采用的是用户和谐型的提醒界面,所以根据提醒按键即可 4.1 运营结果及截图 4.1.1 游戏界面的截图 一进入游戏会提醒输入障碍物类型和难度; 分数排行榜 食物 障碍物 游戏提醒 即时显示当前关卡和分数; 4.1.2

43、不同关卡的截图 关卡1: 关卡2: 关卡3: 吃到“O”时身长减短的截图 5 项目总结 5.1 优点与局限性 优点: 1. 该游戏趣味性强,并且附加的功能多,所以很好玩; 2. 代码算法没用很高深的数据结构或者其他一些技巧,完全是应用本学期所学的基本只是做出来的(文献储存是我通过网络资源自学的); 3. 对于新增的结点删除和障碍物设立以及成绩排序这几个功能,是我们对最最初源代码的升华与提高,感觉效果很好; 局限性: 1. 开始食物重置有BUG,一直到7月8号我才改善成功,很幸运; 2. 本来准备做个菜单界面的,但觉得和源程序不好衔接

44、就没花功夫做; 3. 不能暂停游戏; 4. 通过刷屏实现的,闪屏问题没解决; 5. 二维数组显示界面时其实横纵坐标是反的(懒得改了) 5.2 我的收获与总结 5.2.1 我的学习过程 由于这个项目我是组长,所以重要的东西都是我在负责,我碰到的新问题重要有几个:链表的使用;障碍物的添加;文献存档的实现 一方面,我通过看数据结构的链表章节,了解了链表的使用,从而解决了用什么数据结构描述蛇的问题,采用双向链表是由于有正反双向的遍历。减短蛇身的功能时通过删除结点实现的。 障碍物时我添加的,觉得用二维数组储存太麻烦并且不好集体控制,所以仿照蛇用的链表,虽然代码里用的是双向,但其

45、实根据最后的需求来看,单向链表足矣。 文档问题也很棘手,所以我自学了运用库函数来调用文档信息,由于不会文献流,所以我没用采用直接操作文献内容的当时,而是通过操作一个数组来控制文献内容,每次先从文献读入内容,操作数组,再写入文献即可,这样虽然麻烦,但操作简便。此外,文献每次只能打开一次,所以每次进行完读写操作后需要关闭文献,这是很重要的。 5.2.2 一些调试上碰到的问题和我的解决措施 1. 关卡过关怎么表达? 我设计了一个STAGE的int型变量,初始化为零,然后通过除以100(整型)得到其百位数的值后再加以牌拟定关数。通过临时变量来记录上次的STAGE值,再计算本次的,最

46、后看差值是否为零: int tempSTAGE=STAGE; STAGE=player.grade/100+1; if(tempSTAGE-STAGE){……} 2. 怎么在指针型数据传参数时修改其值? 一方面,蛇头的类型为Node*,刚开始时我的形参也定义为Node*,然后报错,大约就是指针用错了;这里我联想到课本上的例子字符串解决里面,对于两个字符串,假如只传char*的参数来互换指针是不够的,互换的只是形参,对本来数组没影响,而应采用strcpy来互换;所以我得出了,要想改变其值就必须传相应的指针,以要修改值的指针做

47、形参。所以我果断选用了二级指针。 3. 食物有时不出来怎么办? 说实话,这个问题困扰了我们好久,但我觉得逻辑上我们已经解决了食物不会出现在蛇身及障碍物上,所以我断定是边界出问题了。对于起止点(0到boundary)还是(1到boundary)能否取等号这些细节我不赘述,反复调试看运营效果,而不是死扣逻辑。 最后我相处了修改办法:不满打满算,而是使食物向中间靠拢。 起初我们用的是:food->x=rand()%(boundary);看似不错,但有0这个隐患,直接加1的话又会超过上界,最后我想出了这样解决: food->x=rand()%(boundary-2)+1; 即余

48、数的最大值比本来小二,而加一的话下届又加一了,所以不会出现食物BUG了。这是最后一天调试出来了,很幸运。 5.2.3 总结 这次项目我真的学到了很多东西,很多功能我基本自己独立编写的,大大提高了我的C语言编写能力,并且我还学习了链表和文献储存。 其实有个小秘密就是,这个代码我们改了很久,分几个阶段。 1. 找到源代码时什么附加功能都没有,并且一个主函数包罗所有信息,很庞杂,于是我花了一个晚上把找的代码看懂并根据功能剥离出各个函数; 2. 当时对参数掌握的不是特别好,所以就把那几个结构体指针的变量所有定义为外部全局变量;在各分CPP里面用extern来说明;同时,策划并添

49、加我们自己设计的一些功能,如关卡,障碍物,吃“o”变短,成绩记录等。 3. 后来觉得全局变量影响了函数的独立性,所以我又一个个把函数根据功能重新设计接口,从而去掉了全局变量,感觉改的比较成功。 备注: 闪屏问题我们还没解决,我觉得只能通过图形界面来实现,我暑假会尽量自学图形界面,尽量实现。(完) 特别鸣谢老师一学期来的无私敬业! 二 项目代码 附原代码: 头文献:game.h #include "stdafx.h" #include #include #incl

50、ude #include #include #define boundary 15 #define N 10 struct Node { int x; /*蛇某一节的横坐标*/ int y; /*蛇某一节的纵坐标*/ struct Node *pre; /*蛇某一节的前驱结点*/ struct Node *next; /*蛇某一节的后继结点*/ }; /*蛇的某一节*/ struct Food

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服