24點(diǎn)游戲設(shè)計(jì)報(bào)告_第1頁(yè)
24點(diǎn)游戲設(shè)計(jì)報(bào)告_第2頁(yè)
24點(diǎn)游戲設(shè)計(jì)報(bào)告_第3頁(yè)
24點(diǎn)游戲設(shè)計(jì)報(bào)告_第4頁(yè)
24點(diǎn)游戲設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基本功能描述24點(diǎn)游戲是一種常見(jiàn)的數(shù)學(xué)運(yùn)算游戲,玩游戲者只需根據(jù)系統(tǒng)給出的四張19的紙牌算出24即可,而程序主要負(fù)責(zé)實(shí)現(xiàn)隨機(jī)發(fā)牌、結(jié)果驗(yàn)算、計(jì)算得分和難度設(shè)置等功能。設(shè)計(jì)的程序要求具有如下功能:(1)按下“發(fā)牌”按鈕時(shí)開(kāi)始游戲,桌面上顯示4張翻開(kāi)的撲克牌,并且游戲開(kāi)始計(jì)時(shí),進(jìn)度條開(kāi)始前進(jìn)。(2)當(dāng)用戶(hù)能夠?qū)?張牌計(jì)算出24時(shí),可以按下“輸入算式”按鈕,此時(shí)游戲計(jì)時(shí)停止,用戶(hù)可在編輯框中輸入。(3)輸入結(jié)束,用戶(hù)按下“驗(yàn)算”按鈕,計(jì)算輸入的多項(xiàng)式。驗(yàn)算通過(guò),顯示“正確”;驗(yàn)算出錯(cuò),顯示“錯(cuò)誤”。(4)如果用戶(hù)希望繼續(xù)游戲,則可按下“發(fā)牌”按鈕;否則按下“結(jié)束游戲”按鈕。在運(yùn)行游戲時(shí),還可以通過(guò)難

2、度級(jí)別的下拉列表來(lái)改變游戲的難度。改變難度可以變化游戲的限時(shí)和游戲加分的規(guī)則。運(yùn)行后的初始界面為:運(yùn)行成功后的界面為:設(shè)計(jì)框圖運(yùn)行調(diào)試出錯(cuò)調(diào)試出錯(cuò)調(diào)試出錯(cuò)功能調(diào)試功能調(diào)試功能調(diào)試添加進(jìn)度條完成調(diào)試通過(guò)編寫(xiě)消息處理代碼編寫(xiě)消息處理代碼編寫(xiě)消息處理代碼添加列表控件添加組合框添 加按鈕添加靜態(tài)控件應(yīng)用程序界面設(shè)計(jì)導(dǎo)入撲克牌資源創(chuàng)建基于對(duì)話框的應(yīng)用程序原理、功能分析開(kāi)始加載菜單資源軟件設(shè)計(jì)過(guò)程一、應(yīng)用程序界面設(shè)計(jì)首先創(chuàng)建一個(gè)名為“24點(diǎn)游戲”的工程。啟動(dòng)vc6.0,依次點(diǎn)擊“文件新建”,在彈出的對(duì)話框中選擇工程類(lèi)型為“mfc appwizard(exe)”,工程名取為“24點(diǎn)游戲”,保存在“d:趙志剛

3、24點(diǎn)游戲”目錄下,選擇基于對(duì)話框的應(yīng)用程序類(lèi)型,生成與用戶(hù)交互的應(yīng)用程序界面。程序界面如圖1所示(圖1)通過(guò)對(duì)應(yīng)用程序基本功能的描述,可以知道要實(shí)現(xiàn)該程序的功能,在所設(shè)計(jì)的基于對(duì)話框的應(yīng)用程序中應(yīng)包括以下資源及控件:(一)資源撲克牌資源:由于windows系統(tǒng)自帶的紙牌游戲中存放有撲克牌,故可以將所需的撲克牌資源導(dǎo)入應(yīng)用程序。首先找到位于windows目錄下的cards.dll文件,然后選擇vc ide中的“文件 | 打開(kāi)”,文件類(lèi)型選擇executable files(.exe;.dll;.ocx),“打開(kāi)方式” 選擇resource,然后打開(kāi)cards.dll文件(如下圖2所示)。打開(kāi)c

4、ards.dll,選擇其中所需的bitmap,按住鼠標(biāo)左鍵不放,將bitmap直接拖入應(yīng)用程序的workspace工作區(qū)。本程序選擇各種花色從a9以及用于程序運(yùn)行后初始顯示為背面的紙牌總計(jì)37張牌。將所需紙牌全部導(dǎo)入應(yīng)用程序后,更改其屬性,將id設(shè)置為從137這些整數(shù)值。 圖(2) 圖(3)菜單資源:依次點(diǎn)擊“插入資源”,在彈出的對(duì)話框中雙擊“menu”項(xiàng)(如圖3所示),即實(shí)現(xiàn)了向應(yīng)用程序中加載菜單資源。(二)控件(1)靜態(tài)控件:共9個(gè),其中4個(gè)用于顯示隨機(jī)產(chǎn)生的4張撲克牌,另外5個(gè)分別用于顯示提示文字“耗時(shí)標(biāo)識(shí):”、“難度級(jí)別:”、“當(dāng)前得分:”、“歷史記錄:”以及累計(jì)游戲得分值。具體為:

5、耗時(shí)標(biāo)識(shí):提示用戶(hù)計(jì)時(shí)時(shí)間。 難度級(jí)別:提示用戶(hù)當(dāng)前選擇的難度級(jí)別。 當(dāng)前得分:提示用戶(hù)累計(jì)總得分信息。歷史記錄:提示用戶(hù)有關(guān)游戲次數(shù)及正誤信息。顯示累計(jì)游戲得分值,初始設(shè)置為0(2)按鈕:共4個(gè),分別是:“發(fā)牌”按鈕:點(diǎn)擊此按鈕,隨機(jī)產(chǎn)生4張撲克牌并在4個(gè)靜態(tài)控件上顯示,同時(shí)啟動(dòng)計(jì)時(shí)器,進(jìn)度條開(kāi)始計(jì)時(shí)。游戲開(kāi)始?!拜斎胨闶健卑粹o:當(dāng)用戶(hù)能夠?qū)?張牌計(jì)算出24時(shí),點(diǎn)擊此按鈕即可在編輯框中輸入計(jì)算式,同時(shí)停止游戲計(jì)時(shí),進(jìn)度條停止前進(jìn)?!膀?yàn)算”按鈕:點(diǎn)擊此按鈕,應(yīng)用程序即對(duì)用戶(hù)輸入的計(jì)算式進(jìn)行檢驗(yàn),如果判斷用戶(hù)輸入的計(jì)算式恰為所發(fā)牌的點(diǎn)數(shù),則對(duì)輸入算式進(jìn)行驗(yàn)算,同時(shí)將計(jì)算結(jié)果以消息框的形式告知用戶(hù)

6、,并在歷史記錄列表框中加以顯示。若計(jì)算結(jié)果正確,程序還根據(jù)難度級(jí)別在“當(dāng)前得分:”中加分;若輸入算式不合乎要求,則告知用戶(hù)一個(gè)錯(cuò)誤消息。最后,為防止游戲者不斷點(diǎn)擊此按鈕以增加得分,當(dāng)用戶(hù)一次點(diǎn)擊后即被禁止,呈灰色顯示?!敖Y(jié)束游戲”按鈕:點(diǎn)擊此按鈕則游戲結(jié)束,退出應(yīng)用程序。(3)組合框:共1個(gè),此框中設(shè)置有“熱身運(yùn)動(dòng)”和“智力比拼”兩個(gè)難度級(jí)別以供游戲者選擇,不同的難度級(jí)別在一次游戲得分和耗時(shí)標(biāo)識(shí)進(jìn)度條計(jì)時(shí)快慢上有所不同。游戲者點(diǎn)擊不同的選項(xiàng)即可設(shè)定不同的難度級(jí)別。(4)列表控件:共1個(gè),用于記錄游戲者總的游戲次數(shù)以及相關(guān)的對(duì)錯(cuò)信息。(5)編輯框:共1個(gè),用于接收游戲者輸入的計(jì)算式。 (6)進(jìn)度

7、條:共1個(gè),游戲者單擊發(fā)牌按鈕后,計(jì)時(shí)器啟動(dòng),耗時(shí)標(biāo)識(shí)進(jìn)度條同時(shí)開(kāi)始計(jì)時(shí),游戲者必須在耗時(shí)標(biāo)識(shí)進(jìn)度條計(jì)時(shí)終止前思考出計(jì)算式,然后單擊“輸入算式”按鈕,此時(shí)耗時(shí)標(biāo)識(shí)進(jìn)度條停止計(jì)時(shí)。否則,耗時(shí)標(biāo)識(shí)進(jìn)度條計(jì)時(shí)終止,應(yīng)用程序以消息框的形式報(bào)告真遺憾,時(shí)間到了!。添加這些控件后,再設(shè)置其屬性,如id及caption等。各控件的相關(guān)設(shè)置信息列表如下:控件對(duì)象idcaption顯示紙牌的靜態(tài)控件1idc_static1/顯示紙牌的靜態(tài)控件2idc_static2/顯示紙牌的靜態(tài)控件3idc_static3/顯示紙牌的靜態(tài)控件4idc_static4/耗時(shí)標(biāo)識(shí)提示靜態(tài)控件idc_static耗時(shí)標(biāo)識(shí):難度級(jí)別

8、提示靜態(tài)控件idc_static5難度級(jí)別:當(dāng)前得分提示靜態(tài)控件idc_static6當(dāng)前得分:顯示當(dāng)前得分靜態(tài)控件idc_static7/歷史記錄提示靜態(tài)控件idc_static8歷史記錄發(fā)牌按鈕idc_button1發(fā)牌輸入算式按鈕idc_button2輸入算式驗(yàn)算按鈕idc_button3驗(yàn)算結(jié)束游戲按鈕idc_button4結(jié)束游戲進(jìn)度條idc_progress1/輸入算式編輯框idc_edit1/顯示歷史記錄列表控件idc_combo1/難度級(jí)別選擇組合框idc_list1/添加控件以及設(shè)置屬性等完成后,應(yīng)用程序的界面如下圖4所示(圖4)(注:由于用于顯示隨機(jī)產(chǎn)生的4張牌及當(dāng)前得分的

9、靜態(tài)控件其caption并未設(shè)置任何內(nèi)容,故在界面中并未顯示。)二、編寫(xiě)應(yīng)用程序代碼(一)為添加的各個(gè)控件定義成員變量在進(jìn)行程序的代碼編寫(xiě)過(guò)程之前需要為某些控件連接變量。定義成員變量可以在“建立類(lèi)向?qū)А敝型瓿?,其操作步驟為:在欲添加成員變量的控件上右擊,點(diǎn)擊彈出的快捷菜單中的“建立類(lèi)向?qū)А表?xiàng),在隨后彈出的對(duì)話框中選擇“member variables”選項(xiàng)卡,單擊欲添加變量的控件id標(biāo)識(shí),接著點(diǎn)擊“add variable”按鈕,在彈出的對(duì)話框中設(shè)定“member variable name”、“category”及“variable type”,然后點(diǎn)擊ok按鈕,則為該控件添加了一個(gè)成員變量

