1、瞬间记忆力大考验瞬间记忆力大考验一、课题内容和要求课题内容:根据游戏难度,随机产生一个4*4或4*5或6*6的二维数组,填入不同的符号,测试者通过输入坐标,指定记忆中相同的两个(或三个)符号的位置。正确,则显示符号对应图形,不正确则显示图形后随机关闭(显示时间为1秒)。记录完成猜测的时间并保留成绩,设置排行榜。要求:1.图形组合的瞬间停留,利用菜单提供初级(4*4)、中级(4*5)、高级(6*6)的测试项目。高级中图形为每组3个,共12组图案。2. 定义用户的结构体,用于记录不同用户的密码、测试成绩,并进行排名。3提供相应用户密码的安全测试。1)如果密码长度小于 6 位,则不安全 2)如果组成
2、密码的字符只有一类,则不安全 3)如果组成密码的字符有两类,则为中度安全 4)如果组成密码的字符有三类或以上,则为安全 5)通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。4用户游戏信息以文件形式保存。二、需求分析【1】可操作的主菜单:输出主菜单,用于显示以选择游戏中不同的功能选项。根据玩家输入的选项来运行不同的功能,运行不同的函数。【2】查看游戏排行榜【3】清空游戏排行榜【4】注册游戏账号【5】用游戏账号登陆进行游戏【6】4*4,4*5,6*6的记忆游戏。可方便的升级到任意大小的记忆游戏。【7】查看自己所有的游戏记录(按时间顺序)【8】游戏中有倒计时功能【9】提示用户密码强
3、度功能【10】输入密码是关闭回显 【11】保存所有信息到文件。程序关闭后,重新打开,信息不会丢失。三、概要设计本程序包含一个主体模块,另包括三个子模块,密码强度检验模块、游戏难度选择模块和菜单模块。游戏开始后,游戏者需先通过以上两个子模块分别设置密码和选择游戏难度,之后根据游戏者的选择进行不同难度游戏。游戏随机产生一个4*4或4*5或6*6的二维数组,相应地填入8对或10对或12对不同的符号,测试者通过输入坐标,指定记忆中相同的两个符号的位置。正确,则显示符号对应图形,不正确则显示图形后随机关闭(显示时间为1秒)。最后记录完成猜测的时间,并保留成绩到指定文件夹。密码强度检验模块游戏难度选择模块
4、四、源程序代码(部分)#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
5、 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
6、(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
7、); i-; continue; stri+ = ch; printf(*); printf(n); stri+=0;/ 二维坐标 struct Point int 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,
8、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_
9、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);
10、/ 关闭全部图形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 Char
11、Array* 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;
12、srand(time(NULL); memset(charArray-array,CHAR_ARRAY_SPECIAL_EMPTY_CHAR,sizeof(charArray-array); for(k=0;kheight*charArray-width/charArray-groupSize;k+) / 随机产生一个字符 do ch = CHAR_ARRAY_AVAILABLE_SHOW_CHARrand()%sizeof(CHAR_ARRAY_AVAILABLE_SHOW_CHAR); isFind = FALSE; for(i=0;iheight&!isFind;i+) for(j=0;
13、jwidth&!isFind;j+) if(charArray-arrayij = ch) isFind = TRUE; while(isFind = TRUE); for(i=0;igroupSize;i+) / 随机产生一个坐标 do x = rand()%charArray-width; y = rand()%charArray-height; while(charArray-arrayyx != CHAR_ARRAY_SPECIAL_EMPTY_CHAR); / 填入字符 charArray-arrayyx=ch; / 关闭全部图形 setCharArrayAllShield(char
14、Array);/ 打开全部图形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; / 判断指定的一组位置上
15、的图形是否相同 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.
16、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; ti
17、me_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); else printf(%c ,charArray-arrayij); printf(n); printf(*n); startTime = time(NULL); tempTime =
18、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) / 让玩
19、家指定相同字符所在的坐标 for(i=0;icharArray.groupSize;i+) / 输入行坐标 y do printf(*输入相同图形所在的第 %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 g
20、uessPointsgame-guessPointsTimei.y = game-charArray.height); / 输入列坐标 x do printf(*输入相同图形所在的第 %d 个列坐标,范围1,%d:,i+1,game-charArray.width); scanf(%d,&game-guessPointsgame-guessPointsTimei.x); / 用户输入的坐标是从 1 开始的,程序中的坐标是从 0 开始的,要修正 game-guessPointsgame-guessPointsTimei.x-; while(game-guessPointsgame-guessPo
21、intsTimei.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-charArra
22、y,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.groupS
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1