c++課程設(shè)計(jì)報(bào)告--幸運(yùn)52_第1頁(yè)
已閱讀1頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  目錄</b></p><p>  1.基本功能描述1</p><p><b>  2.設(shè)計(jì)思路1</b></p><p><b>  3.軟件設(shè)計(jì)3</b></p><p><b>  3.1設(shè)計(jì)步驟3</b><

2、/p><p><b>  3.2界面設(shè)計(jì)5</b></p><p>  3.3關(guān)鍵功能的實(shí)現(xiàn)7</p><p>  4.結(jié)論與心得體會(huì)8</p><p><b>  5.參考文獻(xiàn)9</b></p><p><b>  6.思考題9</b></

3、p><p><b>  7.附錄10</b></p><p>  7.1調(diào)試報(bào)告10</p><p>  7.2測(cè)試結(jié)果11</p><p>  7.3關(guān)鍵源代碼15</p><p><b>  幸運(yùn)52</b></p><p><b>

4、  1.基本功能描述</b></p><p> ?。?)首先點(diǎn)擊運(yùn)行程序,進(jìn)入到程序主界面。當(dāng)用戶在沒(méi)有點(diǎn)擊“開(kāi)始”按鈕之前,點(diǎn)擊確定按鈕時(shí),系統(tǒng)將彈出對(duì)話框,提示“請(qǐng)先單擊‘開(kāi)始’按鈕開(kāi)始選擇商品”;當(dāng)用戶在點(diǎn)擊“開(kāi)始”按鈕后,即啟動(dòng)計(jì)時(shí)器,系統(tǒng)將隨機(jī)給出一件商品并在界面上顯示商品的名稱,用戶即可根據(jù)這些信息對(duì)商品進(jìn)行估價(jià)。</p><p> ?。?)游戲開(kāi)始后,在規(guī)定時(shí)間內(nèi)

5、,用戶在沒(méi)有輸入價(jià)格的情況下,單擊確定按鈕,系統(tǒng)將彈出對(duì)話框,提示“請(qǐng)先輸入商品價(jià)格,再進(jìn)行提交”;當(dāng)輸入估計(jì)的價(jià)格并單擊“確定”按鈕,系統(tǒng)將會(huì)彈出一個(gè)消息框用來(lái)提示估價(jià)是猜對(duì)啦、高啦或是低啦,在彈出的消息框中單擊“確定”按鈕后,即可以再次進(jìn)行估價(jià)。用戶對(duì)同一商品的估價(jià)的次數(shù)不得超過(guò)6次。超過(guò)6次后系統(tǒng)將彈出對(duì)話框提示,“你的猜測(cè)次數(shù)已經(jīng)大于6次,將自動(dòng)進(jìn)入到下一件商品的估價(jià)!”,單擊“確定”按鈕后自動(dòng)進(jìn)入下一件商品的估價(jià)。</p

6、><p>  (3)游戲過(guò)程中,如果對(duì)當(dāng)前的成績(jī)不是很滿意,可以點(diǎn)擊重新開(kāi)始,系統(tǒng)會(huì)重新啟動(dòng)定時(shí)器,并將隨機(jī)給出一件商品并在界面上顯示商品的名稱,即可以重新對(duì)商品進(jìn)行估價(jià),上一局游戲的成績(jī)將被清零。當(dāng)點(diǎn)擊“查看最高紀(jì)錄”按鈕,系統(tǒng)將彈出對(duì)話框,顯示“最多猜中次數(shù)”及“姓名”。</p><p> ?。?)當(dāng)計(jì)時(shí)結(jié)束時(shí),系統(tǒng)將彈出對(duì)話框,提示“時(shí)間到了,游戲結(jié)束”,此時(shí),如果用戶創(chuàng)造了最高紀(jì)錄,系

7、統(tǒng)將自動(dòng)彈出對(duì)話框,用戶可在彈出的對(duì)話框內(nèi)輸入姓名,點(diǎn)擊確定,系統(tǒng)將保存最高紀(jì)錄并退出。</p><p><b>  2.設(shè)計(jì)思路</b></p><p>  首先利用MFC應(yīng)用程序向?qū)е谱骰緦?duì)話框的界面,按照自己預(yù)先設(shè)計(jì)的樣式進(jìn)行界面的制作。確定按鈕的個(gè)數(shù),位置;編輯框的個(gè)數(shù),位置,部分編輯框的屬性需設(shè)置為只讀;靜態(tài)文本框的提示文字、位置等等。其次,給每一個(gè)控件修

8、改ID以便于自己的識(shí)別。做好界面以后,可以按照如下的程序流程圖來(lái)編寫程序:</p><p>  主程序 子程序2</p><p>  圖1 幸運(yùn)52游戲程序流程圖</p><p>  程序設(shè)計(jì)的思路是按照程序需要實(shí)現(xiàn)的功能來(lái)進(jìn)行。第一,要確定哪些控件需要關(guān)聯(lián)消息響應(yīng)函數(shù),每一個(gè)函數(shù)該如何編寫,實(shí)現(xiàn)該功能的函數(shù)是否為MFC類庫(kù)中的函數(shù);

