国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

利用C++編寫一個(gè)猜字游戲

2019-11-17 05:12:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  今天,我們要用C++來(lái)寫一個(gè)猜字母的游戲。不要擔(dān)心,做起來(lái)并不是那么難的。首先,我們必須了解一下游戲規(guī)則。

  一:玩家每次只能猜一個(gè)字母;

  二:玩家只能猜錯(cuò)有限次,否則游戲失敗;

  三:猜錯(cuò)的字母將被記錄下來(lái);

  四:每次猜測(cè)后,游戲應(yīng)顯示出當(dāng)前猜出的殘缺單詞,以及當(dāng)前猜錯(cuò)的所有字母,和剩下的猜錯(cuò)的機(jī)會(huì);

  五:假設(shè)玩家猜的字母在單詞中,單詞中所有的該字母將被視為已猜出,例如:假如原單詞是apple,我們猜出了p,則程序應(yīng)顯示當(dāng)前猜出的殘缺單詞為-pp--。

  六:不得多次猜測(cè)同一個(gè)字母,因?yàn)檫@樣是浪費(fèi)時(shí)間。

  一:預(yù)備工作:

   規(guī)則就是這么多,我們應(yīng)該用C++代碼來(lái)實(shí)現(xiàn)它。首先,我們應(yīng)考慮怎樣記錄單詞,其中包括原單詞、猜錯(cuò)的字母、當(dāng)前猜出的殘缺單詞。假如用傳統(tǒng)的C風(fēng)格數(shù)組,這是很麻煩的,這用C風(fēng)格字符串實(shí)現(xiàn)很困難。但C++為我們預(yù)先想到了這一切,C++中帶有一個(gè)功能強(qiáng)大的string類,它的聲明在頭文件string中。注重,cstring或string.h中只是包含了一些處理字符串的函數(shù),不包括string類。要使用這個(gè)類,我們首先要知道它的構(gòu)造函數(shù),這樣才能創(chuàng)建string類對(duì)象。
   
構(gòu)造函數(shù)說(shuō)明string(const char* s)將string對(duì)象初始化為字符串sstring(size_type n,char c)將對(duì)象初始化為有n個(gè)元素的對(duì)象,它們都是字符cstring(const string& str,size_type pos=0,size_type n=npos)將對(duì)象初始化為str中,從第pos個(gè)元素開(kāi)始的n個(gè)元素。
   其實(shí),這個(gè)類的構(gòu)造函數(shù)遠(yuǎn)不止這些,但我們開(kāi)發(fā)這個(gè)游戲只用得到這些(也許還用不上這么多)。我們還要了解一些關(guān)于string類的知識(shí)。它重載了所有的關(guān)系操作符、可以用+=操作符把字符串、string類對(duì)象、字符加到對(duì)象的末尾。比如,我們可以寫出這樣的代碼:string a="butter"; string b="fly"; a+=b;這是十分方便的。它還重載了[]操作符,使我們完全可以像常規(guī)數(shù)組一樣用它。對(duì)于string類,我們還要初步了解一下它的輸入選項(xiàng)。它有Operator>>,所以我們可以用cin進(jìn)行輸入,并且它與istream中的cin的使用規(guī)則是一樣的。值得注重的一點(diǎn)是,string類是一個(gè)比較智能的類,它能夠自動(dòng)調(diào)整字符串的長(zhǎng)度,這樣,我們就不用擔(dān)心浪費(fèi)空間或者輸入字符串超出對(duì)象末尾了。而我們常用的getline()函數(shù)呢?這是一個(gè)成員函數(shù),所以不能進(jìn)行重載。解決的辦法是,string類帶有一個(gè)getline()的非成員函數(shù),它接受兩個(gè)參數(shù),第一個(gè)是istream類對(duì)象,第二個(gè)是string類對(duì)象,并且去掉了長(zhǎng)度參數(shù),原因已經(jīng)說(shuō)了。所以,假設(shè)temp是一個(gè)string類對(duì)象,我們應(yīng)這樣對(duì)它使用getline():getline(cin,string);看起來(lái)有點(diǎn)不好看,但實(shí)用。

  最后,要實(shí)現(xiàn)這個(gè)拼字游戲,我們必須在對(duì)象中查找字符。string類已經(jīng)提供了這方面的函數(shù)了,請(qǐng)看下表(未完全列出)。
 
