#include // 标准输入输出[cin;cout]#include // 字符串处理[string.length();at();]#include // 字符处理和检测#include // 文件流#include // 使用随机函数用#include// 得到更好的随机数用#include// draw类定义#ifndef DRAW_H // 检测是否已经包含#define DRAW_Hclass draw{public: draw(); // 构造函数 // 成员函数 void rope(); // 绳子 void head(); // 头 void neck(); // 颈 void leftarm(); // 左臂 void rightarm(); // 右臂 void waisttop(); // 腰 void leftleg(); // 左腿 void rightleg(); // 右腿};#endif#ifndef GUESS_H#define GUESS_Husing namespace std;//程序类定义class CGuess {private: string Word, word, worD; //要猜的单词 string DisplayWord; //用户所见的单词 char* pWord1; char* pWord2; int Proba; //显示单词字母个数百分比 int GuessNum; //玩家猜词的机会 int WrongNum; //玩家猜错的次数 int ChosenCounter;//玩家猜过的字母个数 string LetterChosen; //玩家已经猜过的字母 int Choice; //玩家的选择 int ShowNum; //显示字母个数 int Length; //所猜单词的长度 int LetterNum; //单词中的字母个数 int i; //循环的记数变量,使每次游戏都不一样 int Check; //用户输入字母是否正确 int Choice2;public: CGuess(); void InitialSet(); int SaveWordFile(); int UserWord(); //玩家出词 int RndWord(); //电脑出词 void ReplaceWord(); void isChosen(char); void Judge(char); int Run(); //运行 void GetChoice(); //得到选择 void Game(); //游戏主要函数 void Set(); //设置 void password();};#endif using namespace std; // 用名字空间std //构造函数draw::draw() {}void draw::rope() // 输出上吊绳{ cout << " |";}void draw::head() //头{ cout << " O";}void draw::neck() //颈{ cout << " |";}void draw::leftarm() //左臂{ cout << "//";}void draw::rightarm() //右臂{ cout << " \";}void draw::waisttop() //腰{ cout << " { }";}void draw::leftleg() //左腿{ cout << "//";}void draw::rightleg() //右腿{ cout << " \";}//-------------------------------------------------------------------------------//清理输入流inline istream& Flush(istream& stream){ stream.clear(); int chars_to_skip = stream.rdbuf()->in_avail(); return stream.ignore(chars_to_skip);}//根据设置的次数和实际猜错的次数画上吊人形void drawman(int numguess, int numwrong, int i){ draw d; for (i = 0; i <= numwrong; i++) { if (numguess == 4) { switch (i) { case 1: d.rope(); cout << endl; d.head(); cout << endl; d.neck(); break; case 2: cout << endl; d.leftarm(); d.rightarm(); break; case 3: cout << endl; d.waisttop(); break; case 4: cout << endl; d.leftleg(); d.rightleg(); cout << endl << endl << "死翘翘了!" << endl; break; } } else if (numguess == 5) { switch (i) { case 1: d.rope(); break; case 2: cout << endl; d.head(); cout << endl; d.neck(); break; case 3: cout << endl; d.leftarm(); d.rightarm(); break; case 4: cout << endl; d.waisttop(); break; case 5: cout << endl; d.leftleg(); d.rightleg(); cout << endl << endl << "死翘翘了!" << endl; break; } } else if (numguess == 6) { switch (i) { case 1: d.rope(); break; case 2: cout << endl; d.head(); cout << endl; d.neck(); break; case 3: cout << endl; d.leftarm(); d.rightarm(); break; case 4: cout << endl; d.waisttop(); break; case 5: cout << endl; d.leftleg(); break; case 6: d.rightleg(); cout << endl << "死翘翘了!" << endl; break; } } else if (numguess == 7) { switch (i) { case 1: d.rope(); break; case 2: cout << endl; d.head(); cout << endl; d.neck(); break; case 3: cout << endl; d.leftarm(); break; case 4: d.rightarm(); break; case 5: cout << endl; d.waisttop(); break; case 6: cout << endl; d.leftleg(); break; case 7: d.rightleg(); cout << endl << "死翘翘了!" << endl; break; } } else if (numguess == 8) { switch (i) { case 1: d.rope(); break; case 2: cout << endl; d.head(); break; case 3: cout << endl; d.neck(); break; case 4: cout << endl; d.leftarm(); break; case 5: d.rightarm(); break; case 6: cout << endl; d.waisttop(); break; case 7: cout << endl; d.leftleg(); break; case 8: d.rightleg(); cout << endl << "死翘翘了!" << endl; break; } } else if (numguess == 9) { switch (i) { case 1: d.rope(); break; case 2: cout << endl; d.head(); break; case 3: cout << endl; d.neck(); break; case 4: cout << endl; d.leftarm(); break; case 5: d.rightarm(); break; case 6: cout << endl; d.waisttop(); break; case 7: break; case 8: cout << endl; d.leftleg(); break; case 9: d.rightleg(); cout << endl << "死翘翘了!" << endl; break; } } else if (numguess == 10) { switch (i) { case 1: d.rope(); break; case 2: cout << endl; d.head(); break; case 3: cout << endl; d.neck(); break; case 4: cout << endl; d.leftarm(); break; case 5: d.rightarm(); break; case 6: cout << endl; d.waisttop(); break; case 7: break; case 8: cout << endl; d.leftleg(); break; case 9: d.rightleg(); cout << "最后一次机会,难道您想躺在坟墓里吗?"; break; case 10: cout << endl << "死翘翘了!" << endl; break; } } }}//上吊人形结束// ----------------------------------------------------------------------------------------------using namespace std;//主函数int main() { CGuess Guess; return Guess.Run(); system("pause");}//结束主函数功能// ----------------------------------------------------------------------------------------------//成员函数声明CGuess::CGuess() { string Word, worD = "aaaaaaaaaaaaaaaaaaaaaaaaa", word = "aaaaaaaaaaaaaaaaaaaaaaaaa"; //要猜的单词 string DisplayWord; //用户所见的单词 pWord1 = NULL; pWord2 = NULL; Proba = 20; //显示单词字母个数百分比 GuessNum = 4; //玩家猜词的机会 WrongNum = 0; //玩家猜错的次数 ChosenCounter = 0;//玩家猜过的字母个数 LetterChosen = " "; //玩家已经猜过的字母 Choice = 0; //玩家的选择 ShowNum = 0; //显示字母个数 Length = 0; //所猜单词的长度 LetterNum = 0; //单词中的字母个数 i = 0; //循环的记数变量,使每次游戏都不一样 Check = 0; //用户输入字母是否在正确 Choice2 = 0;}// ----------------------------------------------------------------------------------------------//主体函数运行int CGuess::Run() { int exit = 0; //主循环是否退出的变量,1时退出 do { //主循环 system("cls"); // 执行系统命令清屏 GetChoice(); // 给出说明并得到选择 switch (Choice) { // 当 exit 不为1时 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;}//运行结束// ----------------------------------------------------------------------------------------------//主菜单选择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; } // 完成检查, 得到有效输入,Choice变量的值被修改,清屏 system("cls");}//主菜单选择结束//修改默认设置void CGuess::Set() { cout << " 默认的猜单词次数改为:"; cin >> GuessNum; while (!cin || GuessNum < 4 || GuessNum > 10) { cout << " 无效输入" << endl << " 请重新输入: "; Flush(cin); cin >> GuessNum; } cout << " 默认的显示字母百分数改为:"; cin >> Proba; while (!cin || Proba < 10 || Proba > 80) { cout << " 无效输入" << endl << " 请重新输入: "; Flush(cin); cin >> Proba; } system("cls");}//游戏部分// ---------------------------------------------------------------------------------------------- void CGuess::Game() { int end = 0; // 记录游戏结果的变量,1时表示结束 int chosencounter = 0; char letter; // 用户输入字母 string temp; // 用户所见的单词 string letterchosen = " "; InitialSet(); //进行设置 system("cls"); WrongNum = 0; int go; LetterNum = 0; if (Choice == 1) { go = UserWord(); } else { go = RndWord(); } //得到单词 DisplayWord = Word; // 得到有效输入,把DisplayWord长度设为Word的长度 // 用星号替换DisplayWord,此处修改,20%的字母要给出 ReplaceWord(); //LetterNum记录单词不重复字母的个数 system("cls"); if (Choice == 1) { cout << " 人人对抗" << endl; cout << "************************************************************************" << endl << endl; cout << " 猜词机会:" << GuessNum << endl; cout << " 显示字母:" << Proba << '%' << endl; cout << " 提示:第二位玩家输入了一个有" << LetterNum << "个不重复字母的单词" << endl; } else { cout << " 人机对抗" << endl; cout << "************************************************************************" << endl << endl; cout << " 猜词机会:" << GuessNum << endl; cout << " 显示字母:" << Proba << '%' << endl; cout << " 提示:电脑给出了一个有" << LetterNum << "个不重复字母的单词" << endl; } system("pause"); system("cls"); //清屏 // 游戏主循环 do { drawman(GuessNum, WrongNum, i); //画出要吊死的人 // 检查玩家是否猜中的单词 if (Word == DisplayWord) { cout << endl << endl; cout << " 恭喜你,你猜对了 [ " << Word << " ]" << endl << endl; cout << "您可以继续游戏!" << endl; LetterChosen = " "; system("pause"); end = 1; } // 检查玩家是否没有猜中单词 if (WrongNum == GuessNum) { cout << endl << endl; cout << " 很遗憾,你没有猜出" << endl << endl; cout << " 正确的单词是[ " << Word << " ]" << endl << endl; LetterChosen = " "; //清空所猜过的字符 system("pause"); end = 2; } if (end == 0) // 上面两情况都不对时 { cout << endl << endl << endl; cout << " 已猜字母: " << LetterChosen << endl; cout << " 还剩机会: " << GuessNum - WrongNum << endl << endl; cout << " " << DisplayWord << endl << endl; cout << " 字母或单词: "; cin >> letter; while (!isalpha(letter)) // 检测无效输入 { Flush(cin); cout << " 不是字母或单词 - 请输入字母或单词: "; cin >> letter; } isChosen(letter); // if (Check == 0) { Judge(letter); } else { ; } system("cls"); } system("cls"); //清空游戏界面 } while (end != 1 && end != 2);}//结束// ----------------------------------------------------------------------------------------------//判断输入的字符是否为以前选取过的字符void CGuess::isChosen(char letter){ Check = 0; for (int i = 0; i < LetterChosen.length(); i++) { if (letter == LetterChosen.at(i)) { Check = 1; } //如果以前选取过,则check=1 } if (Check != 1) { LetterChosen.replace(ChosenCounter, 1, 1, letter);//如果字母还没有猜过,用输入字母替 ChosenCounter++; }}//判断结束// ----------------------------------------------------------------------------------------------//判断输入的字符是否为组成单词的字符void CGuess::Judge(char letter){ int check2 = 0; // 判断输入的字符是否为组成单词的字符,正确为1 for (int i = 0; i < Word.length(); i++) //若单词中有这一个字符 { if (letter == Word.at(i)) { DisplayWord.replace(i, 1, 1, letter); check2 = 1; } } if (check2 == 0) //若单词中没有这一个字符 { WrongNum++; }}//判断结束// ----------------------------------------------------------------------------------------------//子菜单设置void CGuess::InitialSet() { if (Choice == 1) { cout << " 人人对抗" << endl; cout << "***********************************************************" << endl; cout << "按1开始玩游戏" << endl; cout << "按2修改设置值" << endl; cout << "按3退出" << endl; cout << endl; cout << "*************************************************************" << endl; } 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; cout << Proba << endl; } if (Choice2 == 2) { cout << " 请输入可以猜错的次数 (4 - 10): "; cin >> GuessNum; //输入猜词次数 while (!cin || GuessNum < 4 || GuessNum > 10) { cout << " 无效输入" << endl << " 请重新输入 你要几次猜词机会(4 - 10): "; Flush(cin); cin >> GuessNum; } system("cls"); 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) GetChoice(); else { SaveWordFile(); InitialSet(); } } if (Choice2 == 4) GetChoice();}//子菜单设置结束// ----------------------------------------------------------------------------------------------//输入单词时输出*#define N 13 //为任意一个字符(包括空白字符)的ASC||码值void CGuess::password(){ char str[20]; char ch; int i = 0, a = 0, j = 0; cout << "请第二位玩家输入单词: " << endl; cout.flush(); //请输出缓冲区 ch = getch(); while (ch != 13) { str[i] = ch; if (str[i] >= 97 && str[i] <= 122) { cout << '*'; j++; cout.flush(); ch = getch(); } else if (str[i] >= 65 && str[i] <= 90) { str[i] = str[i] + 32; j++; cout << '*'; cout.flush(); ch = getch(); } else if (str[i] <= 65 || (str[i] >= 90 && str[i] <= 97) || str[i] >= 112) { cout << "*"; cout.flush(); ch = getch(); } i++; }a = j; for (i = 0; i < a; i++) { word.replace(i, 1, 1, str[i]); } Word = word; word = worD; int wordcheck; do { // 检查用户输入单词是否有误 wordcheck = 0; for (int i = 0; i < Word.length(); i++) if (!isalpha(Word.at(i))) //isalpha();word.at(); { wordcheck = 1; } if (wordcheck == 1) { cout << " 无效 - 请第二位玩家重新输入: "; password(); Word = word; word = worD; } } while (wordcheck == 1);}// ---------------------------------------------------------------------------------------------- //人人对抗模式 int CGuess::UserWord(){ cout << " 人人对战" << endl; cout << " ************************************************************************" << endl << endl; cout << " 猜词机会:" << GuessNum << endl; cout << " 显示字母:" << Proba << '%' << endl; password(); Length = Word.length(); return 1;}//人人对抗结束//------------------------------------------------------————————————————————————————//人机对抗模式int CGuess::RndWord() { cout << " 人机对战" << endl; cout << " ************************************************************************" << endl << endl; cout << " 猜词机会:" << GuessNum << endl; cout << " 显示字母:" << Proba << '%' << endl; int x; // 记录随机数的变量 ifstream infile; // 文件流, srand(time(NULL)); // 根据时间得到一个随机数, infile.open("words.txt"); // 打开文件 if (!infile) //若找不到文件,处理 { cout << " 不能打开Words.txt文件 " << endl; system("pause"); return 0; } else { x = rand() % 50; // 得到一个随机数 for (int i = 0; i < (x + 1); i++) { getline(infile, Word); } } Length = Word.length(); infile.close(); // 关闭文件 return 1;}// ----------------------------------------------------------------------------------------------//记录单词中字母是否重复与重复的个数void CGuess::ReplaceWord() { pWord1 = new char[Length]; strcpy(pWord1, Word.data()); pWord2 = new char[Length]; strcpy(pWord2, Word.data()); char* letterlist = new char[Length]; //记录单词中的不重复字母 strcpy(letterlist, pWord1); //循环得到一个记录单词所含字母的字符串letterlist for (int i = 0; i < Length; i++) { //记录不重复字母数 for (int j = i + 1; j < Length; j++) { if (pWord2[i] == pWord2[j] && pWord2[i] != '*') { pWord2[j] = '*'; //重复则换成星号 } } if (pWord2[i] != '*') { letterlist[LetterNum] = pWord2[i]; LetterNum++; } } int ShowNum = int(LetterNum * Proba / 100.0); //要显示的字母数,保证其大于2 if (LetterNum == 2) ShowNum = 1; if (LetterNum > 2 && ShowNum < 2) ShowNum = 2; int* radomarray = new int[ShowNum]; //得到一指定长度的随机数组 int x; srand(time(NULL)); for (i = 0; i < ShowNum; i++) { //是否有重复 x = rand() % ShowNum; //不大于m_ShowNum的随机数 radomarray[i] = x; for (int j = 0; j < i; j++) { if (radomarray[i] == radomarray[j] && i != j) i--; //重复则再来一次 } } int re = 1; //替换指定字母的循环 for (i = 0; i < Length; i++) { for (int j = 0; j < ShowNum; j++) { if (char(pWord1[i]) == char(letterlist[radomarray[j]])) { re = 0; } } if (re) { pWord1[i] = '*'; } re = 1; } DisplayWord = pWord1; delete[]radomarray;}//记录结束// ----------------------------------------------------------------------------------------------// 将单词输入进单词库中的函数#define n 50int CGuess::SaveWordFile(){ int i = 0; static int j = n - 1; j++; cout << " 单词库中的单词个数为" << j << endl; cout << " 请输入想要存储的单词: "; char a[10]; ofstream outfile; //说明一个文件流对象,只能将数据写入 outfile.open("words.txt", ios::app); //按增补方式打开文件 if (outfile) { cin >> a; outfile << a << endl; outfile.close(); return 1; } else { cout << "Error opening file.\n"; return 0; } system("cls"); Run();}//将单词输入进单词库结束
文件位置不对,当前txt文件要和cpp文件在同一个目录下才行,否则就会找不到文件。