增量开发C语言实现的猜数字小游戏
一、引言
博主在学校开设的专业课上第一次接触到了增量开发的概念。增量开发在软件工程专业中算是比较重要的一个思路。软件开发既可以是从0到1,也可以是从1到100。在现实情况中,用户需求不是一成不变的,而是随时间不断变化的。如果我们对现有的产品成品感到自满,那么不久就可能会发现产品逐渐跟不上用户需求了。这也是发布产品后仍要进行用户调研、不断改进推出新版本的原因。于是,专业课布置的第一个正式作业就是自行选择非本人做过的小项目,对其测试并增量开发。
在这里我选择的项目是由CSDN用户恪愚在《菜鸟前路---c/c++小游戏》一文中编写的猜数字小游戏。此处附上原文链接https://yunxiaomeng.blog.csdn.net/article/details/85984388。猜数字对于编程新手来说是简单易上手的小项目,具有一定学习、交流、分享的价值。
二、测试体验
以下为CSDN用户恪愚发布的源码(侵删)
#include<stdio.h> #include<time.h> #include<stdlib.h> #include<conio.h> #include<windows.h> //下面Sleep()函数的头文件 #include<mmsystem.h> void menu() { printf(" *****************************\n"); printf(" *****************************\n"); printf(" ************1.play***********\n"); printf(" ************0.exit***********\n"); printf(" **********2.chakan***********\n"); printf(" *********3.qingkong**********\n"); printf(" *****************************\n"); printf("请选择: \n"); } void game() { system("cls"); system ( "color 33" ); //设置颜色 FILE *fp; if((fp=fopen("D:\\caishuziyou.txt","a+"))==NULL) { printf("open file error\n"); return ; } int rand_num=rand()%100; int tmp=0,t=0; while(1) { int flag=0; printf("请输入你要猜的数字:"); scanf("%d",&tmp); if(tmp>rand_num) { printf("猜大了!\n"); flag=0; } if(tmp<rand_num) { printf("猜小了!\n"); flag=0; } if(tmp==rand_num) { printf("正确!恭喜!\n"); printf("共用了%d次\n",t+1); FILE *fp; fp=fopen("D:\\caishuziyou.txt","w"); if(fp==NULL) { printf("create file failed\n"); return ; } fprintf(fp,"%d",t+1); fclose(fp); break; } if(flag==0) t++; printf(" 你再猜:\n"); } printf("\n按任意键返回目录"); getch(); } void menu2() { system("cls"); system ( "color B6" ); //设置颜色 printf("即将登陆系统!!!\n"); getch(); for(int t=3;t>=1;t--) { system("cls"); printf("%d",t); Sleep(700); system("cls"); } } void chakan() { system("cls"); system ( "color E0" ); //设置颜色 int t=0; FILE*fp; if((fp=fopen("D:\\caishuziyou.txt","r"))==NULL) { printf("can not to open the file!\n"); exit(0); } while(fscanf(fp,"%d",&t)!=EOF)//若不到文件结尾则继续 { printf("此玩家共进行了%d次\n",t); } printf("\n按任意键返回目录"); getch(); } void qk()//清空 { FILE *fp; system("cls"); //清屏函数,不管下面是否保存数据,每次输入新数据是屏幕上只能有此次的数据 system ( "color C0" ); //设置颜色 if((fp=fopen("D:\\caishuziyou.txt","w"))==NULL) { printf("open file error\n"); return; } fclose(fp); printf("\n按任意键返回!"); getch(); } int main() { int input=0; srand((unsigned)time(NULL)); do{ //while(1) //{ system("cls"); menu(); // printf("请选择:"); scanf("%d",&input); switch(input) { case 1: menu2(); game(); break; case 2: chakan(); break; case 3: qk(); break; case 0: exit(0); break; default:printf("输入错误!请重新输入!"); } //} }while(input); return 0; }
运行环境:Dev-C++
1.主菜单
2.功能一游玩
3.功能二查看
4.功能三清空
5.功能零退出
三、优化思路
对于一个猜数字小游戏来说,原项目做得还是十分完善的。关键地方有注释,思路清晰、简单,适合新手学习。但实际体验下来发现原项目有几个明显的可以改进之处。第一个方面是主菜单英文和拼音混用,略显业余。其次,在选择功能一进入游玩界面时没有如“请按任意键继续”的提示,用户体验不佳。第二个方面是游玩过程缺少限制。可以多次输入同一个数字,并且没有超出次数强制退出的限制,这使得游玩过程缺少挑战性。对于第一个方面。由于后续的提示皆为中文,于是将菜单中的功能名统一改为中文。经总结,优化方向如下:
1.主菜单修改功能名、增加合理的提示。
2.加限制:超过多少次后强制退出,显示剩余猜测次数。
3.输入相同数字后给予警告。
四、实际修改及效果演示
1.修改
修改后的菜单代码如下:
1 void menu() 2 { 3 printf(" *********猜数字小游戏********\n"); 4 printf(" *****************************\n"); 5 printf(" ************1.游玩***********\n"); 6 printf(" ************0.退出***********\n"); 7 printf(" ************2.查看***********\n"); 8 printf(" ************3.清空***********\n"); 9 printf(" *****************************\n"); 10 printf(" *****************************\n"); 11 printf("请选择: \n"); 12 }
修改后的提示代码如下:
1 void menu2() 2 { 3 system("cls"); 4 system ( "color B6" ); //设置颜色 5 printf("按任意键进入系统!!!\n"); 6 getch(); 7 for(int t=3;t>=1;t--) 8 { 9 system("cls"); 10 printf("%d",t); 11 Sleep(700); 12 system("cls"); 13 } 14 }
修改后的游玩代码如下:
1 void game() 2 { 3 system("cls"); 4 system ( "color 33" ); //设置颜色 5 FILE *fp; 6 if((fp=fopen("D:\\caishuziyou.txt","a+"))==NULL) 7 { 8 printf("open file error\n"); 9 return ; 10 } 11 int rand_num=rand()%100; 12 int tmp=0,sum=0; 13 int previous=-1; //表示前一个所猜的数字 14 for(;sum<=10;) 15 { 16 int flag=0; 17 printf("请输入你要猜的数字:"); 18 scanf("%d",&tmp); 19 if(tmp==previous) 20 { 21 printf("警告!重复输入相同的数字!还剩%d次机会\n",10-sum); 22 flag=0; 23 } 24 else if(tmp>rand_num){ 25 printf("猜大了!还剩%d次机会\n",10-sum); 26 flag=0; 27 previous=tmp; 28 } 29 else if(tmp<rand_num) 30 { 31 printf("猜小了!还剩%d次机会\n",10-sum); 32 flag=0; 33 previous=tmp; 34 } 35 else if(tmp==rand_num) 36 { 37 printf("不错的猜测,即使是我也能感到心潮澎湃!\n"); 38 printf("共用了%d次\n",sum+1); 39 40 41 FILE *fp; 42 fp=fopen("D:\\caishuziyou.txt","w"); 43 if(fp==NULL) 44 { 45 printf("create file failed\n"); 46 return ; 47 } 48 fprintf(fp,"%d",sum+1); 49 fclose(fp); 50 break; 51 } 52 if(flag==0) sum++; 53 if(sum!=11){ 54 printf("你再猜:\n"); 55 } 56 else { 57 printf("形不成形,意不在意,再去练练吧!\n"); 58 } 59 } 60 printf("\n按任意键返回目录"); 61 getch(); 62 }
以下为修改后的全部代码:
#include<stdio.h> #include<time.h> #include<stdlib.h> #include<conio.h> #include<windows.h> //下面Sleep()函数的头文件 #include<mmsystem.h> void menu() { printf(" *********猜数字小游戏********\n"); //改了 printf(" *****************************\n"); printf(" ************1.游玩***********\n"); //改了 printf(" ************0.退出***********\n"); //改了 printf(" ************2.查看***********\n"); //改了 printf(" ************3.清空***********\n"); //改了 printf(" *****************************\n"); printf(" *****************************\n"); printf("请选择: \n"); } void game() { system("cls"); system ( "color 33" ); //设置颜色 FILE *fp; if((fp=fopen("D:\\caishuziyou.txt","a+"))==NULL) { printf("open file error\n"); return ; } int rand_num=rand()%100; int tmp=0,sum=0; int previous=-1; //表示前一个所猜的数字 for(;sum<=10;) { int flag=0; printf("请输入你要猜的数字:"); scanf("%d",&tmp); if(tmp==previous) { printf("警告!重复输入相同的数字!还剩%d次机会\n",10-sum); flag=0; } else if(tmp>rand_num){ printf("猜大了!还剩%d次机会\n",10-sum); flag=0; previous=tmp; } else if(tmp<rand_num) { printf("猜小了!还剩%d次机会\n",10-sum); flag=0; previous=tmp; } else if(tmp==rand_num) { printf("不错的猜测,即使是我也能感到心潮澎湃!\n"); printf("共用了%d次\n",sum+1); FILE *fp; fp=fopen("D:\\caishuziyou.txt","w"); if(fp==NULL) { printf("create file failed\n"); return ; } fprintf(fp,"%d",sum+1); fclose(fp); break; } if(flag==0) sum++; if(sum!=11){ printf("你再猜:\n"); } else { printf("形不成形,意不在意,再去练练吧!\n"); } } printf("\n按任意键返回目录"); getch(); } void menu2() { system("cls"); system ( "color B6" ); //设置颜色 printf("按任意键进入系统!!!\n"); getch(); for(int t=3;t>=1;t--) { system("cls"); printf("%d",t); Sleep(700); system("cls"); } } void chakan() { system("cls"); system ( "color E0" ); //设置颜色 int t=0; FILE*fp; if((fp=fopen("D:\\caishuziyou.txt","r"))==NULL) { printf("can not to open the file!\n"); exit(0); } while(fscanf(fp,"%d",&t)!=EOF)//若不到文件结尾则继续 { printf("在成功猜测的游戏中,此玩家共进行了%d次猜测\n",t); } printf("\n按任意键返回目录"); getch(); } void qk()//清空 { FILE *fp; system("cls"); //清屏函数,不管下面是否保存数据,每次输入新数据是屏幕上只能有此次的数据 system ( "color C0" ); //设置颜色 if((fp=fopen("D:\\caishuziyou.txt","w"))==NULL) { printf("open file error\n"); return; } fclose(fp); printf("\n按任意键返回!"); getch(); } int main() { int input=0; srand((unsigned)time(NULL)); do{ //while(1) //{ system("cls"); menu(); // printf("请选择:"); scanf("%d",&input); switch(input) { case 1: menu2(); game(); break; case 2: chakan(); break; case 3: qk(); break; case 0: exit(0); break; default:printf("输入错误!请重新输入!"); } //} }while(input); return 0; }
2.演示
主菜单:
提示:
重复输入同一数字,给予警告:
强制退出:
五、总结与收获
总的来说,这次实验使我初步体验到了增量开发的过程,收获颇丰。博主能力有限,如有建议及指正欢迎在评论区提出!