else
cout<<"您真棒!\n";
cout<<"正確單詞為:"<
cout << "Will you play again?
cin>>play;
}
system("PAUSE");
return 0;
}
下面是執行結果:
Will you play a word game?
您有10次猜錯的機會。
您的單詞:------------
請您猜吧!a
您還剩下10次猜錯的機會。
您當前猜出的單詞:----------a-
您當前猜錯的字母集合:
請您猜吧!s
您還剩下10次猜錯的機會。
您當前猜出的單詞:-----ss---a-
您當前猜錯的字母集合:
請您猜吧!p
您還剩下10次猜錯的機會。
您當前猜出的單詞:p----ss---a-
您當前猜錯的字母集合:
請您猜吧!o
您還剩下10次猜錯的機會。
您當前猜出的單詞:p-o--ss-o-a-
您當前猜錯的字母集合:
請您猜吧!r
您還剩下10次猜錯的機會。
您當前猜出的單詞:pro--ss-o-a-
您當前猜錯的字母集合:
請您猜吧!f
您還剩下10次猜錯的機會。
您當前猜出的單詞:prof-ss-o-a-
您當前猜錯的字母集合:
請您猜吧!e
您還剩下10次猜錯的機會。
您當前猜出的單詞:profess-o-a-
您當前猜錯的字母集合:
請您猜吧!i
您還剩下10次猜錯的機會。
您當前猜出的單詞:professio-a-
您當前猜錯的字母集合:
請您猜吧!n
您還剩下10次猜錯的機會。
您當前猜出的單詞:professiona-
您當前猜錯的字母集合:
請您猜吧!l
您還剩下10次猜錯的機會。
您當前猜出的單詞:professional
您當前猜錯的字母集合:
您真棒!
正確單詞為:professional
Will you play again?
請按任意鍵繼續. . .
三:程式分析
程式的執行結果大家都看到了,符合該遊戲的規則,隨機性也較強,這就是C++的強大。
我們判斷字母是否已經被猜過,是這樣做的:
if(badguess.find(guess)!=string::npos
player.find(guess)!=string::npos)
{
cout<<"對不起,這個字母您已經猜過了。";
continue;
}//判斷是否已經猜過
因為如果字母被猜過,那麼它要麼在玩家猜出的殘缺單詞中,要麼處於錯誤字母集合中,我們用find函式在這兩處分別進行了搜尋。
對於猜錯後的處理,我們又是這樣做的:
int temp=first.find(guess);
if(temp==string::npos)
{
cout<<"啊!猜錯了。\n";
guesses--;
badguess+=guess;
}//猜錯後的處理
首先,我們查詢這個字元是否在單詞中出現。如果沒有出現,find函式將返回string::npos。npos是一個常量,比string能儲存的最大元素數多1。如果沒有出現,我們先是將猜錯的機會減去一次,再用了這個程式碼:badguess+=guess;將錯誤的字母加入badguess物件中。想想,這要用常規字元陣列有多難?
最後,如果temp不是string::npos,那麼我們就說玩家猜對了。但可能這個單詞中有多個這樣的字母,所以,我們這樣做了:
temp=first.find(guess,temp+1);
while(temp!=string::npos)//繼續搜尋該字元,看是否單詞中有多個該字元
{
player[temp]=guess;
temp=first.find(guess,temp+1);
}
這樣一來,逐步縮小區間,直到確認單詞中再無這個字元為止。大家從執行結果中也可以看到這一點:
您當前猜出的單詞:----------a-
您當前猜錯的字母集合:
請您猜吧!s
您還剩下10次猜錯的機會。
您當前猜出的單詞:-----ss---a-//將兩個“s”都顯示出來了
您當前猜錯的字母集合: