利用C 編寫乙個猜字遊戲

2021-03-31 19:33:12 字數 3464 閱讀 3567

一:準備工作:

規則就是這麼多,我們應該用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。

二:遊戲源**:

下面是執行結果:

will you play a word game? y

您有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? n

請按任意鍵繼續. . .

:程式分析

程式的執行結果大家都看到了,符合該遊戲的規則,隨機性也較強,這就是c++的強大。

我們判斷字母是否已經被猜過,是這樣做的:

if(badguess.find(guess)!=string::npos||

player.find(guess)!=string::npos)

//判斷是否已經猜過

因為如果字母被猜過,那麼它要麼在玩家猜出的殘缺單詞中,要麼處於錯誤字母集合中,我們用find函式在這兩處分別進行了搜尋。

對於猜錯後的處理,我們又是這樣做的:

int temp=first.find(guess);

if(temp==string::npos)

//猜錯後的處理

首先,我們查詢這個字元是否在單詞中出現。如果沒有出現,find函式將返回string::npos。npos是乙個常量,比string能儲存的最大元素數多1。如果沒有出現,我們先是將猜錯的機會減去一次,再用了這個**:badguess+=guess;將錯誤的字母加入badguess物件中。想想,這要用常規字元陣列有多難?

最後,如果temp不是string::npos,那麼我們就說玩家猜對了。但可能這個單詞中有多個這樣的字母,所以,我們這樣做了:

您當前猜出的單詞:----------a-

您當前猜錯的字母集合:

請您猜吧!s

您還剩下10次猜錯的機會。

您當前猜出的單詞:-----ss---a-//將兩個「s」都顯示出來了

您當前猜錯的字母集合:

大家若有興趣,可以對這個程式進行擴充,比如加入難度選擇、最後給出對玩家的評價等。最後,希望大家能通過這個範例,更加熱愛c++!

乙個Python猜字小遊戲

同學的乙個程式設計題目 python猜謎小遊戲,產生隨機數,輸入猜的數字,大的話,輸出 大了 小的話,輸出 小了 猜對,輸出 恭喜你,猜對了 我又加了點東西,輸出乙個視窗化的介面,引用的是easygui模組。import easygui as g import random msg 在1現在開始猜吧...

c 利用類來完成乙個猜數字遊戲

遊戲開始介面 輸入錯誤 遊戲次數用盡 總結 比較簡單和粗糙 定義了乙個random用來生成隨機數,方便了很多 用了game類來進行遊戲內迴圈,有點長,但個人覺得這樣可以讓 可讀性提高很多,比較有層次 主要是用類可以寫很長看著爽 include include include using namesp...

簡單的乙個程式,猜字遊戲

6 猜對的次數 1 蘇進城 猜對的次數 1 coding utf 8 import random namedict go 1 a 0 while go 1 suiji random.randint 1,30 print 隨機數為 suiji name raw input 請輸入名字 if not n...