9、第二,要分清楚各函數(shù)之間的調(diào)用關(guān)系,以及函數(shù)的帶參數(shù)情況。第三,要區(qū)分哪些是基本功能,需要優(yōu)先實(shí)現(xiàn),哪些是附加功能,在基本功能之后實(shí)現(xiàn)。</p><p>  在對(duì)話框類頭文件中設(shè)定三個(gè)數(shù)組,分別用來(lái)存儲(chǔ)商品的圖片(Bitmap[12])、名稱(name[12])和價(jià)格(price[12]);在構(gòu)造函數(shù)中完成相應(yīng)的初始化,在初始化函數(shù)中設(shè)定計(jì)時(shí)器初值與范圍?!伴_(kāi)始”按鈕關(guān)聯(lián)的函數(shù)中,啟動(dòng)計(jì)時(shí)器,自動(dòng)調(diào)用OnTime

10、r(),并產(chǎn)生一個(gè)隨機(jī)數(shù)num,作為商品名稱數(shù)組與圖片數(shù)組的下標(biāo),使界面上顯示對(duì)應(yīng)商品的名稱與圖片?!按_定”按鈕對(duì)應(yīng)的函數(shù)中,將用戶的估價(jià)與商品的真實(shí)價(jià)格進(jìn)行比較,高于、低于或等于均彈出對(duì)話框給出提示。在OnTimer()中實(shí)現(xiàn)進(jìn)度條的前進(jìn),當(dāng)計(jì)時(shí)結(jié)束后,取存取最高紀(jì)錄文本中的次數(shù)與本輪正確次數(shù)相比較,若本輪正確次數(shù)大于歷史成績(jī),彈出一個(gè)對(duì)話框,要求用戶輸入自己的姓名,并將該次數(shù)存儲(chǔ)在score.txt文件中,姓名則存儲(chǔ)在name.tx

11、t文件中。在“查看最高紀(jì)錄”按鈕關(guān)聯(lián)的函數(shù)中,打開(kāi)上述兩個(gè)文檔,按設(shè)定的格式輸出文件里面的內(nèi)容。在“重新開(kāi)始”按鈕對(duì)應(yīng)函數(shù)中,重新設(shè)置進(jìn)度條初值為0,清零上一局游戲的成績(jī)并調(diào)用“開(kāi)始”按鈕所關(guān)聯(lián)的函數(shù)。如果用戶希望結(jié)束游戲則可以單擊“取消”按鈕,游戲結(jié)束。</p><p><b>  3.軟件設(shè)計(jì)</b></p><p><b>  3.1設(shè)計(jì)步驟</

12、b></p><p> ?。?)打開(kāi)Microsoft Visual C++ 6.0應(yīng)用程序,在File菜單下選擇NEW,創(chuàng)建MFC AppWizard(exe)工程,鍵入的工程名為tanglei,在應(yīng)用程序類型中選擇基本對(duì)話框,其他屬性直接選用默認(rèn),單擊“確定”完成對(duì)話框的創(chuàng)建。最后彈出新建工程信息對(duì)話框,該對(duì)話框列出了關(guān)于新建的應(yīng)用程序項(xiàng)目文件的相關(guān)信息。單擊確定,應(yīng)用程序向?qū)械墓ぷ骶腿客瓿闪?,?/p>

13、時(shí)向?qū)橛脩羯闪艘粋€(gè)可執(zhí)行的應(yīng)用程序框架。</p><p>  圖2 選擇基于對(duì)話框,其他默認(rèn),單擊“完成”</p><p>  初始化界面,在對(duì)話框中添加所需的控件,如按鈕,文本,編輯框,菜單,Picture控件,進(jìn)度條,將它們放置在相應(yīng)的位置上。根據(jù)需要對(duì)其屬性進(jìn)行修改,添加對(duì)應(yīng)的控件變量,并建立類向?qū)?,在相?yīng)的地方添加響應(yīng)函數(shù)。</p><p>  圖3

14、 添加控件并設(shè)定屬性</p><p> ?。?)在實(shí)現(xiàn)文件.cpp中添加實(shí)現(xiàn)功能所需要的各種函數(shù),并添加相應(yīng)的代碼,同時(shí)在頭文件中添加對(duì)各種函數(shù)及變量的聲明。</p><p> ?。?)對(duì)完成后的程序進(jìn)行調(diào)試,修改其中的錯(cuò)誤,直到程序運(yùn)行不再報(bào)錯(cuò),并能夠?qū)崿F(xiàn)所要求的各項(xiàng)功能。當(dāng)遇到不懂的報(bào)錯(cuò)可以用英語(yǔ)電子詞典翻譯錯(cuò)誤以幫助分析。</p><p><b> 

15、 3.2界面設(shè)計(jì)</b></p><p>  (1)初始化界面如下所示:</p><p>  圖4 主界面初始顯示圖</p><p> ?。?)主對(duì)話框控件設(shè)置如下:</p><p>  表1 主界面對(duì)話框控件表</p><p> ?。?)主界面按鈕響應(yīng)函數(shù)表如下:</p><p&g

16、t;  表2 主界面按鈕響應(yīng)函數(shù)表</p><p> ?。?)打破紀(jì)錄對(duì)話框界面如下所示:</p><p>  圖5 打破紀(jì)錄對(duì)話框顯示圖</p><p> ?。?)打破紀(jì)錄對(duì)話框控件設(shè)置如下:</p><p>  表3 輸入姓名對(duì)話框控件表</p><p>  3.3關(guān)鍵功能的實(shí)現(xiàn)</p>&

