C语言课程设计猜数字游戏.docx
《C语言课程设计猜数字游戏.docx》由会员分享,可在线阅读,更多相关《C语言课程设计猜数字游戏.docx(30页珍藏版)》请在冰点文库上搜索。
C语言课程设计猜数字游戏
课程设计报告
课程名称C语言程序设计
课题名称猜数字游戏
专业自动化
班级1081班
学号************
姓名罗超超
指导教师王颖
2011年6月20日
湖南工程学院
课程设计任务书
课程名称C语言程序设计
课题猜数字游戏
专业班级自动化1081班
学生姓名罗超超
学号************
指导老师王颖
审批
任务书下达日期2011年6月13日
任务完成日期2007年6月20日
猜数字游戏
一、问题描述:
该游戏可以由程序随机产生或由用户输入四个0到9之间的数字,且不重复。
玩游戏者通过游戏提示输入八次来匹配上面所输入的数字。
A表示位置正确且数字正确,B表示数字正确而位置不正确。
二、功能要求:
1、本游戏显示这样的菜单:
(1)随机产生数据
(2)用户输入数据
(3)退出游戏
2、游戏成功与否都能返回主菜单
三、算法提示:
1、数据结构:
数组
2、用简单的程序设计方法
四、测试数据:
测试数据:
3792
第一次输入:
1234
0A2B
第二次输入:
5678
0A1B
第三次输入:
0867
0A1B
第四次输入:
9786
1A1B
第五次输入:
1794
2A0B
第六次输入:
2793
2A2B
第七次输入:
3792
4A0B
游戏成功
五、其它:
对该系统有兴趣的同学可以在实现系统基本功能后,完善系统的其它功能,如:
破记录功能,若你所匹配的次数小于纪录保持者,则为破纪录。
第一章 绪论
第一节 项目背景
C语言是一种优秀的程序设计语言,其功能丰富,表达能力强,程序执行效率高,可移植性好;C语言既有高级计算机程序设计语言的特点,同时又具有部分汇编语言的特点,因而C语言具有较强的系统处理能力。
通过C语言函数结构可以方便的实现程序的模块化;在C语言的基础上发展起来的面向对象程序设计语言如C++,java,c#等于C语言有许多的共同特征,掌握C语言对学习进而应用这些面向对象的程序设计语言有极大的帮助。
因为其独特的语言机制在计算机科学领域中得到了广泛的应用。
目前,大部分工科专业的计算机程序语言都是C语言,主要学习面向过程的程序设计方法。
C语言课程设计是综合性比较强的一门设计课程,它考察了学生对C语言的掌握及运用情况。
有助于提高学生的分析,理解及动手实践能力。
是计算机的基础课程。
本题目运用了结构体变量的定义及初始化,for,do-while循环,if,switch-case语句,文件打开,文件保存及其复合使用。
第二节 本课题所做的工作
本课题设计一个猜数字游戏,用户根据自己的爱好与兴趣进行随机游戏与自定义游戏,如果用户想自定义一个数字来猜,可以由用户自己进行输入,如果想挑战高难度,用户可以猜测由电脑产生的一个随机数,具体工作有:
系统自动产生一个随机数或用户自己定义一个随机数,制作游戏主菜单,制作游戏继续菜单,设计游戏程序,设计友好的界面提示与帮助。
本课程设计分为六个章节,每个章节为课题展开,重程序的需求分析,程序总体设计,程序设计等逐步向读者介绍,说明本课题。
还提供了源程序供读者参考。
第二章 需求分析
本程序为猜数字游戏,用户可以根据自己的爱好与兴趣进行随机游戏与自定义游戏,如果用户想自定义一个数字来猜,可以由用户自己进行输入,如果想挑战高难度,用户可以猜测由电脑产生的一个随机数;
每个游戏者都想在自己游戏结束时看到自己的得分情况,因此需要对游戏结果进行打分;
游戏者在游戏时,可能想到在任意时候都可以退出游戏,因此,无论游戏进行到任何阶段,都能够返回到主菜单或退出游戏;
在退出游戏之前,如果游戏者要再次进行挑战,应该设置一个提示游戏继续提示模块;
为了能够更好的迎合游戏者,界面设置要和谐,要能给用户有足够的提示,因此,系统菜单应该包括游戏开始,游戏退出,游戏说明,关于,游戏得分榜五个部分。
第三章 程序设计
第一节 程序的功能
该游戏可以由程序随机产生或由用户自定义四个0到9之间的数字,且不重复。
玩游戏者通过游戏提示输入八次来匹配上面所输入的数字。
输入正确则为成功,累计八次错误则游戏失败。
游戏成功根据猜测次数给出相应的得分!
该游戏还能自动判断你输入是否有误,如果输入有误,则自动提示您正确的操作。
第二节 输入输出的要求
按提示输入0-9之间的数字进行操作
①输入如:
在菜单页面时
输入1进入游戏;
输入2退出游戏;
输入3进入游戏说明页面;
输入4查看游戏版本及版权;
输入5查看游戏得分榜。
②输出如:
在游戏成功与失败时输出游戏得分与挑战成功与否!
如果当输入的选项出现错误时,则系统输出游戏提示“你输入有误,请确定后重新输入!
”。
第三节 程序模块
第一条 模块组成
本程序分为八个模块,main()主模块,menu()菜单模块,startf()开始模块,save()存储模块,display()排行榜模块,,shuomingf()说明模块,tuichu()退出模块,guanyuf()关于模块。
第二条 层次结构
第三条 模块调用
第四章分析
第一条 模块解释与功能
vmain()--主模块,操作系统的开始与结束运行;
voidmain()/*主函数*/
{
menu();//调用菜单模块进行菜单选择
}
vmenu()--菜单模块,打印菜单选项给游戏者进行选择,进入相应的模块并执行;
vmain()--主模块,操作系统的开始与结束运行;
voidmain()/*主函数*/
{
menu();//调用菜单模块进行菜单选择
}
vmenu()--菜单模块,打印菜单选项给游戏者进行选择,进入相应的模块并执行;
scanf("%d",&k);
switch(k)/*选择项*/
{
case1:
{
system("cls");
startf();//开始游戏
};break;
case2:
{
system("cls");
break;
};break;
case3:
{system("cls");
returnshuomingf();///跳到说明
}
case4:
{
system("cls");
returnguanyuf();//跳到关于
}
default:
{printf("\t\t您的输入有误,请重新输入!
\n");
system("pause");
system("cls");
returnmenu();//返回主菜单
}
vstartf()--开始模块,猜数字游戏开始,游戏者按照自己的意愿来进行游戏,系统对游戏的输入进行判断,真正实现了系统与游戏者完美融合;
scanf("%d",&f);//进行是否自定义选择
switch(f)
{
case0:
//进行随机游戏
srand((int)time(0));/*随机数据的产生*/
n=1+(int)(10000.1*rand()/(RAND_MAX+1.0));
break;
default:
printf("你输入有误,请重新输入!
!
");
system("pause");
case1:
printf("请输入你要自定义的数据\n");
scanf("%d",&n);
break;
}
Do//进行游戏,知道猜对或8次才结束
{
intc;
printf("请输入四个0到9之间的数字,且不重复,如:
1234\n");
scanf("%d",&cs);/*判断随机数据是否合格*/
intg1,s1,b1,q1,A=0,B=0;
g1=cs%10;///**拆分测试数据**//
s1=cs%100/10;
b1=cs/100%10;{
if(cs<1000)
q1=0;
else
q1=cs/1000;///**拆分测试数据**//
}
intp[4]={q1,b1,s1,g1},i,j;/*比较各位数是否相等*/
if(cs==n)//游戏区//
break;
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(p[i]==a[j])
if(i==j)
A++;
else
B++;
m++;//次数累计
system("cls");
printf("\t\t\t%dA%dB,m=%d",A,B,m);
printf("\n");
printf("\n");
}
}
while(m<8);//进行游戏,知道猜对或8次才结束
vphangb()--排行榜模块,进入排行榜查看自己及以往的游戏排行情
vTuichu()--退出模块,退出整个游戏系统;
scanf("%d",&h);
switch(h)//是否退出模块选择
{
case1:
{
system("cls");
menu();//返回主菜单
};break;
case2:
{
system("cls");
break;
};break;
default:
{
system("cls");
printf("您的输入有误,请重新输入!
");//提示报错
returnmenu();
vShuomingf--说明模块(),向游戏者介绍游戏的规则,并提示游戏者如何进行游戏;
vGuanyuf()--关于模块,向游戏者介绍本游戏的版本及版权。
第五章调试
第一节 菜单测试
在主菜单中
输入1:
进入游戏;
输入2:
退出游戏;
输入3:
进入游戏说明;
输入4:
进入关于;
输入5:
进入游戏排行榜;
输入其它数据或按键时:
提示“你输入有误,请重新输入”;
2)在自定义数值中
输入1:
进入自定义,提示请输入你要自定义的数据;
输入0:
进入随机游戏,系统将自动生成数据给游戏者猜;
输入3:
系统报错,提示“你输入有误,请重新输入!
”;
3)在继续菜单中
输入1:
继续进行游戏;
输入2:
退出游戏;
输入3:
系统报错,提示“你输入有误,请重新输入”;
第二节 游戏测试
第一条 在自定义中
自定义:
输入1234
1)第一次1234
结果如下图:
2)第一次1356
第二次23450A3B;
第三次34562A0B;
第四次56780A0B
第五次78900A0B;
第六次01230A2B;
第七次23570A2B;
第八次1234
结果如下图:
自定义:
输入12
提示报错,--“是否自定义数值”,直至定义正确;
结果如上图:
第二条 在随机游戏中
随机数据1234
第一次13561A0B;
第二次23450A3B;
第三次34562A0B;
第四次56780A0B;
第五次78900A0B;
第六次01230A2B;
第七次23570A2B;
第八次1234
结果如下图:
第六章总结
在一周的时间里,我们每天几乎都要面对着电脑十个小时以上,上课时去机房写程序,回到宿舍还要继续奋斗;要是只是在电脑面前坐着也没有什么难过的,但是在电脑面前还要想着怎么去写代码,怎么去安排程序结构,怎么去实现想要的程序功能等等一系列的事情;特别是在调试程序的时候更是让人头痛,辛辛苦苦的写好了函数,等到调试运行就出现一堆错误,真的拿它没办法呀!
不过还好有书本的基础知识、发达的网络通信、知识渊博的老师以及热心的同学的帮助,才使我能将那些问题一一解决!
在还没有进行课程设计实训之前,我对C语言知识的掌握真的只能说是很肤浅,我只知道分开来使用那些语句和语法,对他们根本没有整体感念,所以在学习C语言时经常会感觉很盲目,甚至不知道自己学这些东西是为了什么。
通过一周的课程设计,我对C语言有了更深入的了解,同时也建立起了一个对C语言的整体架构和编程思想;我还学到了很多课本上没有学到的东西,也了解了很多以前不了解的计算机语言方面的知识;他扩充了我的知识,也开拓了我的视野,让我们了解了我们学习计算机语言的目的和将来发展的方向。
通过该程序设计,我深刻体会到要编好一个程序必须具备扎实的基础知识由于以前学习的相关知识比较浅显,所以一开始我便感觉无从下手,但通过与同学间的互相讨论交流及上网搜索的相关资料,我渐渐掌握了做设计报告的基本方法和步骤,在自己的努力最终圆满完成了老师要求设计任务。
其实这次最大的收获还是发现自己的不足,原来自己所掌握的知识只是皮毛而已,还有对于计算机的基本操作知道的真是少的可怜,虽然受了点小小的打击,但总比一直错下去、学了等于没学强,这样至少不会一直迷迷糊糊下去了。
另外我也深深理解上机操作的重要性,有时候觉得自己很认真很仔细,对于编写的程序非常自信,可实际一上机操作就不行了,会出现错误,虽然会打击自信心,但总比一直错下去、学了等于没学强,那样学习也将失去意义,学习就是一个不断犯错又不断修正的过程,我觉得我每犯一个错误都会从中收获一些东西,这也叫经验吧,是这样通过不断犯错积累的,所以对于学习中的错误更要无惧无畏。
尽管这次课设做的可谓坎坎坷坷,但现在想来还是不错的,最起码让我对程序啊、函数啊的理解加深了,对于课本上忽略的东西也有所了解,最重要的是发现自己还不行,要努力,而且很努力才行。
第七章附录
第一节 附录A源程序
#include
#include
#include
#include"math.h"
staticintt;
inta[100];
externstartf();/*外部说明*/
externmenu();/*外部说明*/
externbackf();/*外部说明*/
externtuichu();/*外部说明*/
externshuomingf();/*外部说明*/
externguanyuf();/*外部说明*/
//学生基本信息保存模块
voidSave(intx)
{
FILE*fp;
inti;
a[t]=x;
t++;
fp=fopen("c:
\\youxi.txt","w+");
for(i=0;i{
fwrite(&a[i],sizeof(int),1,fp);
//每次写一个条录入或一个结构体数组至文件
}
if(i>0)
{
printf("\n完成%d个文件的保存\n",t);
system("pause");
}
else
{
system("cls");
printf("\n文件为空,没有保存一个文件\n");
system("pause");
}
fclose(fp);//关闭文件
}
//显示模块
voiddisplay()
{
inti;
for(i=0;i{
printf("\n\t\t\t\t%d",a[i]);
printf("\n");
}
if(t==0)
printf("没有分数");
system("pause");
system("cls");
}
voidmain()/*主函数*/
{
intcount=0;
FILE*fp;
fp=fopen("c:
\\youxi.txt","a+");//保存在c:
youxi.txt,以读写创建一个新的文本
if(fp==NULL)//打开头文件失败
{
printf("\n文件打开错误!
\n");
exit(0);
}
while(!
feof(fp))
{
if(fread(&a[count],sizeof(int),1,fp)==1)
//一次从文件中读取一条学生信息
count++;
}
t=count+t;
fclose(fp);
menu();
printf("\n\n\n\n\n\n\n");
printf("\t\t|*********************************************|\n");
printf("\t\t||\n\n");
printf("\t\t|............欢迎使用MS版............|\n\n");
printf("\t\t|.........经典猜数字游戏..........|\n\n");
printf("\t\t|...........感谢您的参与.............|\n\n");
printf("\t\t|...............谢谢...................|\n\n");
printf("\t\t|..................^_^....................|\n\n");
printf("\t\t|*********************************************|\n\n");
printf("\n\n\n\n\t\t\t\t\t\t\t\t...罗超超编制\n");
}
intmenu()/*菜单模块*/
{
intk;
printf("\n\n\n\n\t\t...................猜数字游戏..................\n");
printf("\t\t|***********************************************|\n");
printf("\t\t|***************==><==**************|\n");
printf("\t\t|***************==>1.开始<==**************|\n");
printf("\t\t|***************==><==**************|\n");
printf("\t\t|***************==>2.退出系统<==**************|\n");
printf("\t\t|***************==><==**************|\n");
printf("\t\t|***************==>3.游戏说明<==**************|\n");
printf("\t\t|***************==><==**************|\n");
printf("\t\t|***************==>4.关于<==**************|\n");
printf("\t\t|***************==><==**************|\n");
printf("\t\t|***************==>5显示分数<==**************|\n");
printf("\t\t|***************==><==**************|\n");
printf("\t\t|***********************************************|\n");
printf("\t\t|...............................................|\n");
printf("\n\n\n\n");
printf("\t\t请按提示输入:
");
scanf("%d",&k);
switch(k)/*选择项*/
{
case1:
{
system("cls");
startf();
};break;
case2:
{
system("cls");
break;
};break;
case3:
{system("cls");
returnshuomingf();
}
case4:
{
system("cls");
returnguanyuf();
}
case5:
{
system("cls");
display();
system("pause");
returnmenu();
}
default:
{
printf("\t\t您的输入有误,请重新输入!
\n");
system("pause");
system("cls");
returnmenu();
}
}
}
intstartf()/*游戏模块*/
{
intn,m=0,g,s,b,q,cs,C=0,f;//**cs表示测试数据**//
do
{
printf("是否自定义数值:
1/0(1:
是/0:
否)\n");
scanf("%d",&f);
switch(f)
{
case0:
srand((int)time(0));/*随机数据的产生*/
n=1+(int)(10000.1*rand()/(RAND_MAX+1.0));
break;
default:
printf("你输入有误,请重新输入!
!
");
system("pause");
case1:
printf("请输入你要自定义的数据\n");
scanf("%d",&n);
break;
}
g=n%10;
s=n%100/10;
b=n/100%10;
if(n<1000)
q=0;
}while((g==s)||(g==b)||(g==q)||(s==b)||(s==q)||(b==q)||(n<=124)||(n>=10000));/*随机数据的产生*/
inta[4]={q,b,s,g};/*将随机数据重组*/
system("cls");
printf("欢迎进入MS版猜数字游戏...\n\n");
printf