10、。其他控件成員變量的添加可以仿此完成。其演示過(guò)程如下圖57所示: 圖(5) 圖(6)圖(7)比較圖5和圖7,可以看到,在圖7中已經(jīng)為編輯框控件添加了一個(gè)成員變量m_edit,其類(lèi)型為cstring類(lèi)。重復(fù)此過(guò)程,為所有需要添加變量的控件連接變量,結(jié)果如下表所示:控件對(duì)象變量名類(lèi)型idc_static1m_bmp1cstaticidc_static2m_bmp2cstaticidc_static3m_bmp3cstaticidc_static4m_bmp4cstaticidc_combo1m_cbccomboboxidc_edit1m_editcstring(二)為按鈕及組合框控件添加消息響應(yīng)函

11、數(shù)由于按鈕及組合框控件均能發(fā)送消息,故應(yīng)用程序中應(yīng)有對(duì)此消息的響應(yīng)函數(shù),以處理這些消息并實(shí)現(xiàn)相應(yīng)的功能。此程序中為這些控件添加的方法如下表所示:控件對(duì)象方法idc_button1onbutton1()idc_button2onbutton2()idc_button3onbutton3()idc_button4onbutton4()idc_list1onselchangecombo1()(三)方法的實(shí)現(xiàn)a應(yīng)用程序啟動(dòng)時(shí)會(huì)自動(dòng)顯示4張背面的紙牌,并且難度級(jí)別默認(rèn)為“熱身運(yùn)動(dòng)”(可以選擇“熱身運(yùn)動(dòng)”或“智力比拼”),當(dāng)前得分為0,列表控件無(wú)歷史記錄,由此則需要在構(gòu)造函數(shù)cmy24dlg(cwnd*

12、pparent /*=null*/)及初始化函數(shù)oninitdialog( )中添加如下代碼:/定義一個(gè)結(jié)構(gòu)體變量lvitemlv_item lvitem;cmy24dlg:cmy24dlg(cwnd* pparent /*=null*/)/設(shè)置列表控件列屬性 lvitem.mask = lvif_text | lvif_image | lvif_state;lvitem.state = 0; lvitem.statemask = 0; lvitem.iimage = 0;bool cmy24dlg:oninitdialog() /初始化組合框m_cb.insertstring(0,智力比拼)

13、; /為組合框添加子項(xiàng)m_cb.insertstring(1,熱身運(yùn)動(dòng)); /為組合框添加子項(xiàng)m_cb.setcursel(1); /默認(rèn)為“熱身運(yùn)動(dòng)”setdlgitemtext(idc_static7,0); /開(kāi)始時(shí)得分為0/設(shè)置列表控件風(fēng)格lv_column lvcolumn; /定義一個(gè)結(jié)構(gòu)體變量lvcolumn lvcolumn.mask = lvcf_fmt | lvcf_width | lvcf_text | lvcf_subitem;lvcolumn.fmt = lvcfmt_center;lvcolumn.cx = 52;/設(shè)置列表控件列標(biāo)題lvcolumn.isubite

14、m = 0;lvcolumn.psztext = 題數(shù);(clistctrl*)getdlgitem(idc_list1)-insertcolumn(0, &lvcolumn);lvcolumn.isubitem = 1;lvcolumn.psztext = 對(duì)錯(cuò);(clistctrl*)getdlgitem(idc_list1)-insertcolumn(1, &lvcolumn); /通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換以獲得列表控件的指針,并對(duì)它進(jìn)行相關(guān)操作/設(shè)置初始發(fā)牌顯示為背面的紙牌m_bmp1.modifystyle(0,ss_bitmap);hbitmap hbmp1; hbmp1=loadbitm