17、lt;p> ?。?)輸入焦點(diǎn)的控制:當(dāng)運(yùn)行程序時(shí)或比較價(jià)格后應(yīng)該設(shè)置焦點(diǎn)使得光標(biāo)在在估價(jià)輸入框上,在OnBegin()函數(shù)中采用GetDlgItem(IDC_PRICE)->SetFocus()實(shí)現(xiàn)。這樣每一次按下“確定”按鈕都會(huì)將焦點(diǎn)設(shè)定在估價(jià)輸入編輯框內(nèi)。</p><p>  (2)設(shè)計(jì)初始界面:首先生成一個(gè)基于對(duì)話框的基本框架,再添加控件例如按鈕,編輯框,位圖,進(jìn)度條等,并設(shè)置屬性,然后為相關(guān)控

18、件關(guān)聯(lián)變量,為具有操作功能的按鈕添加必要的消息響應(yīng)函數(shù)。</p><p>  (3)隨機(jī)顯示某一種商品:首先引入13張位圖資源,ID號(hào)設(shè)置為IDB_BITMAP0到IDB_BITMAP12,其中圖像控件的ID設(shè)為IDB_BITMAP12,這樣在游戲未開(kāi)始時(shí)即顯示該宣傳圖片。然后,在對(duì)話框類的聲明文件中定義三個(gè)數(shù)組,分別存儲(chǔ)商品的名稱、價(jià)格和圖片;接著在對(duì)話框類的構(gòu)造函數(shù)中為名稱和價(jià)格數(shù)組初始化,并采用LoadBi

19、tmap( )實(shí)現(xiàn)位圖的加載來(lái)完成圖片數(shù)組的初始化,并使同一商品在三個(gè)數(shù)組中對(duì)應(yīng)的下標(biāo)相同;利用srand(time(NULL));num=rad( )%12產(chǎn)生一個(gè)0到11的隨機(jī)數(shù),將此隨機(jī)數(shù)作為數(shù)組的下標(biāo),選擇所要選擇的商品的三種屬性。</p><p>  (4)計(jì)時(shí):游戲開(kāi)始時(shí)在OnBegin()函數(shù)中調(diào)用SetTimer(1000,100,NULL)函數(shù)啟動(dòng)計(jì)時(shí)器并主動(dòng)調(diào)用OnTimer(UINT nID

20、Event)函數(shù)對(duì)進(jìn)度條進(jìn)行設(shè)置。其中SetTimer()函數(shù)第一個(gè)參數(shù)表示計(jì)時(shí)器的ID號(hào),第二個(gè)參數(shù)表示時(shí)間步長(zhǎng),以毫秒為單位,本程序設(shè)定100ms為步長(zhǎng),每隔步長(zhǎng)時(shí)間就發(fā)送一個(gè)WM_TIMER消息;收到此消息,程序會(huì)自動(dòng)執(zhí)行OnTimer函數(shù),每執(zhí)行一次此函數(shù)就會(huì)讓進(jìn)度條前進(jìn)一步;設(shè)定進(jìn)度條共有300步,則游戲設(shè)定的總時(shí)間為30s。</p><p> ?。?)對(duì)估價(jià)的判斷與正確次數(shù)、錯(cuò)誤次數(shù)的統(tǒng)計(jì):取用戶輸入

21、估價(jià)與真實(shí)價(jià)格進(jìn)行比較,若估價(jià)與真實(shí)價(jià)格不符,則彈出提示消息框提示“高啦”還是“低啦”并使錯(cuò)誤次數(shù)i加1,再比較i與6的大小,i≥6即一件商品的估價(jià)次數(shù)已達(dá)到六次,此時(shí)將i清零,并使猜錯(cuò)次數(shù)的變量error加1,且前臺(tái)更新顯示;若估價(jià)與真實(shí)價(jià)格相等,則使正確次數(shù)j加1同時(shí)使錯(cuò)誤次數(shù)i為0,接著調(diào)用OnBegin()函數(shù)顯示下一種商品。</p><p> ?。?)對(duì)歷史最高紀(jì)錄的處理:歷史最高紀(jì)錄不僅僅只是程序本次

22、運(yùn)行的最高紀(jì)錄,而應(yīng)該是程序以往運(yùn)行與本次運(yùn)行共同的歷史最高紀(jì)錄,若在程序中設(shè)定兩個(gè)變量用來(lái)存儲(chǔ)最多猜中次數(shù)與姓名,在退出程序時(shí),變量會(huì)被消毀,因此實(shí)現(xiàn)不了此功能。為此,在工程文件夾中創(chuàng)建兩個(gè)文本文檔分別為score.txt與name.txt,分別用來(lái)存儲(chǔ)最高紀(jì)錄的次數(shù)和姓名。每輪游戲計(jì)時(shí)結(jié)束時(shí)將讀取score.txt中內(nèi)容與本輪正確次數(shù)j比較,若j大于其中內(nèi)容,便彈出一個(gè)對(duì)話框要求用戶輸入自己的名字,并將輸入的姓名替代name.txt

23、中的內(nèi)容,同時(shí)將j代替score.txt中的內(nèi)容。</p><p> ?。?)查看最高紀(jì)錄:當(dāng)用戶查看最高紀(jì)錄時(shí),分別從score.txt和name.txt中讀取最高紀(jì)錄次數(shù)與姓名,在對(duì)話框中予以顯示。</p><p> ?。?)重新開(kāi)始游戲:當(dāng)用戶重新開(kāi)始游戲時(shí),將變量i、j和error清零,對(duì)進(jìn)度條重新進(jìn)行設(shè)置,使其初值為0,再調(diào)用“開(kāi)始”按鈕對(duì)應(yīng)的CTangleiDlg::OnBeg

