VC++课程设计报告——猜单词游戏VC++课程设计报告1.功能:课程设计题目的功能:一个猜单词游戏。
两人游戏时,由一个玩家给出一个单词,在人与计算机游戏时,由计算机给出一个单词,另一个玩家根据组成单词的字母个数猜出单词,猜的次数可以指定,若猜不中,显示一个上吊的人形。
(1)将猜单词的函数与相应的数据封装到类中,并改写主程序,使程序简化。
(2)根据所猜单词的字母个数,给出指定几率的提示字母,显示于单词中的正确位置。
(3)在进入猜单词的过程后,首先显示菜单询问是开始猜单词还是修改设置,默认的修改次数为4,默认显示字符的几率为20%,若要修改这个设置,在显示菜单中选择设置选项进行修改。
(4)在人人对抗时,一个玩家给出单词时,单词不显示在屏幕上,字符用“*”显示。
(5)猜单词时,输入一个单词,判断函数改为判断输入单词的字符是否与所猜单词一一对应,将猜中的字符显示出来。
(6)在人机对抗时,可以随机读取单词,也可以选择向单词库输入单词,同时,将单词库中单词的个数显示出来,并根据单词库中单词个数的多少决定随机选取的范围。
程序设计的思想和方法(1)类的封装画上吊人形的类已经封装起来,这部分程序基本不用改了,主要是对人人对抗和人及对抗操作部分类的封装。
可以定义一个类的两个对象,也可以定义为一个基本类和一个派生类的对象,成员函数可根据对象的不同分别调用,数据结构如下:Class CGuess{private:string Word; //欲猜的单词double Proba; //显示字符的概率0—1int GuessNum;//总共可猜的次数int WrongNum;//猜错的次数string DisplayWord;//欲显示的单词string GuessWord;//第二个玩家输入猜想的单词int nLen;//输入单词的长度public:CGuess();//构造函数void InitialSet();//修改设置值void InputWord();//输入单词并初始化成员函数void InputGuess();//接收用户所猜的单词int Judge();//判断是否猜中,猜中返回0,猜不中返回1或-(death)int ShowDisplay();//显示单词及上吊人形,程序结束返回1int OpenWordFile();//打开单词库,随机取出一个单词赋给Word,成功返回1int SaveWordFile();//向单词库输入新单词,正确返回1(2)程序主体结构的设置该设置基本上全部修改了原程序的结构,在main函数中分别定义人人对抗和人机对抗的对象。
在键入对应的菜单选项后,进入操作函数,操作函数的参数即是对应对象的引用。
同样,若有下级菜单的函数一样用该对象的引用参数,这样,可保证对象的唯一性。
主菜单:1.人人对抗(以人人对抗对象的引用作为参数调用子程序)2.人机对抗(以人机对抗对象的引用作为参数调用子程序)人人对抗菜单1.开始猜单词2.设置系统(即设置显示字符的概率和允许猜错的次数)3.退出人机对抗1.开始猜单词2.设置系统(即设置显示字符的概率和允许猜错的次数)3.向单词库中添加单词4.退出(3)人人对抗时输入欲猜单词的隐藏一个玩家给出单词时,单词不显示在屏幕上,字符用“*”号显示。
本程序在基础上还要有些限制条件,就是接收的字符必须是字母,当字幕为大写时还要转化为小写。
如果输入的不是字母要提示重新输入。
(4)C++用于处理字符串变量的新的数据类型——字符串类型(string类型)在原程序字符串的操作中用了一种新的数据类型——String,该类型是一个字符串类,可以定义对象。
它在使用方法上和char,int类型一样,可以用来定义字符串变量,即用一个名字代表一个字符序列。
程序设计的特点(1)增设了单词库,并且输入50个单词,以便使用。
(2)人人对抗和人机对抗时显示是否有重复字母2.课程设计的详细设计:程序主体结构图如下:程序详细结构:1.主菜单程序:void CGuess::GetChoice(){cout<<endl<<endl<<endl;cout << " 猜单词游戏" << endl << endl;cout <<" 制作者:刘健莹" << endl << endl;cout << "***********************************************************" << endl;cout << endl;cout << " 按1 人人对抗模式" << endl;cout << " 按2 人机对抗模式" << endl;cout << " 按3 退出" << endl;cout << endl;cout << "***********************************************************" << endl << endl;cout<<" 请您选择: ";cin>>Choice; // 得到用户选择while (!cin||Choice <1 || Choice >3) // 简查是否无效{cout << " 无效输入" << endl<< " 请再输入: ";Flush(cin);cin>>Choice;} // 完成简查, 得到有效输入,m_Choice变量的值被修改,清屏system("cls");}2.子菜单程序:int CGuess::InitialSet(){int exit=0;if(Choice==1){cout<<" 人人对抗"<<endl;cout << "***********************************************************" << endl;cout<<"按1开始玩游戏"<<endl;cout<<"按2修改设置值"<<endl;cout<<"按3退出"<<endl;cout<<endl;cout<<"*************************************************************"<<endl;cout<<" 你的选择:"<<endl<<endl;cin>>Choice2; }else{cout<<" 人机对抗"<<endl;cout << "***********************************************************" << endl;cout<<"按1开始玩游戏"<<endl;cout<<"按2修改设置值"<<endl;cout<<"按3向单词库输入单词"<<endl;cout<<"按4退出"<<endl;cout<<endl;cout << "***********************************************************" << endl;cout<<" 你的选择:"<<endl<<endl;cin>>Choice2;}while(!cin||Choice2 < 1 || Choice2 > 4){cout<< " 无效输入" << endl<< " 请再输入: ";Flush(cin);cin>>Choice2;}system("cls");if(Choice2==1) cout<<GuessNum<<endl;if(Choice2==2){cout<<" 你要几次猜词机会(4 - 10): ";cin>>GuessNum; //输入猜词次数while (!cin||GuessNum < 4 || GuessNum > 10){cout << " 无效输入" << endl<< " 请再输入- 你要几次猜词机会(4 - 10): ";Flush(cin);cin >>GuessNum;}}while(!cin||Choice2 < 1 || Choice2 > 4){cout<< " 无效输入" << endl<< " 请再输入: ";Flush(cin);cin>>Choice2;}system("cls");if(Choice2==1) cout<<Proba<<endl;if(Choice2==2){cout<<" 你要百分之几的字母显示出来(10 - 80): ";cin>>Proba; //输入显示字母百分数while (!cin||Proba < 10 || Proba > 80){cout << " 无效输入" << endl<< " 请再输入- 你要百分之几的字母显示出来(10 - 80): ";Flush(cin);cin >>Proba;}}if(Choice2==3){if(Choice==1){exit=1;}else{SaveWordFile();InitialSet();}}if(Choice2==4){exit=1;}return exit;}3.修改默认设置程序:if(Choice2==1) cout<<GuessNum<<endl;if(Choice2==2){cout<<" 你要几次猜词机会(4 - 10): ";cin>>GuessNum; //输入猜词次数while (!cin||GuessNum < 4 || GuessNum > 10){cout << " 无效输入" << endl<< " 请再输入- 你要几次猜词机会(4 - 10): ";Flush(cin);cin >>GuessNum;}}while(!cin||Choice2 < 1 || Choice2 > 4){cout<< " 无效输入" << endl<< " 请再输入: ";Flush(cin);cin>>Choice2;}system("cls");if(Choice2==1) cout<<Proba<<endl;if(Choice2==2){cout<<" 你要百分之几的字母显示出来(10 - 80): ";cin>>Proba; //输入显示字母百分数while (!cin||Proba < 10 || Proba > 80){cout << " 无效输入" << endl<< " 请再输入- 你要百分之几的字母显示出来(10 - 80): ";Flush(cin);cin >>Proba;}4.默认的游戏设置程序:Proba=20; //显示单词字母个数百分比GuessNum=4; //玩家猜词的机会5.将单词输入进单词库中的函数:void GuessGame::saveWordFile(){int n=50,i,j;ofstream out;out.open("words.txt");if(!out){cout<<"不能打开单词库"<<endl;}cout<<"单词库中有50个单词"<<endl;cout<<"向单词库中输入多少个单词"<<endl;cin>>j;cout<<"请向单词库中输入"<<j<<"个单词"<<endl;for ( i = 0; i < j; i++){string word; // 输入单词getline(cin,word);n=n+1;out<< word;cout<<"单词库中有"<<n<<"个单词"<<endl;}out.close();}6.显示猜对的单词:void GuessGame::test(string word, char letter, int& numwrong, string& temp) {static int m;int check2 = 0; // 判断输入的字符是否为组成单词的字符,正确为1 if (letter == word.at(m)) //若单词中有这一个字符{temp.replace(m, 1, 1, letter);check2 = 1;}if (check2 == 0) //若单词中没有这一个字符{cout << endl;cout << "Wrong letter" << endl;system("pause");numwrong++;}if(m<(word.length()-1)){m++;}else m=0;}7.输出给定几率的字母:for (i = word.length() * Proba; i < word.length(); i++){temp.replace(i, 1, 1,'*');}8.游戏程序主体运行:int CGuess::Run(){int exit = 0; //主循环是否退出的变量,1时退出do { //主循环system("cls"); // 执行系统命令清屏GetChoice(); // 给出说明并得到选择switch(Choice){case 1:Game(); // 与人对战break;case 2:Game(); // 与电脑对战break;case 3:cout << " 再见" << endl<<endl; // 退出exit = 1;break;default:cout << " 无效输入- 请再输入" << endl; // 无效输入}} while (exit != 1); //退出主循环system("pause"); // 执行系统命令:暂停return 0;}9.在人人对抗时,一个玩家给出单词时,单词不显示在屏幕上,字符用“*”号显示。