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

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-2655707.html】到电脑端继续下载(重复下载不扣费)。

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

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(贪吃蛇软件设计.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

贪吃蛇软件设计.docx

1、贪吃蛇软件设计1课程设计的目的 12总体设计 23详细设计 33.1游戏开始模块 33.2初始化模块 73.3游戏运行模块 83.4游戏结束模块 114调试与测试 135 总结 14参考文献 151课程设计的目的贪吃蛇起源于西方,来自于夏娃和亚当偷吃禁果的神话。人们为了说明蛇的一个“贪”字,开始开 发贪吃蛇这个游戏。选择这个题目的一是:一直以来贪吃蛇这个小游戏就蛮 吸引人,游戏的实现对于我 们而言很神秘,希望运用所学的知识真真正正了解它的实质和精髓;二是更进一步的掌握C语言以及数 据结构的理论知识和实际应用,熟悉基本的游戏软件开发过程。在这个游戏中,环 境为密闭的围墙内,在围墙内随机出现一个食

2、物,通过按键 盘上四个光标键 控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计 10分,接着又岀现食物,等待被蛇吃掉。如果蛇在移动的过程中蛇撞到墙的任何一处游戏结束。游戏的关键在于蛇的移动和蛇吃了食物后的增长。游戏过程中,通过控制方向,蛇开始移动,通过从 蛇尾开始向前复制给蛇尾的前一节一直到蛇头复制给前一节然后清空蛇 尾实现对蛇的移动。蛇吃了食物 增长的过程,首先是判断是否吃到食物,吃到食物后蛇尾增加一节,从这一节开始复制给前一节,蛇运 动。食物的出现和消失,分数的增加,蛇尾都是定义数组的方式,通过调用各个模块函数实现整个游戏 的过程。功能需求:1.初

3、始化:通过init()函数实现。2.画面颜色:通过color()函数实现。3.蛇运动:通过Move()函数和memcpy()函数实现。4.判断蛇岀界:通过Block()函数实现。5.吃食物:通过Eat()函数实现。6.蛇身变长:通过Draw()函数实现7.运行界面设置:通过Manual()函数实现。8.历史最高分设置:通过File_in()函数取记录分数。9.是否闯关成功设置:通过File_out()函数存取的数据实现。10.释放空间设置:通过Free ()函数实现。11.按键停止设置:通过kbhit()函数实现。12.结束游戏:通过exit()函数实现。2总体设计整体框图如下:二将此系统化分

4、为如下模块:旃戏开女台:首先从main ()函数开始运行,调用各个函数。2初始化设置模块:用init ()函数实现,初始化程序和设置游戏的一些前期准备。1墙面设计:通过if语句。2定位蛇身:通过定义Snake数组。3画出食物:通过定义apple数组。3.游戏运行的具体过程:1蛇移动:通过调用DrawO函数实现。2吃食物:通过调用Eat ()函数实现。3蛇身变长:通过定义蛇尾ta叩数组实现。4判断死亡:通过调用Block ()函数判断是否出界。4游戏结束:调用Manual()函数,实现运行界面设置。1分数显示:通过定义score数组记录分数。2历史最高分:通过调用Filen()函数取File_o

5、ut()函数存取的记录分数。3文字说明:通过调用Manual()函数设置运行界面来显示。3详细设计3.1游戏开始模块主函数main()主函数是程序的主流程,首先定义使用得到的常量、全局变量及函数类型说明,然后初始图形系统。 int main(void)(int len;/ 定义蛇长charch = ; 定义字符char aN+2N+2 = 0;/ char 定义初始的分数为 0*snake;/ 定义蛇头 随机数发生器的初始化函数(使用系统函数指向空指针)srand(unsigned)time(NULL);/ color(11);/ 调用颜色函数为淡青()函数开始初始化,返回值为显示分数数组a,

6、蛇的地址和蛇身地址 调用函数游戏运行界面开始启动 按ESC结束V调用蛇运动函数,返回值为蛇头和蛇身 如果apple2返回值为0,则食物被吃掉appleO= rand()%N + 1;File_in();/调用函数记录分数init(a, &snake, &len);/initManual(); /while (ch != 0x1 B) /*Draw(snake, len);if (!apple2)/apple1 = rand()%N + 1; /apple2 = 1; /Sleep(200-score3*10); /即随机产生食物的横坐标即随机产生食物的纵坐标即食物未被吃掉速度设置固定值清空内存

7、缓冲区判断是否按键setbuf(stdin, NULL);/ if (kbhit()/光标移到此坐标上你输了 ”);输出文字“你输了”调用存分数的函数,输出 得分 释放存储蛇与蛇长的内存空间输出按键的字母 退出主 函数gotoxy(0, N+2);/ ch = getche();/ snake = Move(snake, ch, &len); / if(Block(snake0)=1) /gotoxy(N+2, N+2);/puts( File_out();/Free(snake, len);/getche();/ exit(O); /移向屏幕此处坐标输出所按的字母调用蛇运动函数,返回值为数组

8、蛇,字符g,蛇长的地址 如果数组Snake0赋1值则蛇撞墙对应流程图如下:开始输出坐标gotoxy )函数void gotoxy(int x, int y) / 函数名为gotoxy ,返回值为整形变量x,y一个字符在控制屏幕上的坐标分别将屏幕上的横、纵坐标赋给x, yCOORD pos; / pos.X =x; / pos.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); 使光标到(x, y)这个位置的函数颜色color ()函数颜色函数*/void color(int b) /*HANDLE hCons

9、ole = GetStdHandle(STD_OUTPUT_HANDLE) ;/ 屏幕输 岀SetConsoleTextAttribute(hConsole,b) ; / 背景色void Manual() /*运行界面设置7(gotoxy(N+30,2);光标移向此处color(10); /”按WS AD移动方向,n,按space键暂停”颜色设置为淡绿色 printf(M按WS AD移动方向”);gotoxy(N+30,4);printf(H 按 space 键暂停”);gotoxy(N+30,8);color(11);/n 历史最高分为:”你现在得分为:0”颜色设置为淡青色printf(M历

10、史最高分为:”);color(12);gotoxy(N+44,8);printf(n%dn,score1*10);/ 最高分的分数颜色设置为红色color(11);gotoxy(N+30,12);printf(M你现在得分为:0”);3.2初始化模块初始化函数init ()void init(char plateN+2N+2, char *snake_x, int *len) /*int i, j;char *snake = NULL;/ 蛇头赋空len = 3; / 蛇身起始长度为3score0 = score3 =3; / 分数起始为 3snake = (char *)realloc(sn

11、ake, sizeof(char *) * (Jen);/初始化程序,给一些初始值赋上值*/为 snake动态分配一个二维的字符数组for (i = 0; i *len; +i) snakei = (char *)malloc(sizeof(char) * 2);/ 为蛇分配内存for (i = 0; i 3; +i) /snakei0 = N/2 + 1;/snakei1 = N/2 + 1 + i; 蛇头开始出现的位(固定值)设置蛇的起始位置在墙内的中心坐标for (i = 1; i = N; +i) / for (j = 1; j = N; +j) plateij = 1;/ apple

12、0= rand()%N + 1;/ apple1 = rand()%N + 1; apple2 = 1;for (i = 0; i N + 2; +i) / 苹果开始随机出现在墙内的位置gotoxy(0, i);for (j = 0;jvN + 2;+j)定义墙内的坐标数组随机出现食物蛇运动内的21 X21墙设置成淡蓝色的框switch (plateij) /判断是否为墙内的数组坐标case 0: color(12);printf(” ”);/ color(11); continue;不是,则设置墙的边界为红色的空框case 1:printf (” ”); conti nue;是,设置墙的内部

13、为淡青的实框default: ; putchar(*n);for (i = 0; i (*le n); +i) 循环,蛇头开始的每一节都打印成gotoxy(snakei1 * 2, snakei0);/组prin tf(” ”);打印蛇身为putcharfn);*snake_x = snake;光标移向蛇的坐标数3.3游戏运行模块判断出界函数Block 0int Block(char head2) /蛇头出界则死亡,游戏结束if (head0 N) | (head1 N)/蛇头数组head0为蛇头横坐标,head1为纵坐标,1, N分别为墙边界 如果蛇头超出墙四边界 任何一处,则蛇停止运动,打

14、印分数和文字说明return 1:return 0;)二.蛇吃食物函数Eat ()int Eat(char snake2) /*吃了食物*/if (snake0 = apple0)&(snake1 = apple1)/snake0、nake1分别表示蛇头的横纵坐标,applefO apple1分别表示食物的横纵坐标。如果分别相等,则蛇吃到食物。三蛇移动函数Draw0void Draw(char *snake, int len) /返回值为蛇头指针,蛇长产生食物7gotoxy(apple1 * 2, applefO);/*color( 12);/ 食物颜色为红色printf (” ”);colo

15、r(11);/ 其他区域为淡青色gotoxy(tail1 * 2, tailO);/ 蛇尾坐标 *2 ,蛇尾变成两个 if (tail2) /蛇尾如果变长后tail2等于1 color(14);/ 蛇身颜色设置为黄色printf(n ”);/则输出一节蛇color(11);/其他区域为淡青色elseprintf(” ”);否则输出背景框图,蛇移动gotoxy(snake01 * 2, snake00);color(14);printf(H ”);color(11); putchar(n);)四.控制蛇运动函数Move()char* Move(char *snake, char dirx, in

16、t *len) /函数返回值为蛇头指针,方向,蛇的长度淀义变量i和fu归蛇吃到食物memcpy(tail, snakeClen)1, 2);/该函数的功能为把蛇运动过程 的蛇尾前一节复制到蛇尾实现蛇身的运动过程循环,将蛇身的每一节都复制给蛇在运动蛇整体向上移动蛇整体向下移动蛇整体向左移动蛇整体向右移动for (i = (*len)-1;i0;-i)/前一节memcpy(snakei, snakei2);/ switch (dirx) /控制蛇运动的方向case W: case *W: -snake00; break;/case s: case S: +snake00; break;/case

17、a: case TV: -snake01; break;/cased: case D: +snake01; break;/default:; if (full) / 蛇吃到食物后snake = (char *)realloc(snake, sizeof(char *) * (*len) + 1);为snake动态分配一个二维的字符数组,存储增加的蛇长snake(*len) = (char *)malloc(sizeof(char) * 2); memcpy(snakeflen), tail, 2);+(*len);/蛇身的长度加1 +score0; 分数也加10 if(score3 score

18、0) / 历史最高分大于此关得分,则输出”闯关失败加油耶” gotoxy(10,10);color(12);puts(”闯关失败加油耶”);gotoxy(0,N+2);return 0;if(fp = fopen(”C:tcs.txt”,”w+”)= NULL)printf(H 文件不能打开 nn); exit(O);if(fputc(-score0,fp)=EOF) printf(输出失败 nH);gotoxy(10,10);color(12);puts恭喜您打破记录”);/历史最高分小于此关得分,则输岀”恭喜您打破记录” gotoxy(0,N+2);return 0;.释放snake存储空

19、间函数Free 0void Free(char *snake, int len) / 释放空间,返回值为蛇头指针,蛇长inti;for (i = 0; i len; +i) free(snakei);free(s nake);4调试与测试1 游戏开始,运行界血启动,显示墙血,蛇头,随机出现的食物以及周禺的文字说明。技W S A D移动方向按py镇暂停历史最高分为:你现在得分为,02蛇初始有三节,蛇在运动的过程中吃第一个食物变成四节,分数变为30分,以后每 次吃一个食物加十 !按 space 键暂停LPress any key Co cont inue 了5总结(1)课程设计中遇到的主要问题和解

20、决方法;现在得分坐标输入错误,改动程序语句 gotoxy(N+44,12);prin tf(H%dn,score0*10);历史最高分为二90历史最高分为二9(2)创新和特色之处;设计中存在的不足,需进一步改进的设想 特色:这个贪吃蛇的设计中,运用了 color()函数对整个游戏的界面进行了美化使各个区域 看起来也更加清晰明 To也运用了 FileJ n()和File_out()对历史的分数进行了记录和调用,增加了一个与历史最高分比较的功 能。不足:在这个程序并没有涉及到对速度的选择。参考文献1谭浩强C语言程序设计(第四版)北京:清华大学岀版社,2010.2严蔚敏,吴伟民数据结构(C语言版)M

21、北京:清华大学出版社,2007.3孙秀梅,曹飞飞C语言项目案例分析北京:清华大学出版社,2012.4曹计昌,卢萍C语言与程序设计北京:电子工业出版社,2008.5程海英数据结构(C语言版)北京:清华大学出版社,2014.附录代码清单#include #include #include #include #inelude #define N 21int apple3;char score3;char tail3;void gotoxy(int x, int y) / 输出坐标(COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(GetSt

22、dHandle(STD_OUTPUT_HANDLE), pos);void color(int b) / 颜色函数(HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsole,b);int Block(char head2) / 判断岀界(if (head0 N) | (head1 N) return 1;return 0;int Eat(char snake2) / 吃了苹果 0; -i) memcpy(snakei, snakei-1, 2); switch (dirx)case W:

23、 case W: -snake00; break;case s: case S: +snake00; break;case fa: case TV: -snake01; break;cased*: case D: +snake01; break; default:;if (full)snake = (char *)realloc(snake, sizeof(char *) * (*len) + 1); snake(*len) = (char*)malloc(sizeof(char) * 2);memcpy(snake(*len)3 tail, 2); +(*len);+scoreOJ; if(

24、score3 16)+score3;tail2 = 1;elsetail2 = 0;return snake;void init(char plateN+2N+2, char *snake_x, int *len) / 初始化(int i, j; char *snake = NULL;*len = 3; score0 = score3 =3;snake = (char *)realloc(snake, sizeof(char *) * (*len); for (i = 0; i *len; +i)snakei = (char *)malloc(sizeof(char) * 2);for (i = 0; i 3; +i) snakei0 = N/2 + 1; snakei1 = N/2 + 1 + i;for (i = 1; i = N; +i)for (ji;jv=N;+j) plateiU = 1 ;apple0 = rand()%N + 1; apple1 = rand()%N + 1; apple2 = 1;for (i = 0; i N + 2; +i) gotoxy(0, i);for (j = 0; j N + 2; +j)switch (plateij) ”);color );continue;case 0: color(12)

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2