24、in()函數(shù)。 </p><p><b>  4.結(jié)論與心得體會(huì)</b></p><p>  這次課程設(shè)計(jì)總的來(lái)說(shuō)對(duì)我起到了很大的鍛煉作用,時(shí)間上來(lái)說(shuō)還是比較緊張的,剛開(kāi)始畫(huà)出程序流程圖還是比較輕松的。之后的兩天時(shí)間便是程序設(shè)計(jì)與調(diào)試了,雖然已經(jīng)學(xué)習(xí)過(guò)VC++語(yǔ)言,MFC編程這塊也講到了一些,但是課程學(xué)習(xí)距現(xiàn)在的課程設(shè)計(jì)有一段時(shí)間了,有些東西只是有些印象,當(dāng)真正用起來(lái)

25、的時(shí)候,還是有些不熟練,其間,有查閱了一些資料和課件PPT,主要是對(duì)控件該關(guān)聯(lián)什么類型的變量,以及這些變量該如何使用,對(duì)一些具有操作功能的按鈕關(guān)聯(lián)消息響應(yīng)函數(shù)后,如何編寫這些函數(shù)的實(shí)現(xiàn)代碼以及各個(gè)函數(shù)之間的調(diào)用是難點(diǎn)。系統(tǒng)提供的類的函數(shù)是相當(dāng)多的,想要把它們?nèi)颗缓笤陂_(kāi)始編寫程序幾乎是不可能的。只能是用到哪個(gè)函數(shù)再去具體的了解它,這樣上手比較快,學(xué)習(xí)積極性也較高。</p><p>  這次的課程設(shè)計(jì)的題目是采

26、用抽簽的方式來(lái)選定的,當(dāng)選到幸運(yùn)52之后,自己對(duì)幸運(yùn)52還是有一點(diǎn)的了解的,而且本次的課程設(shè)計(jì)的要求也只是要實(shí)現(xiàn)基本的功能。剛開(kāi)始做程序界面還是比較輕松的,在設(shè)置控件的ID號(hào)時(shí),盡量用其英文名來(lái)設(shè)置,這樣識(shí)別起來(lái)很方便。之后,在對(duì)控件進(jìn)行關(guān)聯(lián)變量時(shí),就有些犯難了,不知道該對(duì)這些控件關(guān)聯(lián)什么類型的變量,使用起來(lái)才比較方便,對(duì)一些具有操作功能的按鈕關(guān)聯(lián)消息響應(yīng)函數(shù)也是如此。首先就是看書(shū)了,花了一部分時(shí)間將以前學(xué)習(xí)C++的教材中的MFC部分看

27、了一下,將最基本的控件使用方法看完,比如編輯框,按鈕,picture控件,菜單等。</p><p>  在我看來(lái),對(duì)游戲記錄的保存與讀取是另一大難點(diǎn),因?yàn)樯婕暗綄?duì)文件的讀寫等操作,這些函數(shù)平時(shí)聯(lián)系的較少,只能自己找一找手頭的資料,看幾個(gè)例子大概熟悉了它的基本用法,然后再開(kāi)始編寫相應(yīng)的實(shí)現(xiàn)代碼。就這樣一點(diǎn)一點(diǎn)地完成了基本功能的設(shè)計(jì),之后就是對(duì)程序的完善與修改了,如輸入焦點(diǎn)的控制、未點(diǎn)擊“開(kāi)始”選擇商品或未輸入商品價(jià)

28、格等的錯(cuò)誤提示。課程設(shè)計(jì)這幾天收獲了很多,課堂上學(xué)的東西基本上都用上了,其間也遇到了很多的問(wèn)題,在解決這些問(wèn)題的時(shí)候,也積累了很多經(jīng)驗(yàn),對(duì)MFC的控件添加變量更加熟練了,對(duì)于用到的函數(shù)也更了解了??傊?,自己還是得到了很大的鍛煉,也收獲很多。</p><p><b>  5.參考文獻(xiàn)</b></p><p>  [1]揣錦華.面向?qū)ο蟪绦蛟O(shè)計(jì)與VC++實(shí)踐.西安:西安電

29、子科技大學(xué)出版社,2005.</p><p>  [2]譚浩強(qiáng).C++面向?qū)ο蟪绦蛟O(shè)計(jì).北京:清華大學(xué)出版社,2006.</p><p>  [3]嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版).北京:清華大學(xué)出版社,2007.</p><p><b>  6.思考題</b></p><p> ?。?) 說(shuō)明保存記錄文件信息的方法

30、,考慮是否還能用其他方法實(shí)現(xiàn)?</p><p>  答:在工程文件夾中創(chuàng)建兩個(gè)文本文檔分別為score.txt與name.txt,分別存儲(chǔ)最高紀(jì)錄的次數(shù)與姓名。每輪游戲計(jì)時(shí)結(jié)束時(shí)讀取score.txt中內(nèi)容與本輪正確次數(shù)j比較,若j大于其中內(nèi)容,便彈出一個(gè)對(duì)話框要求用戶輸入自己的名字,并將該名字替代name.txt中的內(nèi)容,同時(shí)將j代替score.txt中的內(nèi)容。</p><p>  (2

31、) 說(shuō)明商品名稱和商品圖片、商品價(jià)格一一對(duì)應(yīng)的關(guān)鍵部分?</p><p>  答:在對(duì)話框類的聲明文件中定義三個(gè)數(shù)組Bitmap[12]、name[12]、price[12],分別用來(lái)存儲(chǔ)商品的圖片、名稱和價(jià)格,接著在引入資源時(shí)候按照商品順序引入位圖資源,并且逐個(gè)命名位圖ID號(hào);之后在對(duì)話框類的構(gòu)造函數(shù)中為商品名稱與價(jià)格數(shù)組初始化,并采用LoadBitmap()實(shí)現(xiàn)位圖的加載來(lái)完成圖片數(shù)組的初始化,并使同一商品在

