一:玩家每次只能猜一个字母;
二:玩家只能猜错有限次,否则游戏失败;
三:猜错的字母将被记录下来;
四:每次猜测后,游戏应显示出当前猜出的残缺单词,连同当前猜错的任何字母,和剩下的猜错的机会;
五:假设玩家猜的字母在单词中,单词中任何的该字母将被视为已猜出,例如:假如原单词是apple,我们猜出了p,则程式应显示当前猜出的残缺单词为-pp--。
六:不得多次猜测同一个字母,因为这样是浪费时间。
一:准备工作:
规则就是这么多,我们应该用C 代码来实现他。首先,我们应考虑怎样记录单词,其中包括原单词、猜错的字母、当前猜出的残缺单词。假如用传统的C风格数组,这是很麻烦的,这用C风格字符串实现很困难。但C 为我们预先想到了这一切,C 中带有一个功能强大的string类,他的声明在头文档string中。注意,cstring或string.h中只是包含了一些处理字符串的函数,不包括string类。要使用这个类,我们首先要知道他的构造函数,这样才能创建string类对象。
| 构造函数 | 说明 |
| string(const char* s) | 将string对象初始化为字符串s |
| string(size_type n,char c) | 将对象初始化为有n个元素的对象,他们都是字符c |
| string(const string& str,size_type pos=0,size_type n=npos) | 将对象初始化为str中,从第pos个元素开始的n个元素。 |
其实,这个类的构造函数远不止这些,但我们研发这个游戏只用得到这些(也许还用不上这么多)。我们还要了解一些关于string类的知识。他重载了任何的关系操作符、能够用 =操作符把字符串、string类对象、字符加到对象的末尾。比如,我们能够写出这样的代码:string a="butter"; string b="fly"; a =b;这是十分方便的。他还重载了[]操作符,使我们完万能够像常规数组相同用他。对于string类,我们还要初步了解一下他的输入选项。他有operator>>,所以我们能够用cin进行输入,并且他和istream中的cin的使用规则是相同的。值得注意的一点是,string类是个比较智能的类,他能够自动调整字符串的长度,这样,我们就不用担心浪费空间或输入字符串超出对象末尾了。而我们常用的getline()函数呢?这是个成员函数,所以不能进行重载。解决的办法是,string类带有一个getline()的非成员函数,他接受两个参数,第一个是istream类对象,第二个是string类对象,并且去掉了长度参数,原因已说了。所以,假设temp是个string类对象,我们应这样对他使用getline():getline(cin,string);看起来有点不好看,但实用。
最后,要实现这个拼字游戏,我们必须在对象中查找字符。string类已提供了这方面的函数了,请看下表(未完全列出)。
| 方法原型 | 说明 |
| size_type find(char ch,size_type pos=0)const; | 从字符串的pos位置开始,查找字符ch,若找到,返回第一个ch所在的索引, 否则,返回string::npos。 |
| size_type find(const string& str,size_type pos=0)const; | 从字符串的pos位置开始,查找字符串str,若找到,返回str的首字母所在的索引,否则,返回string::npos。 |
| size_type find (const char* s,size_type pos=0)const; | 从字符串的pos位置开始,查找字符串s,若找到,返回s的首字母所在的索引,否则,返回string::npos。 |
举例说明,若temp是个string对象,内容为"apple",则temp.find('p')将返回1,即第一个字符p对应的索引。
二:游戏源代码:
| #include <iostream> #include <string> #include <cstdlib> #include <ctime> #include <cctype> using namespace std; const int NUM = 26; const string wordlist[NUM] = {"alabama", "choice", "usually", "dangerous", "deer", "panda", "love", "health", "exciting", "interesting", "administrator", "professional", "manage", "nonce", "onset", "typeid", "quarter", "remote", "lovely", "car", "keeper", "valid", "where", "mean", "important", "last"};//供游戏的单词库 int main() { srand(time(0)); char play; cout << "Will you play a word game? <y/n> "; cin >> play; play = tolower(play); while(play=='y') { string first(wordlist[rand()%NUM]);//随机选择单词 int length=first.length(); string player(length,'-');//玩家猜测的单词 string badguess;//猜错的字母集合 int guesses=10;//猜错的机会 char guess; cout<<"您有"<<guesses<<"次猜错的机会。\n"; cout<<"您的单词:"<<player<<'\n'; while(guesses>0&&player!=first) { cout<<"请您猜吧!"; cin>>guess; if(badguess.find(guess)!=string::npos||player.find(guess)!=string::npos) { cout<<"对不起,这个字母您已猜过了。"; continue; }//判断是否已猜过 int temp=first.find(guess); if(temp==string::npos) { cout<<"啊!猜错了。\n"; guesses--; badguess =guess; }//猜错后的处理 else { player[temp]=guess; temp=first.find(guess,temp 1); while(temp!=string::npos)//继续搜索该字符,看是否单词中有多个该字符 { player[temp]=guess; temp=first.find(guess,temp 1); } } cout<<"您还剩下"<<guesses<<"次猜错的机会。\n"; cout<<"您当前猜出的单词:"<<player<<'\n'; cout<<"您当前猜错的字母集合:"<<badguess<<'\n'; } if(guesses==0) cout<<"对不起,您失败了。\n"; else cout<<"您真棒!\n"; cout<<"正确单词为:"<<first<<'\n'; cout << "Will you play again? <y/n> "; cin>>play; }
文章整理:西部数码--专业提供域名注册、虚拟主机服务 相关文章
热点关注
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源 网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧 行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒 网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer 网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash 程序设计 Java技术 C/C++ VB delphi 网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术 操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD |



