南京理工大学 《VC++程序设计》论文优秀.docx
《南京理工大学 《VC++程序设计》论文优秀.docx》由会员分享,可在线阅读,更多相关《南京理工大学 《VC++程序设计》论文优秀.docx(16页珍藏版)》请在冰豆网上搜索。
南京理工大学《VC++程序设计》论文优秀
VC++程序设计报告
姓名:
学号:
班级:
时间:
任课教师:
所选课题:
猜单词游戏
评定难易程度:
A课程报告成绩:
一.程序功能简介:
一个猜单词游戏。
两人进行游戏时,由一个玩家给出一个单词,在人与计算机游戏时候,由计算机给出一个单词,另一个玩家根据组成单词的字母个数猜出单词,猜的次数可以指定,若猜不出,显示一个上吊的人形。
二.课程设计要求:
(1)将猜单词的函数与相应的数据封装到类中,并改写主程序,使程序简化。
(2)根据所猜单词中字母个数,给出指定几率的提示字母,显示于单词中正确位置。
(3)在进入猜单词的过程后,首先显示菜单询问是开始还是修改设置,默认的修改数为4,默认显示字符几率为20%,若要修改这个设置,在菜单中选择设置选项进行修改。
(4)在人人对抗时,一个玩家给出单词时,单词不显示在屏幕上,用*号显示。
(5)猜单词时,输入一个单词,判断函数改为判断输入单词的字符是否与所猜单词一一对应,将猜中的字符显示出来。
(6)在人机对抗时,可以选择随机读取单词,也可以选择自己向单词库中输入单词,同时,将单词库中单词的个数显示出来,并根据单词库中单词个数的多少决定随机选取的范围。
三.设计任务分配
A:
专职负责涉及文件流、随机的数函数的设计,即intCGuess:
:
RndWord();
intCGuess:
:
SaveWordFile();inlineistream&Flush(istream&stream);
voidCGuess:
:
ReplaceWord()。
B:
结合书本提供的关键源程序,设计其余程序。
四.知识点总结
1.string类
在源程序中字符串的操作中用类一种新的数据类型——string类,它是在C++标准库中声明的一个字符串类,用这种类可以定义对象。
每一个字符串变量都是string类的一个类对象。
C++中为string类重载了大量的运算符,定义了很多成员函数,本程序中用到的有:
string.length();——提取字符串的长度;
string.data();——将内容以字符数组形式返回;
string.at();——存取单一字符;
string.replace(intp0,intn0,intn,charc);删除p0开始的n0个字符,并在p0处插入n个字c
2.getch()函数
Getch()函数用来接收字符,这个函数的特点是只要按下一键就能识别,即输入字符不用输入缓冲区保存,直接进入内存,然后将这个键替换成*显示即可。
使用是需包含头文件#include“conio.h”.
3.isalpha(ch)
判断字符ch是否为英文字母,当ch为英文字母a_z或A?
_Z时,返回非零值,否则返回零值。
4.随机数(见关键函数解析)
srand(time(NULL)):
随机发生器的初始化函数,用时间作为随机数种子,获取随机数。
rand():
用于在设好随机数种子后,在单词列表中随机选取单词。
5.文件流的知识
SaveWorldFile():
说明文件流对象outfile后,按增补方式打开文件,并输入想要添加到文件中的单词。
inlineistream&Flush(istream&stream):
用于清空输入缓冲区的函数,可以解决过多输入,输入数据不符等问题。
程序中调用此函数的语句有Flush(cin),cout.flush()等
五.设计实现
1.模块设计
2.菜单设计
1主菜单
2.子菜单
子菜单A子菜单B
1使用默认的值
2选择显示字母的百分数
人人对抗(人机对抗)
1使用默认值
2选择猜词机会
子菜单C
人人(人机)猜词机会...
显示字母…
请第二位玩家输入单词
子菜单D
子菜单D子菜单E
死翘翘了!
很遗憾,你没有猜出
正确单词是…..
已猜字母…
还剩机会...
单词或字母
3.数据结构设计——类的封装
程序共设有两个类。
classdraw用于画上吊人形,通过在voiddrawman(intnumguess,intnumwrong,inti)函数体内定义类对象实现其功能;
classdraw
{
public:
draw();//构造函数
voidrope();//绳子
voidhead();//头
voidneck();//颈
voidleftarm();//左臂
voidrightarm();//右臂
voidwaisttop();//腰
voidleftleg();//左腿
voidrightleg();//右腿
};
classCGuess用于对人人对抗和人机对抗操作部分类的封装。
由于不论是人人对抗还是人机对抗,接收单词输入、显示猜单词的结果及判断是否猜中的函数都是一致的,所以将其定义为一个类的对象通过多次调用其中不同的函数实现功能。
classCGuess
{
private:
stringm_Word;//要猜的单词
stringm_DisplayWord;//用户所见的单词
char*m_pWord1;//字符指针用于开辟动态内存
char*m_pWord2;//字符指针用于开辟动态内存
intm_Proba;//显示单词字母个数百分比
intm_GuessNum;//玩家猜词的机会
intm_WrongNum;//玩家猜错的次数
intm_ChosenCounter;//玩家猜过的字母个数
stringm_LetterChosen;//玩家已经猜过的字母
intm_Choice;//玩家的选择
intm_ShowNum;//显示字母个数
intm_Length;//所猜单词的长度
intm_LetterNum;//单词中的字母个数
intm_i;//循环的记数变量,使每次游戏都不一样
intm_Check;//用户输入字母是否正确
intm_Choice2;
public:
CGuess();
voidInitialSet();
intSaveWordFile();
intUserWord();
intRndWord();
voidReplaceWord();
voidisChosen(char);
voidJudge(char);
intRun();
voidGetChoice();
voidGame();
voidpassword();
};
4.函数设计
1)所有函数功能列举
intmain(void)主函数
inlineistream&Flush(istream&stream);清空输入缓冲区
类体内的函数
CGuess:
:
CGuess();//构造函数
VoidCGuess:
:
InitialSet();//修改设置值
IntCGuess:
:
SaveWordFile();//向单词库输入单词
IntCGuess:
:
UserWord();//玩家出词
IntCGuess:
:
RndWord();//电脑出词
voidCGuess:
:
ReplaceWord();//替换正确的单词或字母
voidCGuess:
:
isChosen(char);//判断输入的字符是否为以前选取过的字符
voidCGuess:
:
Judge(char);//判断输入的字符是否为组成单词的字符
//如果是将其替换入m_Display
IntCGuess:
:
Run();//运行
voidCGuess:
:
GetChoice();//得到选择
voidCGuess:
:
Game();//游戏主要函数
voidCGuess:
:
password();//以密码形式得到玩家输入的单词
2)关键函数代码及分析
①游戏函数
voidCGuess:
:
Game()
{
intend=0;//记录游戏结果的变量,1时表示结束
intchosencounter=0;
charletter;//用户输入字母
stringtemp;//用户所见的单词
stringletterchosen="";
InitialSet();//进行设置
system("cls");
m_WrongNum=0;
intgo;
m_LetterNum=0;
if(m_Choice==1)
{
go=UserWord();
}
else
{
go=RndWord();
}//得到单词
m_DisplayWord=m_Word;//得到有效输入,把m_DisplayWord长度设为m_Word的长度
//用星号替换m_DisplayWord,此处修改,20%的字母要给出
ReplaceWord();//m_LetterNum记录单词不重复字母的个数
system("cls");
if(m_Choice==1){
cout<<"人人对战"<cout<<"*******************************************"<cout<<"猜词机会:
"<cout<<"显示字母:
"<cout<<"提示:
第二位玩家输入了一个有"<}else{
cout<<"人机对战"<cout<<"*********************************************"<cout<<"猜词机会:
"<cout<<"显示字母:
"<cout<<"提示:
电脑给出了一个有"<}
system("pause");
system("cls");//清屏
//游戏主循环
do{
drawman(m_GuessNum,m_WrongNum,m_i);//画出要吊死的人
//检查玩家是否猜中的单词
if(m_Word==m_DisplayWord)
{cout<cout<<"恭喜你,你猜对了["<m_LetterChosen="";
system("pause");
end=1;
}
//检查玩家是否没有猜中单词
if(m_WrongNum==m_GuessNum)
{
cout<cout<<"很遗憾,你没有猜出"<cout<<"正确的单词是["<m_LetterChosen="";//清空所猜过的字符
system("pause");
end=2;
}
if(end==0)//上面两情况都不对时
{
cout<cout<<"已猜字母:
"<cout<<"还剩机会:
"<cout<<""<cout<<"字母或单词:
";
cin>>letter;
while(!
isalpha(letter))//检测无效输入
{
Flush(cin);
cout<<"不是字母或单词-请输入字母或单词:
";
cin>>letter;
}
isChosen(letter);//
if(m_Check==0){Judge(letter);}
else{;}
system("cls");
}
system("cls");//清空游戏界面
}while(end!
=1&&end!
=2);
}
②以密码形式输入单词
voidCGuess:
:
password()
{
charstr[20];
charch;
inti=0,a=0,j=0;
cout<<"请第二位玩家输入单词:
"<cout.flush();//请输出缓冲区
ch=getch();
while(ch!
=13)//当输入不是回车时
{
str[i]=ch;
if(str[i]>=97&&str[i]<=122)
{
cout<<'*';j++;
cout.flush();
ch=getch();
}
elseif(str[i]>=65&&str[i]<=90)
{
str[i]=str[i]+32;j++;
cout<<'*';
cout.flush();
ch=getch();
}
elseif(str[i]<=65||(str[i]>=90&&str[i]<=97)||str[i]>=112)
{
cout<<"*";
cout.flush();
ch=getch();
}
i++;
}a=j;for(i=0;i{
m_Word.replace(i,1,1,str[i]);
}
intwordcheck;
do{//检查用户输入单词是否有误
wordcheck=0;
for(inti=0;iif(!
isalpha(m_Word.at(i)))//isalpha();word.at();
{
wordcheck=1;//输入非英文字母
}
if(wordcheck==1){
cout<<"无效-请第二位玩家重新输入:
";
password();
}
}while(wordcheck==1);
}
③开单词库,随机取出单词
intCGuess:
:
RndWord()
{
cout<<"人机对战"<cout<<"********************************************"<cout<<"猜词机会:
"<cout<<"显示字母:
"<intx;//记录随机数的变量
ifstreaminfile;//文件流,
srand(time(NULL));//根据时间得到一个随机数,
infile.open("words.txt");//打开文件
if(!
infile)//若找不到文件,处理
{
cout<<"不能打开Words.txt文件"<system("pause");
return0;
}
else
{
x=rand()%50;//得到一个随机数
for(inti=0;i<(x+1);i++){getline(infile,m_Word);}
}
m_Length=m_Word.length();
infile.close();//关闭文件
return1;
}
六.程序设计心得体会
1、通过本次C++课程设计,我对C++相关知识有了更深的了解。
学习关键源程序中的相关知识来扩张知识面,运用所学知识点编程,都使自己的编程能力得到提高。
编程过程中,我认识到了C++程序的强大功能极其实用性。
自主编程,让我对本课程有了更浓厚的兴趣。
2、在编程中,自主学习能力有了很大提高。
通过在书本、网络中查找相关知识点并询问同学,对获取的信息进行汇总、提炼直至得到关键信息。
在这一过程中,自主学习能力得到充分锻炼。
3、在合作编程中,我充分体会到了合作的力量。
分工合作,让我和我的搭档都有足够的精力对自己所负责的部分有更细致的考虑;也让原本看似庞大的程序不再那么恐惧。
有助于我们编出更科学的程序。
4、课程相关知识之外,在对本次课程考察准备过程中我的撰写报告的能力也得到了锻炼。
为今后课程做好了准备。