32、三個(gè)數(shù)組中對(duì)應(yīng)的下標(biāo)相同。這樣,便將商品名稱和商品圖片、商品價(jià)格一一對(duì)應(yīng)起來(lái)。</p><p> ?。?) 如何在游戲未開(kāi)始時(shí)顯示空白位圖?</p><p>  答:在位圖資源中插入一張空白位圖,再將“圖像”選為該空白位圖的屬性ID,初始化函數(shù)中使用LoadBitmap()函數(shù)調(diào)用該空白位圖。</p><p><b>  7.附錄</b>&l

33、t;/p><p><b>  7.1調(diào)試報(bào)告</b></p><p> ?。?)加載圖片的尺寸過(guò)大:剛開(kāi)始在做好界面后,引入13張位圖資源,ID號(hào)設(shè)置為IDB_BITMAP0到IDB_BITMAP12,其中圖像控件的ID設(shè)為IDB_BITMAP12,發(fā)現(xiàn)加載的圖片尺寸過(guò)大,查過(guò)了設(shè)計(jì)界面的邊框很多,于是同時(shí)圖片處理工具,將圖片尺寸縮小大適合界面大小。</p>

34、<p>  未定義的錯(cuò)誤:在調(diào)試的過(guò)程中會(huì)出現(xiàn)某些變量未定義(undeclared identifier),導(dǎo)致這種錯(cuò)誤有可能是在對(duì)控件建立類向?qū)У臅r(shí)候沒(méi)有添加變量,也有可能是在添加代碼的時(shí)候變量名輸錯(cuò)導(dǎo)致的;對(duì)變量建立類向?qū)У臅r(shí)候添加變量或者改正錯(cuò)誤的變量名就能改正這種錯(cuò)誤。</p><p>  變量申明的位置不對(duì):調(diào)試過(guò)程中遇到了如下的問(wèn)題,截圖如下,在對(duì)話框類的聲明文件中定義三個(gè)數(shù)組Bitmap

35、[12]的申明在//AFX_DATA(CTangleiDlg)的下面,導(dǎo)致在主界面建立類向?qū)r(shí)彈出窗口,顯示該錯(cuò)誤,將Bitmap[12]的申明放在// Construction的下面,問(wèn)題得到了解決。</p><p>  圖6 調(diào)試過(guò)程中變量申明的位置錯(cuò)誤</p><p> ?。?)添加了打開(kāi)文件的相關(guān)代碼后,編譯顯示相關(guān)語(yǔ)句沒(méi)有定義不能識(shí)別:這是由于忘了加頭文件;加上#include

36、 "fstream.h"后編譯成功。</p><p> ?。?)重新開(kāi)始游戲后,顯示本輪正確次數(shù)為上輪正確次數(shù):沒(méi)有在“重新開(kāi)始”按鈕的響應(yīng)函數(shù)中將本輪正確次數(shù)j清零;加上j=0;語(yǔ)句后正確。</p><p> ?。?)當(dāng)用戶打破記錄時(shí),彈出對(duì)話框提示用戶輸入姓名,點(diǎn)擊確定后,再次運(yùn)行程序后點(diǎn)擊“查看最高紀(jì)錄”,紀(jì)錄不正確:用戶的名字沒(méi)有被保存下來(lái),還是原先的值,在判斷

37、打破記錄語(yǔ)句(if(j>s))下面添加如下代碼即可:</p><p>  fp=fopen("name.txt","w"); //打開(kāi)name文件,指向文件頭</p><p>  fprintf(fp,"%10s",s); //保存姓名</p><p>  fclose(fp);

38、 //關(guān)閉文件</p><p><b>  7.2測(cè)試結(jié)果</b></p><p>  游戲開(kāi)始直接點(diǎn)擊“確定”,顯示“請(qǐng)先單擊'開(kāi)始'按鈕選擇商品!”。</p><p>  圖7 未選擇商品顯示圖</p><p> ?。?)商品顯示時(shí)直接點(diǎn)擊“確定”,顯示“請(qǐng)先輸入商品價(jià)格,再進(jìn)行提

39、交!”。</p><p>  圖8 未輸入商品估價(jià)顯示圖</p><p> ?。?)輸入估價(jià)大于商品價(jià)格,點(diǎn)擊“確定”,顯示“估價(jià)高嘍,再低點(diǎn)!”。</p><p>  圖9 估價(jià)過(guò)高顯示圖</p><p> ?。?)輸入估價(jià)小于商品價(jià)格,點(diǎn)擊“確定”,顯示“估價(jià)低嘍,再高點(diǎn)!”。</p><p>  圖10

40、 估價(jià)過(guò)低顯示圖 </p><p> ?。?)輸入估價(jià)等于商品價(jià)格,點(diǎn)擊“確定”,顯示“恭喜您猜對(duì)了!”</p><p>  圖11 估價(jià)正確顯示圖</p><p> ?。?)計(jì)時(shí)結(jié)束,自動(dòng)彈出對(duì)話框,顯示“時(shí)間到了,游戲結(jié)束!”</p><p>  圖12 計(jì)時(shí)結(jié)束顯示圖</p><p> ?。?)當(dāng)估價(jià)次數(shù)超過(guò)