15、ap(afxgetinstancehandle(),makeintresource(37);m_bmp1.setbitmap(hbmp1);m_bmp2.modifystyle(0,ss_bitmap);hbitmap hbmp2; hbmp2=loadbitmap(afxgetinstancehandle(),makeintresource(37);m_bmp2.setbitmap(hbmp2);m_bmp3.modifystyle(0,ss_bitmap);hbitmap hbmp3; hbmp3=loadbitmap(afxgetinstancehandle(),makeintresou

16、rce(37);m_bmp3.setbitmap(hbmp3);m_bmp4.modifystyle(0,ss_bitmap);hbitmap hbmp4; hbmp4=loadbitmap(afxgetinstancehandle(),makeintresource(37);m_bmp4.setbitmap(hbmp4);/設(shè)置進(jìn)度條的初始位置為0,范圍為0100 cprogressctrl *pprog=(cprogressctrl*)getdlgitem(idc_progress1);pprog-setrange(0,100);pprog-setpos(0);b當(dāng)發(fā)牌時(shí),進(jìn)度條開(kāi)始計(jì)時(shí)。

17、當(dāng)輸入算式時(shí)進(jìn)度條停止計(jì)時(shí)。需要設(shè)置進(jìn)度條的范圍和當(dāng)前位置。范圍表示整個(gè)操作的持續(xù)時(shí)間,當(dāng)前位置表示當(dāng)前進(jìn)行到的位置。進(jìn)度條根據(jù)當(dāng)前位置來(lái)判斷進(jìn)行的百分比并顯示進(jìn)度。進(jìn)度條的初始化在初始化函數(shù)oninitdialog( )中完成,添加的代碼如前所示。進(jìn)度條的停止計(jì)時(shí)控制在onbutton1( )消息響應(yīng)中完成。按下按鈕1時(shí),系統(tǒng)要隨機(jī)發(fā)出4張牌,進(jìn)度條同時(shí)開(kāi)始計(jì)時(shí),編輯框中前一次輸入的內(nèi)容被清除。給按鈕idc_button1添加代碼,onbutton1( )方法的實(shí)現(xiàn)代碼如下: int suiji4;void cmy24dlg:onbutton1() / todo: add your cont

18、rol notification handler code heregetdlgitem(idc_button3)-enablewindow(1); /重新發(fā)牌時(shí)激活驗(yàn)算按鈕3cstring s(); /清除前一次輸入的內(nèi)容m_edit=s;updatedata(false);/產(chǎn)生136之間的四個(gè)隨機(jī)數(shù),并存放在一個(gè)整型數(shù)組中srand( (unsigned)time( null ) );/產(chǎn)生四個(gè)隨機(jī)數(shù)for (int i=0;isetpos(0);settimer(1000,100,null); /步進(jìn)時(shí)間設(shè)置為0.1秒c按下按鈕2時(shí)進(jìn)度條停止計(jì)時(shí),游戲者在編輯框中輸入計(jì)算式。為按鈕id

19、c_button2添加代碼,onbutton2( )方法的實(shí)現(xiàn)代碼如下:void cmy24dlg:onbutton2() / todo: add your control notification handler code here killtimer(1000);d按下按鈕3時(shí),應(yīng)用程序判斷游戲者輸入是否符合要求,若計(jì)算式所得結(jié)果正確,則加分并修改歷史記錄,否則,以消息框的形式告知游戲者“錯(cuò)誤”并修改歷史記錄。若輸入操作數(shù)不符合要求,則彈出操作數(shù)個(gè)數(shù)不符消息框;若輸入的操作數(shù)不是所發(fā)牌的點(diǎn)數(shù),則彈出輸入數(shù)據(jù)與所發(fā)牌不一致,游戲結(jié)束!消息框。最后兩者都對(duì)歷史記錄進(jìn)行修改。為按鈕idc_but

20、ton3添加代碼,onbutton3( )方法的實(shí)現(xiàn)代碼如下:首先添加頭文件:#include #include #include stdio.h然后添加方法的實(shí)現(xiàn)代碼:typedef struct /表達(dá)式處理函數(shù) int top; double array50;numstack;typedef struct int top;char array50;opstack;int cint(char mychar) return (mychar-48);void pushnum(numstack *numstack,double num) numstack-top+; numstack-array

21、numstack-top-1=num;void popnum(numstack *numstack,double *num) *num=numstack-arraynumstack-top-1; numstack-top-;void pushop(opstack *opstack,char op) opstack-top+; opstack-arrayopstack-top-1=op;void popop(opstack *opstack,char *op) *op=opstack-arrayopstack-top-1; opstack-top-;double calc(double a,do

22、uble b,char c) double result; switch(c) case +: result=a+b;break; case -: result=a-b;break; case *: result=a*b;break; case /: result=a/b;break; return result;char priority(char y,char x) char priority=;break; case *: case /: if(y=( | y=#| y=+ | y=-)priority=;break; case (: priority=;break; case ): i

23、f(y=()priority=;break; case #: if(y=#)priority=;break; default: priority=e; return priority;void process(numstack *numstack,opstack *opstack,char x)double a,b;char c;static double tempnum=0.00000000;static int len=10;static int dot=0,flags=0;if(isdigit(x) | x=.) if(x=.) dot=1; else if(dot=0) tempnum

24、=tempnum*10+cint(x); else tempnum=tempnum+(double)cint(x)/len; len*=10; else if(flags=0& x!=() pushnum(numstack,tempnum);tempnum=0.00000000;len=10;dot=0; switch(priority(opstack-arrayopstack-top-1,x) case : pushop(opstack,x);flags=0;break; case : popop(opstack,&c); popnum(numstack,&b); popnum(numsta

25、ck,&a); pushnum(numstack,calc(a,b,c);flags=1; process(numstack,opstack,x);break; case =: popop(opstack,&c);flags=1;break; int checkequ(int s,int m) /判斷編輯框中輸入的數(shù)字是否為所發(fā)牌的點(diǎn)數(shù) int a=0,b=0; for(int k=0;k4;k+)int qiuyu=sk%9; if(qiuyu=0) sk=9; else sk%=9; for(int t=0;t4;t+)/判斷編輯框輸入的每個(gè)數(shù)字能否都在隨機(jī)數(shù)中找到與之相同的項(xiàng) if(st

26、=m0|st=m1|st=m2|st=m3) a+=1; for(int j=0;j4;j+)/判斷隨機(jī)數(shù)中的每個(gè)數(shù)字能否都與編輯框輸入的數(shù)據(jù)相匹配 if(mj=s0|mj=s1|mj=s2|mj=s3) b+=1; if(a=4)&(b=4)/對(duì)判斷結(jié)果的處理,若一致則返回1值,否則返回0值 return 1;else return 0;cstring input; /定義一個(gè)字符串類(lèi)int proceed(lpctstr l)/驗(yàn)算輸入計(jì)算式,若結(jié)果等于24則返回真值,否則為假,并提示 numstack numstack;opstack opstack;int i=0; numstack.

27、top=0;opstack.top=0; pushop(&opstack,#); for(i=0;istrlen(l);i+) process(&numstack,&opstack,li);if(numstack.arraynumstack.top-1=24) afxmessagebox(正確);input=正確;return 1;elseafxmessagebox(錯(cuò)誤);input=錯(cuò)誤;return 0;/為響應(yīng)函數(shù)onbutton3()添加代碼,判斷操作數(shù)是否合乎要求,修改當(dāng)前得分及歷史記錄void cmy24dlg:onbutton3() / todo: add your contr

28、ol notification handler code hereint m=0,i=0, shuju100; cstring biaoda; updatedata(true);biaoda=m_edit;biaoda=biaoda+#; for(i=0;i0)&(biaodaienablewindow(0);/個(gè)數(shù)不匹配,點(diǎn)按鈕3后即被禁止 else int r=checkequ(suiji,shuju);if(r=1) int flag=proceed(biaoda); if(flag) /若計(jì)算式正確,則根據(jù)難度級(jí)別加分,修改當(dāng)前得分記錄 defen+=jiafen; cstring s

29、tr; str.format(%d,defen); setdlgitemtext(idc_static7,str); else afxmessagebox(輸入數(shù)據(jù)與所發(fā)牌不一致,游戲結(jié)束!); getdlgitem(idc_button3)-enablewindow(0);/ 防止刷分,點(diǎn)按鈕3后即被禁止 int count=0; char s;count+=1; /根據(jù)程序運(yùn)行結(jié)果修改歷史記錄wsprintf(&s,%d,count);lvitem.iitem = count-1;lvitem.isubitem = 0;lvitem.psztext = &s;(clistctrl*)get

30、dlgitem(idc_list1)-insertitem(&lvitem);(clistctrl*)getdlgitem(idc_list1)-setitemtext(count-1, 1,input);updatedata(false);e按下按鈕4時(shí)游戲結(jié)束,退出應(yīng)用程序。為按鈕idc_button4添加代碼,onbutton4( )方法的實(shí)現(xiàn)代碼如下:void cmy24dlg:onbutton4() / todo: add your control notification handler code hereonok();f.游戲啟動(dòng)后,在發(fā)牌之前,游戲者首先選擇難度級(jí)別(如果不進(jìn)行

31、選擇的話,則默認(rèn)為“熱身運(yùn)動(dòng)”),程序根據(jù)游戲者設(shè)置的級(jí)別來(lái)進(jìn)行計(jì)時(shí)和加分。因此當(dāng)游戲者進(jìn)行選擇時(shí),列表框會(huì)發(fā)出cbn_selchange消息,其處理函數(shù)為onselchangecombo1( ),其實(shí)現(xiàn)方法如下:void cmy24dlg:onselchangecombo1() / todo: add your control notification handler code herecstring msg;m_cb.getlbtext(m_cb.getcursel(),msg);if(strcmp(msg,智力比拼)sudu=1;jiafen=5;if(strcmp(msg,熱身運(yùn)動(dòng))s

32、udu=3;jiafen=10;(四)添加菜單項(xiàng)及其消息響應(yīng)代碼(1)添加菜單項(xiàng)打開(kāi)workspace工作區(qū),展開(kāi)“menu”文件夾并雙擊“idm_menu1”,在右邊窗格中右擊有虛線框標(biāo)識(shí)的菜單,在隨后彈出的對(duì)話框中設(shè)置其屬性:“標(biāo)題”中填入“游戲”,選中“彈出”復(fù)選框,這樣就不必設(shè)置其id。如圖8所示圖(8)單擊“游戲”菜單項(xiàng),在彈出的中右擊虛框標(biāo)識(shí)的菜單項(xiàng),隨后設(shè)置其屬性:以添加“開(kāi)始b”菜單項(xiàng)為例,設(shè)置其id為“idm_begin” ,“標(biāo)題”填入“開(kāi)始&b”如下圖9所示。完成后回車(chē),其界面變?yōu)橹貜?fù)此過(guò)程,為菜單添加菜單項(xiàng)“開(kāi)始”、“退出”、“幫助”以及“關(guān)于”。(2)將菜單資源鏈接到

33、主對(duì)話框展開(kāi)“dialog”文件夾,雙擊“idd_my24_dialog”項(xiàng),在隨后彈出的應(yīng)用程序界面上右擊標(biāo)題欄,在彈出的對(duì)話框中設(shè)置“菜單:”項(xiàng)為“idd_menu1”,則將菜單鏈接到了主對(duì)話框中。如圖10所示圖(10)回車(chē)后運(yùn)行程序,則可以看到已經(jīng)將菜單成功加入。(3)為菜單項(xiàng)添加消息響應(yīng)代碼“開(kāi)始”菜單項(xiàng)用于控制發(fā)牌和啟動(dòng)計(jì)時(shí)器,使進(jìn)度條前進(jìn)。為其添加消息響應(yīng)函數(shù)及代碼如下:void cmy24dlg:onbegin() / todo: add your command handler code heregetdlgitem(idc_button3)-enablewindow(1);c

34、string s();m_edit=s;updatedata(false); srand( (unsigned)time( null ) );for (int i=0;isetpos(0);settimer(1000,100,null); “退出”菜單項(xiàng)用于結(jié)束游戲并退出應(yīng)用程序。為其添加消息響應(yīng)函數(shù)及代碼如下:void cmy24dlg:onexit() / todo: add your command handler code hereonok();“關(guān)于”菜單項(xiàng)用于給用戶(hù)以提示信息。為其添加消息響應(yīng)函數(shù)及代碼如下:void cmy24dlg:onabout() / todo: add y

35、our command handler code herecaboutdlg dlg;dlg.domodal();至此,整個(gè)軟件設(shè)計(jì)過(guò)程完成。接下來(lái)進(jìn)入調(diào)試過(guò)程,對(duì)所編寫(xiě)的代碼進(jìn)行調(diào)試。若無(wú)誤,即可進(jìn)入運(yùn)行階段。否則繼續(xù)重復(fù)上述步驟。結(jié)論1 根據(jù)設(shè)計(jì)要求,所編寫(xiě)的軟件實(shí)現(xiàn)了全部的功能,完成了設(shè)計(jì)任務(wù)。測(cè)試結(jié)果附于后。2 該設(shè)計(jì)并沒(méi)有充分發(fā)揮vc+的優(yōu)勢(shì),面向?qū)ο蟪绦蛟O(shè)計(jì)思想貫徹不夠徹底。3 程序所采用的對(duì)表達(dá)式進(jìn)行處理的算法不夠完善(因而也稱(chēng)不上是一個(gè)好的算法,但是從原理上講是沒(méi)有問(wèn)題的。對(duì)此,我參考了各種版本的數(shù)據(jù)結(jié)構(gòu)教材(參考書(shū)籍附于后)?;诮滩闹袑?duì)“利用堆棧求表達(dá)式的值”的介紹,編寫(xiě)了

36、此算法。不過(guò)還是存在bug,偶爾也會(huì)出現(xiàn)判斷失誤現(xiàn)象。關(guān)于這個(gè)問(wèn)題,我請(qǐng)教了本班同學(xué)及高中同學(xué),結(jié)果還是不能得到完善的解決。這是本次設(shè)計(jì)最大的遺憾。4 對(duì)vc+學(xué)習(xí)不夠深入,未能領(lǐng)會(huì)利用mfc進(jìn)行可視化程序設(shè)計(jì)的要旨,因此在調(diào)試程序的過(guò)程中出現(xiàn)了好多現(xiàn)象都難以解釋。例如,為列表控件(listcontrol)定義一個(gè)變量后,程序不能正常運(yùn)行,不得已只好改用指針,結(jié)果程序能夠正常運(yùn)行。對(duì)此,我不明白其中的原因。5 作為一個(gè)交互性很好的應(yīng)用程序,應(yīng)該為用戶(hù)提供更為友好的交互方式,如當(dāng)游戲者在按下“輸入算式”按鈕后,為方便操作以及省去游戲者頻繁點(diǎn)擊鼠標(biāo)以獲得編輯框輸入焦點(diǎn)的麻煩,編輯框應(yīng)自動(dòng)獲得輸入焦

37、點(diǎn)。本設(shè)計(jì)中未實(shí)現(xiàn)這一功能,因此應(yīng)當(dāng)改進(jìn),這樣可使游戲操作更為方便。6 程序中每次發(fā)出的撲克牌中沒(méi)有10,這是為方便程序設(shè)計(jì)而有意去掉的。因?yàn)樗惴ㄊ抢枚褩?lái)求表達(dá)式的值的,而10在進(jìn)行壓棧操作時(shí)是作為兩個(gè)字符進(jìn)行處理的,這為程序設(shè)計(jì)帶來(lái)不便:因?yàn)闉樘幚磉@一張牌需要耗費(fèi)更多的系統(tǒng)資源。為方便計(jì),略去10號(hào)牌,不過(guò)一個(gè)完善的游戲是應(yīng)該能處理10的。7 本程序的另一個(gè)不完善之處是:當(dāng)用戶(hù)按下“輸入算式”按鈕后,計(jì)時(shí)器停止,進(jìn)度條停止前進(jìn),此后游戲者可以在任意長(zhǎng)的時(shí)間內(nèi)思考計(jì)算式,然后輸入。對(duì)此,應(yīng)用程序無(wú)能為力,不能對(duì)游戲者的思考時(shí)間進(jìn)行有效控制。在設(shè)計(jì)之初,我曾考慮再增加一個(gè)進(jìn)度條對(duì)思考時(shí)間計(jì)時(shí)

38、以實(shí)現(xiàn)控制,但由于不會(huì)合理使用相關(guān)方法,結(jié)果兩個(gè)進(jìn)度條發(fā)生沖突,反而連基本的計(jì)時(shí)功能也實(shí)現(xiàn)不了,無(wú)奈只有放棄這一嘗試??傊?,通過(guò)對(duì)24點(diǎn)游戲的設(shè)計(jì),可以熟悉mfc編程,加深對(duì)對(duì)話框編程的認(rèn)識(shí)和理解,并訓(xùn)練visual c+在數(shù)學(xué)計(jì)算方面的知識(shí),以及在按鈕上設(shè)置位圖、設(shè)置定時(shí)器的方法和應(yīng)用程序的調(diào)試,同時(shí)對(duì)面向?qū)ο笈c可視化程序設(shè)計(jì)有一定的認(rèn)識(shí),并提高動(dòng)手編程的能力。心得體會(huì)經(jīng)歷了這次應(yīng)用軟件設(shè)計(jì)實(shí)踐,我感觸頗深。此前一直錯(cuò)誤的以為做課程設(shè)計(jì)其實(shí)是件很簡(jiǎn)單的事情,根本不需要興師動(dòng)眾而且花費(fèi)那么長(zhǎng)的時(shí)間,兩三天足矣。在此錯(cuò)誤認(rèn)識(shí)的引導(dǎo)下,也就沒(méi)怎么把它當(dāng)回事,只打算隨隨便便應(yīng)付一下,完工交差。但是等

39、到真正親歷后才發(fā)現(xiàn)原來(lái)自己是多么的愚蠢可笑,自己的想法又是多么的幼稚、荒謬。做的過(guò)程并不順利,而其中的種種遭遇更是讓我反省良久。一路堅(jiān)持下來(lái),其中的艱辛也許只有經(jīng)歷過(guò)才能真正體會(huì)。不過(guò),經(jīng)過(guò)一番實(shí)踐后,當(dāng)看到自己親手做的東西就那么真實(shí)的擺在眼前,曾經(jīng)的心血與付出終于有了回報(bào),那份激動(dòng)與喜悅的心情又豈是三言?xún)烧Z(yǔ)說(shuō)得清楚的!“如人飲水,冷暖自知”,現(xiàn)在我是真的體會(huì)到了??偟膩?lái)說(shuō),我覺(jué)得這次設(shè)計(jì)實(shí)踐收獲頗豐,于今后的學(xué)業(yè)、步入社會(huì)后參加工作乃至做人做事都是一筆不小的財(cái)富!通過(guò)這次課程設(shè)計(jì),我懂得了實(shí)踐的重要性、團(tuán)隊(duì)合作精神的可貴以及做事前的充足準(zhǔn)備與做事過(guò)程中的堅(jiān)持和細(xì)心謹(jǐn)慎對(duì)于高質(zhì)高效地完成一項(xiàng)工

40、作的特殊意義。任何事情都有一個(gè)循序漸進(jìn)的過(guò)程,知難而進(jìn)、勇往直前,只有這樣才有可能領(lǐng)略險(xiǎn)峰的無(wú)限風(fēng)光。治學(xué)、做人又何嘗不是如此呢? 先說(shuō)實(shí)踐。關(guān)于實(shí)踐,前人曾留有十二字箴言:“實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)”,經(jīng)過(guò)這次應(yīng)用軟件設(shè)計(jì),我所理解的實(shí)踐已遠(yuǎn)不只此。人說(shuō)“愛(ài)過(guò)才知情深,醉過(guò)方知酒濃”,我以為,只有實(shí)踐才會(huì)出真知,沒(méi)有實(shí)踐,任何理論、見(jiàn)解都是蒼白無(wú)力的。眼之所見(jiàn)、心之所想大多數(shù)時(shí)候并不就是手之所為。在動(dòng)手嘗試之前,我可以算是一個(gè)眼高手低的人。課程設(shè)計(jì)的題目下來(lái)了,共有三個(gè)可供選擇。相較之下我選了做“24點(diǎn)游戲”,本以為這是最簡(jiǎn)單的,基本上可以不費(fèi)多大心力即輕松搞定。因此開(kāi)始的幾天里也沒(méi)怎么刻意

41、著手這件事情。事實(shí)卻是,等到我真正做了才發(fā)現(xiàn)隨著問(wèn)題的不斷出現(xiàn)和為此而查閱許多相關(guān)的資料,花了那么多的時(shí)間與精力,做的過(guò)程還是如此的困難重重,并且做出來(lái)的東西也并非盡善盡美。方知許多事情并非都如人所想,不實(shí)踐、不參與是無(wú)論如何也不會(huì)明白的。實(shí)踐之重要正在于此!這段小小的經(jīng)歷使我感觸很深,也教會(huì)我在以后的學(xué)習(xí)與工作中不要再眼高手低,任何事情都需親自嘗試后再做定斷。牢記“眼之所見(jiàn)、心之所想非手之所為也!”接下來(lái)再說(shuō)著手前的準(zhǔn)備。三國(guó)時(shí)諸葛亮草船借箭有賴(lài)“萬(wàn)事俱備,只欠東風(fēng)”,而我的設(shè)計(jì)能順利進(jìn)行也必須有充足的準(zhǔn)備作為后盾。只可惜在一開(kāi)始的時(shí)候由于并不很重視因此也未意識(shí)到這一點(diǎn),導(dǎo)致做的過(guò)程中停停找

42、找、找找停停,嚴(yán)重影響了設(shè)計(jì)進(jìn)度和效率,并且這種臨陣磨槍式的做法也使得準(zhǔn)備很不充分,往往是急需要用的東西找也找不到,如某控件類(lèi)的方法如何使用、其原型或者參數(shù)的類(lèi)型與意義為何等等。這樣一來(lái),自然會(huì)遇到重重困難。我想,如果在動(dòng)手之前已經(jīng)做好了充足準(zhǔn)備,必然會(huì)少遇到很多麻煩,也不會(huì)一度出現(xiàn)舉步維艱的情況。當(dāng)然了,這次還只是一個(gè)小小的設(shè)計(jì),如果換成是某個(gè)大型系統(tǒng)的設(shè)計(jì)豈不是無(wú)法想象?所以這次經(jīng)歷也算是給了我一個(gè)教訓(xùn):千萬(wàn)不要打無(wú)準(zhǔn)備的仗!早準(zhǔn)備方保無(wú)虞。說(shuō)到了準(zhǔn)備,也得說(shuō)說(shuō)做事過(guò)程中的堅(jiān)持與細(xì)心謹(jǐn)慎。很難想象如果沒(méi)有堅(jiān)持到底的勇氣和不懈的努力,當(dāng)一個(gè)人面對(duì)困難時(shí)能迎難而上并一路堅(jiān)持走下來(lái)。當(dāng)初我選定這

43、個(gè)設(shè)計(jì)課題時(shí)正是考慮到它簡(jiǎn)單、易完成(當(dāng)然事實(shí)并非如此),不過(guò)后來(lái)做的時(shí)候不斷出現(xiàn)新的問(wèn)題,而且有些還是從理論上無(wú)法解釋的,這時(shí)我就在想算了吧,這么難搞,還是換別的做。正好其他同學(xué)做的媒體播放器在網(wǎng)上找到了很多原原本本的源代碼,因而做起來(lái)就不費(fèi)吹灰之力。當(dāng)時(shí)幾乎就在一念之間轉(zhuǎn)了方向,好在隨后終于做成功了一部分功能。這點(diǎn)小小的成功讓我體會(huì)到了自己動(dòng)手的樂(lè)趣與成功后的喜悅,在此激勵(lì)之下,幸而堅(jiān)持了下來(lái)?;匚镀渲械钠D辛,盡享成功的喜悅,縱是雛鷹試翼之作,畢竟自己所為,比之其他同學(xué)照搬別人的代碼以完成任務(wù)卻不知到底做了什么、又有什么收獲,不是更有意義嗎?能夠堅(jiān)持即已成功一半。世上無(wú)難事,唯恐少堅(jiān)持!此

44、外,在做的過(guò)程中不可能是一帆風(fēng)順的,必然免不了頻繁出錯(cuò)。這一方面是由于輸入時(shí)的粗心大意造成的,另一方面則是編寫(xiě)的代碼本身的問(wèn)題。對(duì)于前者,如果能在操作時(shí)做到細(xì)心謹(jǐn)慎,當(dāng)然可以避免。即便免不了輸入錯(cuò)誤,在調(diào)試的過(guò)程中也應(yīng)細(xì)心謹(jǐn)慎,惟其如此,方可免去許多麻煩,保證軟件設(shè)計(jì)的質(zhì)量與效率。由于要不斷的調(diào)試,而vc6.0對(duì)于用戶(hù)所作的改動(dòng)會(huì)自動(dòng)保存,因此就可能出現(xiàn)保存了修改后錯(cuò)誤的結(jié)果,反而將前面做好的調(diào)試無(wú)誤的內(nèi)容覆蓋掉的情況。如果沒(méi)有時(shí)時(shí)保持細(xì)心謹(jǐn)慎的態(tài)度,及時(shí)對(duì)調(diào)試無(wú)誤的結(jié)果加以保存,將可能遭遇前功盡棄的“滅頂之災(zāi)”。不管怎樣,時(shí)時(shí)處處細(xì)心謹(jǐn)慎,方保順利無(wú)虞。我想,無(wú)論是治學(xué)還是工作或是為人,這樣的一種態(tài)度都是至關(guān)重要的。由于是初次設(shè)計(jì),僅憑自己一人之力是很難完成的,所以大家或借助于網(wǎng)絡(luò),或借助于參考書(shū)籍、期刊資料等。我也不例外,和幾位同學(xué)一起研究設(shè)計(jì)方案及具體實(shí)現(xiàn)方法,并跑了好幾趟圖書(shū)館,查資料,抄筆記,上網(wǎng)搜索資料,終于在大家的通力合作之下完成了這個(gè)項(xiàng)目。一起做的過(guò)程大家朝著一個(gè)共同的目標(biāo)努力,分工協(xié)作,互相交流,提出不同的想法,不斷完善,不斷進(jìn)步,一個(gè)一個(gè)的問(wèn)題迎刃而解,一個(gè)一個(gè)的功能不斷做出來(lái)。最后,集體的勞動(dòng)終于換來(lái)了豐碩的成果(盡管并不完美)。這次經(jīng)歷使我懂得了團(tuán)隊(duì)合作精神的可貴。不僅如此,我覺(jué)得這次合作的過(guò)程真的是很愉快,

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論