方法原型說(shuō)明size_type find(char ch,size_type pos=0)const;從字符串的pos位置開(kāi)始,查找字符ch,若找到,返回第一個(gè)ch所在的索引,
否則,返回string::npos。size_type find(const string& str,size_type pos=0)const;從字符串的pos位置開(kāi)始,查找字符串str,若找到,返回str的首字母所在的索引,否則,返回string::npos。size_type find (const char* s,size_type pos=0)const;從字符串的pos位置開(kāi)始,查找字符串s,若找到,返回s的首字母所在的索引,否則,返回string::npos。
    舉例說(shuō)明,若temp是一個(gè)string對(duì)象,內(nèi)容為"apple",則temp.find('p')將返回1,即第一個(gè)字符p對(duì)應(yīng)的索引。

  二:游戲源代碼:

#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", ""typeid", "quarter", "remote", "lovely", "car", "keeper",
"valid", "where", "mean", "important", "last"};//供游戲的單詞庫(kù)

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]);//隨機(jī)選擇單詞
  int length=first.length();
  string player(length,'-');//玩家猜測(cè)的單詞
  string badguess;//猜錯(cuò)的字母集合
  int guesses=10;//猜錯(cuò)的機(jī)會(huì)
  char guess;
  cout<<"您有"<<guesses<<"次猜錯(cuò)的機(jī)會(huì)。/n";
  cout<<"您的單詞:"<<player<<'/n';
  while(guesses>0&&player!=first)
  {
   cout<<"請(qǐng)您猜吧!";
   cin>>guess;
   if(badguess.find(guess)!=string::nposplayer.find(guess)!=string::npos)
   {
    cout<<"對(duì)不起,這個(gè)字母您已經(jīng)猜過(guò)了。";
    continue;
   }//判定是否已經(jīng)猜過(guò)
   int temp=first.find(guess);
   if(temp==string::npos)
   {
    cout<<"啊!猜錯(cuò)了。/n";
    guesses--;
    badguess+=guess;
   }//猜錯(cuò)后的處理
   else
   {
    player[temp]=guess;
    temp=first.find(guess,temp+1);
    while(temp!=string::npos)//繼續(xù)搜索該字符,看是否單詞中有多個(gè)該字符
    {
     player[temp]=guess;
     temp=first.find(guess,temp+1);
    }
   }
   cout<<"您還剩下"<<guesses<<"次猜錯(cuò)的機(jī)會(huì)。/n";
   cout<<"您當(dāng)前猜出的單詞:"<<player<<'/n';
   cout<<"您當(dāng)前猜錯(cuò)的字母集合:"<<badguess<<'/n';
  }
  if(guesses==0)
   cout<<"對(duì)不起,您失敗了。/n";
  else
   cout<<"您真棒!/n";
   cout<<"正確單詞為:"<<first<<'/n';
   cout << "Will you play again? <y/n> ";
   cin>>play;
 }

 system("PAUSE");
 return 0;
}
  下面是運(yùn)行結(jié)果:

Will you play a word game? <y/n> y
您有10次猜錯(cuò)的機(jī)會(huì)。
您的單詞:------------
請(qǐng)您猜吧!a
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:----------a-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!s
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:-----ss---a-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!p
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:p----ss---a-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!o
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:p-o--ss-o-a-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!r
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:pro--ss-o-a-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!f
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:prof-ss-o-a-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!e
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:profess-o-a-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!i
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:professio-a-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!n
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:professiona-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!l
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:professional
您當(dāng)前猜錯(cuò)的字母集合:
您真棒!
正確單詞為:professional
Will you play again? <y/n> n
請(qǐng)按任意鍵繼續(xù). . . 更多文章 更多內(nèi)容請(qǐng)看C/C++技術(shù)專題  網(wǎng)絡(luò)游戲攻略  游戲開(kāi)發(fā)專題,或


  三:程序分析
   
  程序的運(yùn)行結(jié)果大家都看到了,符合該游戲的規(guī)則,隨機(jī)性也較強(qiáng),這就是C++的強(qiáng)大。

  我們判定字母是否已經(jīng)被猜過(guò),是這樣做的:

if(badguess.find(guess)!=string::npos
player.find(guess)!=string::npos)
{
 cout<<"對(duì)不起,這個(gè)字母您已經(jīng)猜過(guò)了。";
 continue;
}//判定是否已經(jīng)猜過(guò)
  因?yàn)榧偃缱帜副徊逻^(guò),那么它要么在玩家猜出的殘缺單詞中,要么處于錯(cuò)誤字母集合中,我們用find函數(shù)在這兩處分別進(jìn)行了搜索。

  對(duì)于猜錯(cuò)后的處理,我們又是這樣做的:

int temp=first.find(guess);
if(temp==string::npos)
{
 cout<<"啊!猜錯(cuò)了。/n";
 guesses--;
 badguess+=guess;
}//猜錯(cuò)后的處理
  首先,我們查找這個(gè)字符是否在單詞中出現(xiàn)。假如沒(méi)有出現(xiàn),find函數(shù)將返回string::npos。npos是一個(gè)常量,比string能存儲(chǔ)的最大元素?cái)?shù)多1。假如沒(méi)有出現(xiàn),我們先是將猜錯(cuò)的機(jī)會(huì)減去一次,再用了這個(gè)代碼:badguess+=guess;將錯(cuò)誤的字母加入badguess對(duì)象中。想想,這要用常規(guī)字符數(shù)組有多難?

  最后,假如temp不是string::npos,那么我們就說(shuō)玩家猜對(duì)了。但可能這個(gè)單詞中有多個(gè)這樣的字母,所以,我們這樣做了:

temp=first.find(guess,temp+1);
while(temp!=string::npos)//繼續(xù)搜索該字符,看是否單詞中有多個(gè)該字符
{
 player[temp]=guess;
 temp=first.find(guess,temp+1);
}
  這樣一來(lái),逐步縮小區(qū)間,直到確認(rèn)單詞中再無(wú)這個(gè)字符為止。大家從運(yùn)行結(jié)果中也可以看到這一點(diǎn):

您當(dāng)前猜出的單詞:----------a-
您當(dāng)前猜錯(cuò)的字母集合:
請(qǐng)您猜吧!s
您還剩下10次猜錯(cuò)的機(jī)會(huì)。
您當(dāng)前猜出的單詞:-----ss---a-//將兩個(gè)“s”都顯示出來(lái)了
您當(dāng)前猜錯(cuò)的字母集合:
   
  大家若有愛(ài)好,可以對(duì)這個(gè)程序進(jìn)行擴(kuò)充,比如加入難度選擇、最后給出對(duì)玩家的評(píng)價(jià)等。最后,希望大家能通過(guò)這個(gè)范例,更加熱愛(ài)C++! 更多文章 更多內(nèi)容請(qǐng)看C/C++技術(shù)專題  網(wǎng)絡(luò)游戲攻略  游戲開(kāi)發(fā)專題,或

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 罗源县| 涡阳县| 岳阳县| 铜陵市| 新兴县| 华蓥市| 安陆市| 老河口市| 宕昌县| 肥城市| 盖州市| 桦南县| 荔波县| 清河县| 景宁| 石泉县| 大同县| 洛扎县| 桂东县| 阿拉善左旗| 墨脱县| 肥西县| 金川县| 阜阳市| 湟源县| 启东市| 麻江县| 保定市| 抚宁县| 农安县| 随州市| 兴义市| 渝中区| 育儿| 开鲁县| 中宁县| 和静县| 镇沅| 通城县| 汤阴县| 宜兰市|