41、6次時(shí),自動(dòng)彈出對(duì)話框,顯示“你的猜測(cè)次數(shù)已經(jīng)大于6次,將自動(dòng)進(jìn)入到下一件商品的估價(jià)!”,點(diǎn)擊“確定”后,自動(dòng)進(jìn)入到下一件商品的估價(jià)。</p><p>  圖13 估價(jià)次數(shù)超過(guò)限制顯示圖</p><p> ?。?)當(dāng)本輪游戲打破歷史紀(jì)錄時(shí),自動(dòng)彈出對(duì)話框,要求用戶輸入姓名。</p><p>  圖14 打破紀(jì)錄彈出的對(duì)話框顯示圖</p><p

42、> ?。?)點(diǎn)擊“查看最高紀(jì)錄”,彈出對(duì)話框顯示最高猜中次數(shù)與姓名。</p><p>  圖15 查看最高紀(jì)錄顯示圖</p><p><b>  7.3關(guān)鍵源代碼</b></p><p><b>  變量聲明:</b></p><p>  class CTangleiDlg : public

43、 CDialog</p><p><b>  {</b></p><p>  // Construction</p><p>  CBitmap Bitmap[12]; //用來(lái)存放Bitmap圖</p><p>  CString name[12]; //用于保存商品名稱</p><p> 

44、 int num; //用于表示用隨機(jī)數(shù)產(chǎn)生的當(dāng)前商品的序號(hào)</p><p>  int i; //目前錯(cuò)誤次數(shù)</p><p>  int error; //猜錯(cuò)商品件數(shù)</p><p>  int j; //當(dāng)輪正確次數(shù)</p><p>  int price[12]; //用于保存商品的價(jià)格</p><

45、;p>  int flag;//用來(lái)標(biāo)識(shí)是否開(kāi)始</p><p><b>  public:</b></p><p>  CButtonm_yes;</p><p>  CStringm_false;</p><p>  CStringm_title;</p><p>  CStrin

46、gm_true;</p><p>  intm_price;</p><p><b>  }</b></p><p>  構(gòu)造函數(shù)對(duì)變量的初始化</p><p>  CTangleiDlg::CTangleiDlg(CWnd* pParent /*=NULL*/)</p><p>  :

