




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、软件开发课程设计报告题目:贪吃蛇游戏设计院(系): 专业班级: 学生姓名: 学 号: 指导教师: 评 分:目录1课程设计的目的 12总体设计23详细设计33.1游戏开始模块 33.2初始化模块 73.3游戏运行模块 83.4游戏结束模块 114 调试与测试 135 总结14参考文献 15#1 课程设计的目的贪吃蛇起源于西方, 来自于夏娃和亚当偷吃禁果的神话。 人们为了说明蛇的一个 “贪” 字,开始开发贪吃蛇这个游戏。选择这个题目的一是:一直以来贪吃蛇这个小游戏就蛮 吸引人,游戏的实现对于我们而言很神秘,希望运用所学的知识真真正正了解它的实质 和精髓;二是更进一步的掌握 C语言以及数据结构的理论
2、知识和实际应用,熟悉基本的 游戏软件开发过程。在这个游戏中,环 境为密闭的 围墙内, 在围墙内 随机 出现 一个食物,通过按键 盘上四个光标键控制蛇向上下左右四个方向移动, 蛇头撞到食物,则表示食物被蛇吃掉, 这时蛇的身体长一节,同时计 10 分,接着又出现食物,等待被蛇吃掉。如果蛇在移动 的过程中蛇撞到墙的任何一处游戏结束。游戏的关键在于蛇的移动和蛇吃了食物后的增长。游戏过程中,通过控制方向,蛇开 始移动,通过从蛇尾开始向前复制给蛇尾的前一节一直到蛇头复制给前一节然后清空蛇 尾实现对蛇的移动。蛇吃了食物增长的过程,首先是判断是否吃到食物,吃到食物后蛇 尾增加一节,从这一节开始复制给前一节,蛇
3、运动。食物的出现和消失,分数的增加, 蛇尾都是定义数组的方式,通过调用各个模块函数实现整个游戏的过程。功能需求:1. 初始化:通过 init() 函数实现。2. 画面颜色:通过 color() 函数实现。3. 蛇运动:通过Move()函数和memcpy()函数实现。4. 判断蛇出界:通过 Block() 函数实现。5. 吃食物:通过 Eat() 函数实现。6. 蛇身变长:通过 Draw() 函数实现7. 运行界面设置:通过 Manual() 函数实现。8. 历史最高分设置:通过 File_in() 函数取记录分数。9. 是否闯关成功设置:通过 File_out() 函数存取的数据实现。10.
4、释放空间设置:通过 Free ()函数实现。11. 按键停止设置:通过 kbhit() 函数实现。12. 结束游戏:通过 exit() 函数实现。2总体设计.整体框图如下:二.将此系统化分为如下模块:1. 游戏开始:首先从main ()函数开始运行,调用各个函数。2. 初始化设置模块:用init ()函数实现,初始化程序和设置游戏的一些前期准 备。 墙面设计:通过if语句。 定位蛇身:通过定义Snake数组。 画出食物:通过定义apple数组。3. 游戏运行的具体过程: 蛇移动:通过调用Draw()函数实现。 吃食物:通过调用Eat ()函数实现。 蛇身变长:通过定义蛇尾tail 数组实现。
5、判断死亡:通过调用Block ()函数判断是否出界。4. 游戏结束:调用Manual()函数,实现运行界面设置。 分数显示:通过定义score数组记录分数。 历史最高分:通过调用Filen()函数取File_out()函数存取的记录分数。 文字说明:通过调用Manual()函数设置运行界面来显示。3 详细设计3.1 游戏开始模块主函数 main()主函数是程序的主流程,首先定义使用得到的常量、全局变量及函数类型说明,然后 初始图形系统。 int main(void)定义蛇长定义字符char ch = g;/char aN+2N+2 = 0;/ char *snake;/定义蛇头srand(un
6、signed)time(NULL);/定义初始的分数为 0int len; /随机数发生器的初始化函数 (使用系统函数 指向空指针 )color(11);/调用颜色函数为淡青File_in(); /调用函数记录分数init(a, &snake, &len);/init()函数开始初始化,返回值为显示分数数组Manual(); /while (ch != 0x1B) /*Draw(snake, len);/if (!apple2) /a ,蛇的地址和蛇身地址 调用函数游戏运行界面开始启动 按 ESC 结束 */调用蛇运动函数,返回值为蛇头和蛇身如果 apple2 返回值为 0,则食物被吃掉3ap
7、ple0 = rand()%N + 1; /apple1 = rand()%N + 1; / apple2 = 1; /Sleep(200-score3*10); /即随机产生食物的横坐标即随机产生食物的纵坐标即食物未被吃掉速度设置固定值 setbuf(stdin, NULL);/if (kbhit()/gotoxy(0, N+2);/ ch = getche();/清空内存缓冲区判断是否按键snake = Move(snake, ch, &len); / if (Block(snake0)=1) /移向屏幕此处坐标输出所按的字母调用蛇运动函数,返回值为数 组蛇,字符 g, 蛇长的地址 如果数
8、组 Snake0 赋 1 值则蛇撞墙23gotoxy(N+2, N+2);/ puts( File_out();/ Free(snake, len);/ getche();/ exit(0); /光标移到此坐标上你输了 );/ 输出文字“你输了” 调用存分数的函数,输出得分 释放存储蛇与蛇长的内存空间 输出按键的字母 退出主函数对应流程图如下:输出坐标 gotoxy)函数void gotoxy(int x, int y) / COORD pos; / pos.X = x; / pos.Y = y;函数名为 gotoxy ,返回值为整形变量 x,y一个字符在控制屏幕上的坐标分别将屏幕上的横、纵坐
9、标赋给 x,ySetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);/ 使光标 到(x, y)这个位置的函数颜色 color ()函数void color(int b) /*颜色函数 */HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE) ;/ 屏幕输 出SetConsoleTextAttribute(hConsole,b) ; /背景色四界面设置函数 Manual()void Manual() /* 运行界面设置 */gotoxy(N+30,2);/ 光标移向此处color(
10、10); / 按 W S A D 移动方向 按 space 键暂停 颜色设置为淡绿色printf( 按 W S A D 移动方向 );gotoxy(N+30,4);printf( 按 space 键暂停 );gotoxy(N+30,8);color(11); /历史最高分为 : 你现在得分为 : 0 颜色设置为淡青色printf( 历史最高分为 : );color(12);gotoxy(N+44,8);printf(%d,score1*10);/最高分的分数颜色设置为红色color(11);gotoxy(N+30,12);printf( 你现在得分为 : 0);3.2 初始化模块初始化函数 i
11、nit ()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(snake, sizeof(char *) * (*len);/为 snake动态分配一个二维的字符数 组for (i = 0; i *len; +i) snakei = (char *)malloc(sizeof(char) *
12、 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;/ apple0 = rand()%N + 1;/ apple1 = rand()%N + 1; apple2 = 1;for (i = 0; i N + 2; +i) / 蛇头开始出现的位置(固定值)设置蛇的起始位置在墙内的中心坐标苹果开始随机出现在墙内的位置定义墙内的坐标数组随机出现食物蛇运动内的21 X21墙设置成淡蓝色的框
13、gotoxy(0, i);for (j = 0; j N + 2; +j) switch (plateij) /判断是否为墙内的数组坐标case 0:color(12);printf( );/ color(11); continue;不是,则设置墙的边界为红色的空框case 1:printf();/continue;是,设置墙的内部为淡青的实框default: ; putchar(n);for (i = 0; i (*le n); +i)循环,蛇头开始的每一节都打印成gotoxy(snakei1 * 2, snakei0);/光标移向蛇的坐标数组prin tf();/ 打印蛇身为putchar
14、(n);*snake_x = snake;3.3 游戏运行模块一判断出界函数 Block ()int Block(char head2) / 蛇头出界则死亡,游戏结束if (head0 N) | (head1 N) / 蛇头数组 head0 为蛇头横坐标, head1 为纵坐标, 1,N 分别为墙边界 如果蛇头超出墙四边界任何一处,则蛇停止运动,打印分数和文字说明 return 1;return 0;二蛇吃食物函数 Eat ()int Eat(char snake2) /*吃了食物 */if (snake0 = apple0)&(snake1 = apple1)/snake0 、nake1 分
15、别表示蛇头的横纵坐标,apple0 apple1 分别表示食物的横纵坐标。 如果分别相等,则蛇吃到食物。apple0 = apple1 = apple2 = 0;/食物数组赋给 0,则食物消失 gotoxy(N+44,10);color(13);printf(%d,score0*10); /加十分打印分数color(11);/ 设置分数为淡青色return 1;/ 吃了食物返回 1return 0;三. 蛇移动函数 Draw()void Draw(char *snake, int len) / 返回值为蛇头指针,蛇长if (apple2)/如果返回值为 1,则食物被吃掉gotoxy(apple
16、1 * 2, apple0);/*产生食物 */color(12);/食物颜色为红色printf( );color(11);/其他区域为淡青色蛇尾坐标 *2 ,蛇尾变成两个gotoxy(tail1 * 2, tail0);/if (tail2) / 蛇尾如果变长后 tail2 等于 1 color(14);/蛇身颜色设置为黄色printf( );/ 则输出一节蛇color(11);/ 其他区域为淡青色elseprintf( );/ 否则输出背景框图,蛇移动gotoxy(snake01 * 2, snake00);color(14);printf( );color(11); putchar(n)
17、;四 控制蛇运动函数 Move()char* Move(char *snake, char dirx, int *len) / 函数返回值为蛇头指针, 方向,蛇的长度 定义变量 i 和 full= 蛇吃到食物 memcpy(tail, snake(*len)-1, 2);/该函数的功能为把蛇运动过程的蛇尾前一节复制到蛇尾实现蛇身的运动过程循环,将蛇身的每一节都复制给蛇在运动蛇整体向上移动 蛇整体向下移动 蛇整体向左移动 蛇整体向右移动for (i = (*len) - 1; i 0; -i) /前一节memcpy(snakei, snakei-1, 2);/ switch (dirx) / 控
18、制蛇运动的方向 case w: case W: -snake00; break;/case s: case S: +snake00; break;/case a: case A: -snake01; break;/case d: case D: +snake01; break;/ default: ; if (full) / 蛇吃到食物后snake = (char *)realloc(snake, sizeof(char *) * (*len) + 1);/ 为 snake 动态分配一个二维的字符数组,存储增加的蛇长 snake(*len) = (char *)malloc(sizeof(ch
19、ar) * 2); memcpy(snake(*len), tail, 2);+(*len);/ 蛇身的长度加 1 +score0;/分数也加 10if(score3 score0) /历史最高分大于此关得分,则输出 闯关失败 加油耶 gotoxy(10,10);color(12);puts( 闯关失败 加油耶 );gotoxy(0,N+2);return 0;if(fp = fopen(C:tcs.txt,w+) = NULL)printf( 文件不能打开 n); exit(0);if(fputc(-score0,fp)=EOF) printf( 输出失败 n);gotoxy(10,10);
20、color(12);puts( 恭喜您打破记录 ); / 历史最高分小于此关得分, 则输出 恭喜您打破记录 gotoxy(0,N+2);return 0;二释放 snake 存储空间函数 Free ()void Free(char *snake, int len) /释放空间,返回值为蛇头指针,蛇长int i;for (i = 0; i len; +i) free(snakei);free(snake);4调试与测试2.蛇初始有三节,蛇在运动的过程中吃第一个食物变成四节,分数变为 30分,以后每 次吃一个食物加十分。蛇在运动过程中撞墙而亡,历史最高分为 110,当前为30分,故 输出“闯关失败
21、加油耶”。3.蛇在运动过程中撞墙而亡。历史最高分为 60分,当前分数为90分,故输出“恭喜你打破记录” :w S fl D 移动方向 ! 按 space 键暂停 历史最高井为:60 祢现枉得分为:0_ “ILPress any key Co cont inue 了5总结(1) 课程设计中遇到的主要问题和解决方法;现在得分坐标输入错误,改动程序语句gotoxy(N+44,12);prin tf(%d,score0*10);历史最高分为二9040你现在得分为:0历史最高分为=90你现在得分为:锄(2) 创新和特色之处;设计中存在的不足,需进一步改进的设想特色:这个贪吃蛇的设计中,运用了 color
22、()函数对整个游戏的界面进行了美化使各个区域 看起来也更加清晰明了。也运用了 Filen()和File_out()对历史的分数进行了记录和 调用,增加了一个与历史最高分比较的功能。不足:在这个程序并没有涉及到对速度的选择。参考文献1 谭浩强.C语言程序设计(第四版)北京:清华大学出版社,2010.2 严蔚敏,吴伟民.数据结构(C语言版)M.北京:清华大学出版社,2007.3 孙秀梅,曹飞飞.C语言项目案例分析.北京:清华大学出版社,2012.4 曹计昌,卢萍.C语言与程序设计.北京:电子工业出版社,2008. 程海英.数据结构(C语言版).北京:清华大学出版社,2014.附录 代码清单#inc
23、lude #include #include #include #include #define N 21int apple3;char score3;char tail3;void gotoxy(int x, int y) / 输出坐标COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); void color(int b) / 颜色函数HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE) ;SetConsoleTe
24、xtAttribute(hConsole,b) ;int Block(char head2) / 判断出界if (head0 N) | (head1 N) return 1;return 0;int Eat(char snake2) / 吃了苹果 if (snake0 = apple0) & (snake1 = apple1) apple0 = apple1 = apple2 = 0; gotoxy(N+44,10);color(13); printf(%d,score0*10);color(11);return 1;return 0;void Draw(char *snake, int le
25、n) / 蛇移动if (apple2) gotoxy(apple1 * 2, apple0); color(12);printf( );color(11);gotoxy(tail1 * 2, tail0);if (tail2) color(14);printf( );color(11);elseprintf( );gotoxy(snake01 * 2, snake00);color(14);printf( );color(11);putchar(n);char* Move(char *snake, char dirx, int *len) /控制方向int i, full = Eat(snak
26、e0); memcpy(tail, snake(*len)-1, 2);for (i = (*len) - 1; i 0; -i) memcpy(snakei, snakei-1, 2);switch (dirx)case w: case W: -snake00; break;case s: case S: +snake00; break;case a: case A: -snake01; break;case d: case D: +snake01; break; default: ;if (full)snake = (char *)realloc(snake, sizeof(char *)
27、 * (*len) + 1); snake(*len) = (char *)malloc(sizeof(char) * 2);memcpy(snake(*len), tail, 2); +(*len);+score0; if(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 *)
28、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 (j = 1; j = N; +j) plateij = 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)continue;case 0: color(12);printf( );color(11);case 1: printf( ); continue;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 驾照c1科目考试试题及答案
- 2025年广东省法检系统司法辅助人员招聘考试(综合知识)能力提高训练题及答案
- 2025年病历管理制度试题与答案
- 模型参数优化-第1篇-洞察与解读
- 出资协议条款及形式
- 2025年山西事业单位招聘考试综合类专业能力测试试卷(工程类)真题模拟解析
- 2025年事业单位招聘考试综合类职业能力倾向测验真题模拟试卷(北京)
- 2025江苏镇江丹阳市卫生健康委员会所属丹阳市人民医院招聘工作人员22人模拟试卷完整答案详解
- 2025江西吉安市吉州区樟山镇中心幼儿园招聘1人模拟试卷及答案详解(历年真题)
- 黑龙江省考试科目及答案
- 2025年秋统编版一年级语文上册集体备课教案设计(第7单元)
- 房地产营销渠道策略指南
- 2025年湖南大学事业编制管理辅助岗位招聘58人笔试备考试题及答案解析
- 2025年国防教育知识考试题库及完整答案
- 2024新版离婚协议书模板合集
- 2026年宁波市镇海中学公开招聘事业编制教师46人笔试备考题库及答案解析
- GB 18664-2025呼吸防护装备的选择、使用和维护
- 2025年中国钛杯行业市场全景分析及前景机遇研判报告
- 室内设计方案施工流程
- 10KV电力设备维护技术标准手册
- 中医药膳制作流程与行业标准
评论
0/150
提交评论