




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
瞬间记忆力大考验一、课题内容和要求课题内容:根据游戏难度,随机产生一个4*4或4*5或6*6的二维数组,填入不同的符号,测试者通过输入坐标,指定记忆中相同的两个(或三个)符号的位置。正确,则显示符号对应图形,不正确则显示图形后随机关闭(显示时间为1秒)。记录完成猜测的时间并保留成绩,设置排行榜。要求:1. 图形组合的瞬间停留,利用菜单提供初级(4*4)、中级(4*5)、高级(6*6)的测试项目。高级中图形为每组3个,共12组图案。2. 定义用户的结构体,用于记录不同用户的密码、测试成绩,并进行排名。3提供相应用户密码的安全测试。1) 如果密码长度小于 6 位,则不安全 2) 如果组成密码的字符只有一类,则不安全 3) 如果组成密码的字符有两类,则为中度安全 4) 如果组成密码的字符有三类或以上,则为安全 5) 通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。4用户游戏信息以文件形式保存。二、需求分析【1】可操作的主菜单:输出主菜单,用于显示以选择游戏中不同的功能选项。根据玩家输入的选项来运行不同的功能,运行不同的函数。【2】查看游戏排行榜【3】清空游戏排行榜【4】注册游戏账号【5】用游戏账号登陆进行游戏【6】4*4,4*5,6*6的记忆游戏。可方便的升级到任意大小的记忆游戏。【7】查看自己所有的游戏记录(按时间顺序)【8】游戏中有倒计时功能【9】提示用户密码强度功能【10】输入密码是关闭回显 【11】保存所有信息到文件。程序关闭后,重新打开,信息不会丢失。三、概要设计本程序包含一个主体模块,另包括三个子模块,密码强度检验模块、游戏难度选择模块和菜单模块。游戏开始后,游戏者需先通过以上两个子模块分别设置密码和选择游戏难度,之后根据游戏者的选择进行不同难度游戏。游戏随机产生一个4*4或4*5或6*6的二维数组,相应地填入8对或10对或12对不同的符号,测试者通过输入坐标,指定记忆中相同的两个符号的位置。正确,则显示符号对应图形,不正确则显示图形后随机关闭(显示时间为1秒)。最后记录完成猜测的时间,并保留成绩到指定文件夹。密码强度检验模块输入密码a1密码种类记为aa2输出“安全”继续主模块输出“中等安全”输出“不安全,请重新输入”延时2秒YNNY开始游戏难度选择模块开始输出“难度选择初A中B高C“”用户选择xx=Ax=Bx=C输出6*6二维数组输出4*5二维数组输出4*4二维数组继续主模块YNNYY开始密码强度检验模块输入游戏者名称选择游戏难度模块显示所有符号开始计时延时5秒关闭所有符号输入相同两符号坐标判断指定是否正确停止计时Y显示所有符号延时1秒N输出游戏者名称,游戏时间(即成绩)保存成绩到文件夹OVER主程序设计框架流程图四、源程序代码(部分)#include #include #include #include #define TRUE 1#define FALSE 0 格式化时间函数 YYYY.MM.DD hh:mm:ss */char _format_time_40; char* getFormatTime(long t)strftime(_format_time_,sizeof(_format_time_)/sizeof(char),%Y.%m.%d %H:%M:%S,gmtime(&t); return _format_time_; / 字符最多分类种数 #define CHAR_MAX_TYPES 4/*判断字符分类函数 数字、大写字母、小写字母和其它符号为四类不同的字符。*/int getCharType(char ch)if(ch=0 & ch=a & ch=A & ch=Z)return 2;else return 3; / 密码分类等级名称 char PASSWORD_SECURITY_QUOTIETY_NAME10=不安全,中度安全,安全;int getPasswordSecurityQuotiety(char pass)/ 密码中字符种类 int charTypeNum = 0,isCharTypeExistedCHAR_MAX_TYPES=0;int i;if(strlen(pass)6)return 0;else/ 初始化 for(i=0;iCHAR_MAX_TYPES;i+)isCharTypeExistedi = FALSE;/ 统计字符种类 for(i=0;i= 3)return 2; / 输入密码是特别的回显字符 #define PASSWORD_SPECIAL_CHAR * / 输入密码函数,关闭回显 void inputPassword(char str)char ch;int i=0; fflush(stdin);while(ch=getch()!=r)/ 退格键 if(ch=8 & i0)printf(b b);i-;continue; stri+ = ch;printf(*);printf(n);stri+=0;/ 二维坐标 struct Pointint x,y; /*记忆图形结构体 */ 二维字符数组的最大尺寸 #define CHAR_ARRAY_MAX_SIZE 6/ 二维字符数组中一组字符的大小#define CHAR_ARRAY_MAX_GROUP_SIZE 3/ 可以存放到二维数组中的符号 char CHAR_ARRAY_AVAILABLE_SHOW_CHAR = 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,!,#,$,%,&,(,),-,_,+,=, ;/ 用来遮掩二维数组中的符号的特定符号 #define CHAR_ARRAY_SPECIAL_SHIELD_CHAR */ 用来表示二维数组中特定位置没有符号的特定符号 #define CHAR_ARRAY_SPECIAL_EMPTY_CHAR 0 / 要记忆的二维字符数组 struct CharArray/ 要记忆的二维字符数组 char arrayCHAR_ARRAY_MAX_SIZECHAR_ARRAY_MAX_SIZE;/ 图形是否被关闭标记int isShieldCHAR_ARRAY_MAX_SIZECHAR_ARRAY_MAX_SIZE; / 要记忆的二维字符数组的高int height;/ 要记忆的二维字符数组的宽int width;/ 要记忆的二维字符数组的每组字符数 int groupSize;/ 初始化 void initCharArray(struct CharArray* charArray,int h,int w,int s);/ 打开全部图形void setCharArrayAllShow(struct CharArray* charArray);/ 关闭全部图形void setCharArrayAllShield(struct CharArray* charArray);/ 指定位置的图形的状态 void setCharArrayState(struct CharArray* charArray,int state,struct Point points,int n);/ 判断二维数组中是不是全部图形都可见int isCharArrayAllShow(struct CharArray* charArray);/ 判断指定的一组位置上的图形是否相同 int isCharArraySameCharAtPoints(struct CharArray* charArray,struct Point points,int n);/ 在屏幕显示二维字符数组void showCharArray(struct CharArray* charArray,int showTime); / 初始化 void initCharArray(struct CharArray* charArray,int h,int w,int s) int i,j,k; int isFind; char ch; int x,y; charArray-height = h; charArray-width = w; charArray-groupSize = s; srand(time(NULL); memset(charArray-array,CHAR_ARRAY_SPECIAL_EMPTY_CHAR,sizeof(charArray-array); for(k=0;kheight*charArray-width/charArray-groupSize;k+) / 随机产生一个字符 doch = CHAR_ARRAY_AVAILABLE_SHOW_CHARrand()%sizeof(CHAR_ARRAY_AVAILABLE_SHOW_CHAR);isFind = FALSE;for(i=0;iheight&!isFind;i+)for(j=0;jwidth&!isFind;j+)if(charArray-arrayij = ch)isFind = TRUE; while(isFind = TRUE);for(i=0;igroupSize;i+)/ 随机产生一个坐标 dox = rand()%charArray-width;y = rand()%charArray-height;while(charArray-arrayyx != CHAR_ARRAY_SPECIAL_EMPTY_CHAR);/ 填入字符 charArray-arrayyx=ch; / 关闭全部图形 setCharArrayAllShield(charArray);/ 打开全部图形void setCharArrayAllShow(struct CharArray* charArray)int i,j;for(i=0;iheight;i+)for(j=0;jwidth;j+)charArray-isShieldij = FALSE; / 关闭全部图形void setCharArrayAllShield(struct CharArray* charArray)int i,j;for(i=0;iheight;i+)for(j=0;jwidth;j+)charArray-isShieldij = TRUE; / 判断指定的一组位置上的图形是否相同 int isCharArraySameCharAtPoints(struct CharArray* charArray,struct Point points,int n)int i,j;char ch = charArray-arraypoints0.ypoints0.x; / 判读点是否重合for(i=0;in;i+)for(j=i+1;jn;j+)if(pointsi.x = pointsj.x & pointsi.y = pointsj.y) return FALSE;/ 判读点所在图形是否相同 for(i=1;iarraypointsi.ypointsi.x != ch)return FALSE;return TRUE;/ 判断二维数组中是不是全部图形都可见int isCharArrayAllShow(struct CharArray* charArray)int i,j;for(i=0;iheight;i+)for(j=0;jwidth;j+)if(charArray-isShieldij = TRUE)return FALSE; return TRUE; / 在屏幕显示二维字符数组void showCharArray(struct CharArray* charArray,int showTime)int i,j;time_t startTime , currentTime ,tempTime;/ 清屏 system(cls);printf(*n); printf(*记忆图形n);printf(*n); for(i=0;iheight;i+)for(j=0;jwidth;j+)if(charArray-isShieldij)printf(%c ,CHAR_ARRAY_SPECIAL_SHIELD_CHAR);elseprintf(%c ,charArray-arrayij);printf(n); printf(*n); startTime = time(NULL); tempTime = startTime;currentTime = startTime;while(currentTime - startTime charArray);showCharArray(&game-charArray,GAME_MAX_CHAR_ARRAY_FIRST_SHOW_TIME);/ 遮蔽二维数组图形 setCharArrayAllShield(&game-charArray);showCharArray(&game-charArray,0);/ 没有达到猜的次数的上限,继续 while(game-guessPointsTime GAME_MAX_GUESS_TIME)/ 让玩家指定相同字符所在的坐标for(i=0;icharArray.groupSize;i+)/ 输入行坐标 y doprintf(*输入相同图形所在的第 %d 个行坐标,范围1,%d:,i+1,game-charArray.height);scanf(%d,&game-guessPointsgame-guessPointsTimei.y);/ 用户输入的坐标是从 1 开始的,程序中的坐标是从 0 开始的,要修正 game-guessPointsgame-guessPointsTimei.y-;while(game-guessPointsgame-guessPointsTimei.y guessPointsgame-guessPointsTimei.y = game-charArray.height); / 输入列坐标 xdoprintf(*输入相同图形所在的第 %d 个列坐标,范围1,%d:,i+1,game-charArray.width);scanf(%d,&game-guessPointsgame-guessPointsTimei.x); / 用户输入的坐标是从 1 开始的,程序中的坐标是从 0 开始的,要修正 game-guessPointsgame-guessPointsTimei.x-;while(game-guessPointsgame-guessPointsTimei.y guessPointsgame-guessPointsTimei.y = game-charArray.width);printf(n);/ 显示玩家指定位置的二维数组图形setCharArrayState(&game-charArray,FALSE,game-guessPointsgame-guessPointsTime,game-charArray.groupSize);showCharArray(&game-charArray,0); / 判断指定位置的图形是否相同if(isCharArraySameCharAtPoints(&game-charArray,game-guessPointsgame-guessPointsTime,game-charArray.groupSize)/ 记录玩家本次猜字符成功 game-guessPointsResultgame-guessPointsTime = TRUE; else/ 记录玩家本次猜字符失败 game-guessPointsResultgame-guessPointsTime = FALSE;/ 显示一会玩家【指定错误】的字符组 showCharArray(&game-charArray,GAME_MAX_CHAR_ARRAY_SHOW_TIME); / 重新遮盖字符玩家【指定错误】的字符组 setCharArrayState(&game-charArray,TRUE,game-guessPointsgame-guessPointsTime,game-charArray.groupSize);showCharArray(&game-charArray,0); game-guessPointsTime +;/ 玩家已经猜出了全部图形,结束本轮游戏 if(isCharArrayAllShow(&game-charArray)game-endTime = time(NULL);game-isSuccessed = TRUE;printf(*恭喜!您猜出了所有的图形!);break; / 全局变量:瞬间记忆游戏链表 struct Game* _games = NULL;/*游戏相关操作 */ 添加一场新的游戏 void addNewGame(struct Game *newGame)struct Game *p; if(_games = NULL)_games = (struct Game*)malloc(sizeof(struct Game);*_games = *newGame;_games-next = NULL;elsep = (struct Game*)malloc(sizeof(struct Game);*p = *newGame;p-next = _games;_games = p;/ 初始化 瞬间记忆游戏链表 从文件数据 void initGames()/ 注意要是 rb 方式打开文件 FILE * gameFile = fopen(GAME_DATA_FILE_NAME,rb);struct Game *p,tempGame;int i;if(gameFile)while(fread(&tempGame,sizeof(struct Game),1,gameFile) != 0)addNewGame(&tempGame); fclose(gameFile);/ 保存 瞬间记忆游戏链表 到文件 void saveGames()/ 注意要用 wb 方式打开文件 FILE * gameFile = fopen(GAME_DATA_FILE_NAME,wb);struct Game *p;int i;if(gameFile)p = _games;while(p)fwrite(p,sizeof(struct Game),1,gameFile);p = p-next;fclose(gameFile);/*菜单界面 */ 瞬间记忆游戏主菜单 int printMainMenu()char strChoice100;int intChoice;system(cls);doprintf(n*n);printf(*主菜单n);printf(*n);printf(*n); printf(*1)查看排行榜n);printf(*2)清除排行榜n); printf(*3)登录账号开始游戏n);printf(*4)申请账号开始游戏n);printf(*5)退出游戏n);printf(*n);scanf(%s,strChoice);intChoice = atoi(strChoice);if(intChoice5)printf(*命令错误!请重新输入命令!);while(intChoice5);return intChoice;/ 瞬间记忆游戏主菜单 int printGameMenu()char strChoice100;int intChoice;system(cls);doprintf(n*n);printf(*瞬间记忆游戏菜单n);printf(*n); printf(*您好:%sn,_loginP);printf(*n);printf(*1)初级(4*4)n);printf(*2)中级(4*5)n); printf(*3)高级(6*6)n);printf(*4)查看游戏记录n);printf(*5)返回n);printf(*n);scanf(%s,strChoice);intChoice = atoi(strChoice);if(intChoice5)printf(*命令错误!请重新输入命令!);while(intChoice5);return intChoice;void play()struct Game newGame, *p;char strChoice100;int intChoice;int guessPrice;while(1)switch (printGameMenu()/ 初级(4*4)case 1:initGame(&newGame,_loginP,4,4,2);startGame(&newGame);addNewGame(&newGame);break; / 中级(4*5)case 2:initGame(&newGame,_loginP,4,5,2);startGame(&newGame);addNewGame(&newGame);break; / 高级(6*6)case 3:initGame(&newGame,_loginP,6,6,3);startGame(&newGame);addNewGame(&newGame);break; / 查看游戏记录case 4:printPlayerRecord();break; / 返回case 5:/ 返回之前注销登录的账号 strcpy(_loginP,);strcpy(_loginPlayer.pass,);return; / 按任意键继续fflush(stdin);printf(nn按任意键继续n); getchar(); int main(int argc, char *argv)startNewGame();getch();return 0;五、测试数据及其结果分析*主菜单*1)查看排行榜*2)清除排行榜*3)登录账号开始游戏*4)申请账号开始游戏*5)退出游戏*4*注册菜单*输入要注册的用户名称:k*输入要注册的用户密码:*你输入的密码的安全系数:安全*注册成功!*按任意键继续*瞬间记忆游戏菜单*您好:k*1)初级(4*4)*2)中级(4*5)*3)高级(6*6)*4)查看游戏记录*5)返回*1*记忆图形*e 8 5 vc 8 e 5 c vA X A X*开始记忆.剩余 7秒*记忆图形* * * * * * * * * * * * *输入相同图形所在的第 1 个行坐标,范围1,4:1*输入相同图形所在的第 1 个列坐标,范围1,4:1*输入相同图形所在的第 2 个行坐标,范围1,4:2*输入相同图形所在的第 2 个列坐标,范围1,4:3。*记忆图形*e 8 5 vc 8 e 5 c vA X A X*恭喜您猜出了所有的图形!按任意键继续*主菜单*1)查看排行榜*2)清除排行榜*3)登录账号开始游戏*4)申请账号开始游戏*5)退出游戏*1*玩家排名*排名: 1 用户:k 用了 82秒 开始时间:2011.09.08 04:36:46 结束时间:2011.09.08 04:38:08*排名: 2 用户:q 用了 138秒 开始时间:2011.09.08 05:05:18 结束时间:2011.09.08 05:07:36*六、调试过程中的问题(1)菜单界面问题:开始时,整个程序只有极其简单的三个选择项,游戏进行时提示不足,游戏者稍有操作错误的地方就很容易陷入不知所措的地步,后在学长的帮助下完善了菜单选项,并作了进一步美化,使程序简单明了,易操作。(2)密码回显字符:在自定义的void inputPassword(char str )中,用到了fflash(stdin)函数,它的作用是清空输入缓冲区。在c语言中,使用scanf()函数在键盘上接受字符型数据时,必须用fflush(stdin)这个来清除上一次存储的数据,不然字符型数据不会正确的存储。(3)伴随游戏的时间函数:起初,做游戏记录时,虽能记录是否完成游戏,但无法记录游戏的时间,后上网查到格式化时间函数,利用头文件time.c, 并定义char _format_time_40; char* getFormatTime(long t),最终实现了该
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年静脉输液外渗应急演练方案、脚本及总结(2篇)
- 2025年电子商务师职业技能知识考试题与答案
- 摩托车复工安全知识培训课件
- 摩托摔车安全知识培训内容课件
- 摔跤力量训练课件
- 摄影博主基础知识培训课件
- 烹饪技术考试试题及答案
- 2025新款购房合同
- 2025混凝土班组合同范文
- 搭船的鸟课件
- 电解次氯酸钠消毒设备技术方案
- 2024天融信日志收集与分析系统部署操作手册
- 2015年全国高校体育单招考试英语卷真题及答案解析
- 北师大版七年级下册数学全册课件
- 二手房买卖合同范本下载可打印
- 上海市中考英语考纲词汇表
- 胶质瘤影像诊断
- ESD静电管理评审计划+管理评审报告全套资料
- 预防电信诈骗知识讲座残疾人
- 制造业的网络安全培训
- 空调维保投标方案(技术标)
评论
0/150
提交评论