47、CDialog(CTangleiDlg::IDD, pParent)</p><p><b>  {</b></p><p>  m_false = _T("");</p><p>  m_title = _T("");</p><p>  m_true = _T("&q

48、uot;);</p><p>  m_price = 0;</p><p>  i=0;//每件商品猜錯(cuò)次數(shù)初始化為0 </p><p>  j=0;//正確次數(shù)初始化為0</p><p>  error=0;//錯(cuò)誤次數(shù)初始化為0</p><p>  flag=0;//標(biāo)志先設(shè)為0</p><p&

49、gt;  num=-1; //當(dāng)隨機(jī)數(shù)為-1表示沒(méi)有選擇商品</p><p>  name[0]="帆布鞋";//商品名數(shù)組初始化</p><p>  name[1]="單肩包";</p><p>  name[2]="領(lǐng)帶";</p><p>  name[3]="石

50、英表";</p><p>  name[4]="太陽(yáng)眼鏡";</p><p>  name[5]="藍(lán)牙耳機(jī)";</p><p>  name[6]="九陽(yáng)豆?jié){機(jī)";</p><p>  name[7]="學(xué)生計(jì)算器";</p><p

51、>  name[8]="佳能單反相機(jī)";</p><p>  name[9]="飛科剃須刀";</p><p>  name[10]="李寧羽毛球拍";</p><p>  name[11]="保溫杯";</p><p>  price[0]=69;//

52、價(jià)格數(shù)組初始化</p><p>  price[1]=168;</p><p>  price[2]=138;</p><p>  price[3]=538;</p><p>  price[4]=188;</p><p>  price[5]=100;</p><p>  price[6]=3

53、99;</p><p>  price[7]=49;</p><p>  price[8]=4886;</p><p>  price[9]=79;</p><p>  price[10]=199;</p><p>  price[11]=42;</p><p>  Bitmap[0].L

54、oadBitmap(IDB_BITMAP0);//位圖數(shù)組初始化,加載位圖</p><p>  Bitmap[1].LoadBitmap(IDB_BITMAP1);</p><p>  Bitmap[2].LoadBitmap(IDB_BITMAP2);</p><p>  Bitmap[3].LoadBitmap(IDB_BITMAP3);</p>

55、<p>  Bitmap[4].LoadBitmap(IDB_BITMAP4);</p><p>  Bitmap[5].LoadBitmap(IDB_BITMAP5);</p><p>  Bitmap[6].LoadBitmap(IDB_BITMAP6);</p><p>  Bitmap[7].LoadBitmap(IDB_BITMAP7);<

56、/p><p>  Bitmap[8].LoadBitmap(IDB_BITMAP8);</p><p>  Bitmap[9].LoadBitmap(IDB_BITMAP9);</p><p>  Bitmap[10].LoadBitmap(IDB_BITMAP10);</p><p>  Bitmap[11].LoadBitmap(IDB_BI

57、TMAP11);}</p><p>  (3) 初始化函數(shù)對(duì)進(jìn)度條的設(shè)置</p><p>  BOOL CTangleiDlg::OnInitDialog()</p><p><b>  {</b></p><p>  CDialog::OnInitDialog();</p><p>  CPr

58、ogressCtrl* pProg =(CProgressCtrl*) GetDlgItem(IDC_PROGRESS1); </p><p>  //設(shè)置指向進(jìn)度條的指針</p><p>  pProg->SetRange(0, 300); //設(shè)置范圍為0~300</p><p>  pProg->SetPos(0); //設(shè)置當(dāng)前位置為0</

59、p><p><b>  }</b></p><p>  (4) “開(kāi)始”按鈕響應(yīng)的函數(shù)</p><p>  void CTangleiDlg::OnBegin() </p><p><b>  {</b></p><p>  GetDlgItem(IDC_PRICE)->

60、;SetFocus();//程序最開(kāi)始的時(shí)候聚焦到商品價(jià)格編輯框</p><p>  m_true.Format("%d",j); </p><p>  m_false.Format("%d",i); </p><p>  srand(time (NULL)); //利用時(shí)間設(shè)置隨機(jī)種子</p><p&g

61、t;  num=rand()%12; //產(chǎn)生一個(gè)0到11的隨機(jī)數(shù)</p><p>  m_title.Format("%s",name[num]); //用來(lái)顯示商品名稱 </p><p>  ((CStatic*)GetDlgItem(IDC_PICTURE))->SetBitmap(HBITMAP(Bitmap[num])); </p>&

62、lt;p>  //用來(lái)顯示商品圖片</p><p>  if(flag==0)</p><p><b>  {</b></p><p>  CProgressCtrl* pProg =(CProgressCtrl*) GetDlgItem(IDC_PROGRESS1);</p><p>  //設(shè)置指向進(jìn)度條的指針

63、</p><p>  pProg->SetPos(0); //設(shè)置初始值為0</p><p>  SetTimer(1000,100,NULL); //啟動(dòng)計(jì)時(shí)器,自動(dòng)調(diào)用OnTimer()函數(shù) </p><p>  flag=1;//啟動(dòng)定時(shí)器后將flag置1</p><p><b>  }</b></p&

64、gt;<p>  UpdateData(FALSE); </p><p><b>  }</b></p><p>  (5) “確定”按鈕響應(yīng)的函數(shù)</p><p>  void CTangleiDlg::OnYes() </p><p><b>  {</b></p>

65、;<p>  UpdateData(TRUE); </p><p>  if(num==-1) //當(dāng)用戶沒(méi)有點(diǎn)擊開(kāi)始,選擇商品</p><p><b>  {</b></p><p>  MessageBox("請(qǐng)先單擊'開(kāi)始'按鈕選擇商品!","錯(cuò)誤",MB_OK)

66、;</p><p>  GetDlgItem(IDC_PRICE)->SetFocus();//輸入焦點(diǎn)的控制</p><p><b>  return;</b></p><p><b>  } </b></p><p>  int priceTemp=m_price; //獲取估價(jià)進(jìn)行判

67、斷</p><p>  if(priceTemp==0) </p><p><b>  {</b></p><p>  MessageBox("請(qǐng)先輸入商品價(jià)格,再進(jìn)行提交!","錯(cuò)誤",MB_OK);</p><p>  GetDlgItem(IDC_PRICE)->Se

68、tFocus();</p><p><b>  return;</b></p><p><b>  }</b></p><p>  if(priceTemp==price[num])//估價(jià)正確</p><p><b>  {</b></p><p>

69、  MessageBox("恭喜您猜對(duì)了!","猜對(duì)了",MB_OK);//估價(jià)正確彈出對(duì)話框提示</p><p>  j++;//答對(duì)次數(shù)加1</p><p>  i=0;//該件商品答錯(cuò)次數(shù)清零 </p><p>  m_true.Format("%d",j);</p><p>

70、;  m_false.Format("%d",error); </p><p>  UpdateData(FALSE);//更新顯示</p><p>  OnBegin();//開(kāi)始下一件商品的估價(jià)</p><p><b>  }</b></p><p>  else if(priceTemp<

71、price[num])//估價(jià)低了</p><p><b>  {</b></p><p>  MessageBox("估價(jià)低嘍,再高點(diǎn)!","猜錯(cuò)了",MB_OK); </p><p>  //估價(jià)低了彈出對(duì)話框提示</p><p>  m_price=0;//清零,方便下一

72、次價(jià)格的輸入</p><p>  i++;//該件商品答錯(cuò)次數(shù)加1</p><p>  m_false.Format("%d",error);</p><p>  UpdateData(FALSE);//前臺(tái)更新顯示</p><p><b>  }</b></p><p> 

73、 else //估價(jià)高了</p><p><b>  {</b></p><p>  MessageBox("估價(jià)高嘍,再低點(diǎn)!","猜錯(cuò)了",MB_OK); </p><p>  //估價(jià)高了彈出對(duì)話框提示 </p><p>  m_price=0;//清零,方便下一

74、次價(jià)格的輸入</p><p>  i++; //該件商品答錯(cuò)次數(shù)加1</p><p>  m_false.Format("%d",error);</p><p>  UpdateData(FALSE);//前臺(tái)更新顯示</p><p><b>  }</b></p><p&g

75、t;  if(i==6) //錯(cuò)誤次數(shù)大于6次時(shí),自動(dòng)進(jìn)入到下一件商品的估價(jià)</p><p><b>  {</b></p><p>  MessageBox("你的猜測(cè)次數(shù)已經(jīng)大于6次,將自動(dòng)進(jìn)入到下一件商品的估價(jià)!");</p><p>  GetDlgItem(IDC_PRICE)->SetFocus();

76、</p><p>  i=0;//該件商品答錯(cuò)次數(shù)清零</p><p>  error++;//商品答錯(cuò)件數(shù)加1</p><p>  OnBegin();//開(kāi)始下一一件商品的估價(jià)</p><p>  m_false.Format("%d",error);</p><p>  Update

77、Data(FALSE); //錯(cuò)誤次數(shù)加1且前臺(tái)更新顯示</p><p><b>  }</b></p><p>  (6) “查看最高紀(jì)錄”按鈕響應(yīng)的函數(shù)</p><p>  void CTangleiDlg::OnCheck() </p><p><b>  {</b></p&g

78、t;<p>  // TODO: Add your control notification handler code here</p><p>  FILE*out;//指向文件的指針</p><p>  out=fopen("score.txt","r");//打開(kāi)文件,指向文件頭</p><p&

79、gt;  char str1[10];//用于存貯紀(jì)錄的次數(shù)</p><p>  fgets(str1,4,out);//從文件中獲取4個(gè)字符存到str1中</p><p>  int s=atoi(str1);//將字符轉(zhuǎn)換為整型數(shù)據(jù)</p><p>  CString s1;//創(chuàng)建CString對(duì)象</p>

80、<p>  s1.Format("%d",s);//將整型次數(shù)s轉(zhuǎn)換為CString類型s1</p><p>  out=fopen("name.txt","r");</p><p>  char str2[20];//用于存貯記錄的姓名str2</p><p>  fgets(

81、str2,20,out);</p><p>  CString str;</p><p>  str="最多猜中次數(shù)為: "+s1+"次;"+" 姓名: "+str2;</p><p>  MessageBox(str,"最高紀(jì)錄",MB_OK);</p><p&

82、gt;<b>  }</b></p><p>  (7) “重新開(kāi)始”按鈕響應(yīng)的函數(shù)</p><p>  void CTangleiDlg::OnAgain() </p><p><b>  { </b></p><p>  i=0;j=0;//清除上一局記錄</p>&l

83、t;p>  flag=0;//flag標(biāo)志清零</p><p>  OnBegin() ;//調(diào)用OnBegin(),重新啟動(dòng)定時(shí)器</p><p><b>  }</b></p><p>  (8) OnTimer(UINT nIDEvent)函數(shù)</p><p>  void CTangleiDlg::O

84、nTimer(UINT nIDEvent) </p><p><b>  {</b></p><p>  // TODO: Add your message handler code here and/or call default</p><p>  CDialog::OnTimer(nIDEvent);</p><p&g

85、t;  if (nIDEvent == 1000) //判斷計(jì)時(shí)器</p><p><b>  {</b></p><p>  CProgressCtrl* pProg = (CProgressCtrl*) GetDlgItem(IDC_PROGRESS1); </p><p>  //設(shè)置指向進(jìn)度條的指針</p><p&

86、gt;  pProg->SetPos(pProg->GetPos()+1);//前進(jìn)一步</p><p>  if(pProg->GetPos() >= 300) //判斷是否達(dá)到最大值</p><p><b>  { </b></p><p>  KillTimer(nIDEvent);

87、 //終止計(jì)時(shí)器</p><p>  MessageBox("時(shí)間到了,游戲結(jié)束!","游戲結(jié)束",MB_OK); </p><p>  //彈出對(duì)話框提示時(shí)間到了</p><p>  FILE *out; //指向文件的指針</p><p

88、>  out=fopen("score.txt","r"); //打開(kāi)文件,指向文件頭</p><p>  char str1[10]; //用于存貯紀(jì)錄的次數(shù)</p><p>  fgets(str1,4,out); //從文件中獲取4個(gè)字符存到str1中<

89、/p><p>  int s=atoi(str1); //將字符轉(zhuǎn)換為整型數(shù)據(jù)</p><p>  if(j>s) //打破記錄,保存姓名和分?jǐn)?shù)</p><p><b>  {</b></p><p>  INPUTDLG dlgInput;

90、 // 聲明對(duì)話框變量</p><p>  if(dlgInput.DoModal() == IDOK) // 彈出模態(tài)對(duì)話框,若用戶點(diǎn)擊OK按鈕</p><p>  UpdateData(FALSE);</p><p>  CString s;//定義CString的變量s</p><p>  

91、s=dlgInput.m_name;//將輸入的姓名賦值給s</p><p>  FILE *fp; //指向文件的指針</p><p>  fp=fopen("name.txt","w"); //打開(kāi)name文件,指向文件頭</p><p>  fprintf(fp,"%

92、10s",s); //保存姓名</p><p>  fclose(fp); //關(guān)閉文件</p><p>  fp=fopen("score.txt","w"); //打開(kāi)score文件,指向文件頭</p><p>  fprintf(fp,"%d",j);

93、 //保存分?jǐn)?shù)</p><p>  fclose(fp); //關(guān)閉文件</p><p><b>  }</b></p><p>  CDialog::OnCancel();</p><p><b>  }</b></p>

94、<p><b>  }</b></p><p><b>  }</b></p><p>  (9) OnCancel()函數(shù)</p><p>  void CTangleiDlg::OnCancel() </p><p><b>  {</b></p>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論