LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第1頁
LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第2頁
LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第3頁
LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第4頁
LPX6電動機下置式錘式破碎機開題報告和24點游戲課程設計報告_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

武漢理工大學《專業(yè)課程設計3》課程設計說明書PAGEPAGE1畢業(yè)設計(論文)開題報告題目LPX6電動機下置式錘式破碎機專業(yè)名稱機械設計制造及其自動化班級學號學生姓名指導教師填表日期20年5月日一、選題的依據(jù)及意義隨著國內(nèi)基本建設和國民經(jīng)濟的持續(xù)發(fā)展,我國的建設機械市場已經(jīng)成為國際設備制造商關(guān)注的焦點,破碎機械行業(yè)也不例外,外資的進入,進一步加劇了市場的競爭程度,國內(nèi)破碎機械企業(yè)要想在競爭的大潮中取得先機,其首要問題就是要提高現(xiàn)有破碎設備的質(zhì)量和技術(shù)含量,盡快縮小與國外先進水平的差距,創(chuàng)造自己的品牌,爭取市場主動。國內(nèi)外破碎機械存在差距的原因很多,其中市場需求不同是造成差距的客觀原因,由于國際市場上優(yōu)秀的破碎設備制造商集中在歐美地區(qū),那里大規(guī)模的基本建設階段已過去,市場對砂石料的需求不多,且環(huán)保要求又高,勢必形成砂石場高度集中以大規(guī)模生產(chǎn)來實現(xiàn)環(huán)境保護,幫所需破碎設備規(guī)格大、自動化程試想高、機動性強。滿足這樣的市場需求發(fā)展的破碎設備與國內(nèi)產(chǎn)品不大一樣,而我們正處于大規(guī)模的基本建設時期,各地對砂石料的需求劇增,引起投資砂石場熱,遍地開花的砂石場往往規(guī)模小,只求上馬快、投資少,供不應求的市場使粗制濫造、技術(shù)水平低下、耗能高、污染環(huán)境嚴重的產(chǎn)品紛紛進入,而這些設備往往只能以低價來占領(lǐng)市場,因此與國際上先進水平差距明顯。國際上專業(yè)的立軸沖擊式破碎機制造商已普遍采用陶瓷制作耐磨零件,而不僅僅是硬質(zhì)合金(碳化鎢)和高鉻鑄鐵。陶瓷材料不但可耐較高的溫度,而且有特別好的抗腐蝕性,因而在帶有相當溫度的物料高速沖擊時耐磨性能良好。國內(nèi)的立軸立軸沖擊式破碎機目前采用硬質(zhì)合金和高鉻鑄鐵材料,質(zhì)量不穩(wěn)定,易腐蝕和磨損,且易被金屬件擊碎,由于砂石場使用的破碎設備國內(nèi)外產(chǎn)品差距明顯,故國內(nèi)高端市場,如規(guī)模較大的砂石場仍是進口的設備占多數(shù)。

因而近制就是測繪國外產(chǎn)品,以此作為更新?lián)Q代的主要手段,技術(shù)進步甚慢。目前國內(nèi)的破碎機械制造商無論國有企業(yè)還是民營企業(yè),在科技開發(fā)上的投入不足是產(chǎn)品差距的主觀原因,既缺乏科研手段(例如幾乎沒有一家制造商具備巖石實險室),又缺少先進技術(shù)支撐,自主產(chǎn)權(quán)的開發(fā)力量十分薄弱。盡管國內(nèi)外破碎設備差距很大,但縱觀國外的破碎設備制造商由于本土市場日漸縮小,生產(chǎn)成本高,紛紛開拓本國以外的市場,而且作為傳統(tǒng)工業(yè)在資金、人才等方面獲得新的投入甚少,因此,近來年兼并重組頻繁,這種局面給國內(nèi)破碎機械制造商以很大的發(fā)展機遇,畢竟我國的制造成本較低,又有較好的重工業(yè)基礎(chǔ),通過引進國際上先進技術(shù),產(chǎn)學科研投入,一定能克服技術(shù)上的差距,使我國的破碎設備產(chǎn)品更好的進入國內(nèi)外市場。

立軸錘式破碎機在吸收國內(nèi)外先進技術(shù)和綜合國內(nèi)外同類破碎機技術(shù),具有破碎效率高、破碎比大、磨損少、工作平穩(wěn)、能耗低、維修方便等優(yōu)點,是一種較理想的節(jié)能型破碎設備。

同時對主要技術(shù)參數(shù)進行優(yōu)化設計研制成的新型細碎、粗磨產(chǎn)品,主要用于中、小型破碎水泥生料、熟料,用于建筑用砂、鐵礦石、砂巖、石膏、煤矸石、塊煤等其它中硬礦石的破碎。具有破碎比大、能耗少、運轉(zhuǎn)平穩(wěn)、結(jié)構(gòu)簡單、操作維修方便等特點。它不僅適用于中等硬度脆性物料(如石灰石、水泥熟料、石膏、硫鐵礦石、煤塊等多種物料)的破碎,還適用于建材、化工、冶金、礦山、電力、煤炭等工業(yè)部門的原料破碎系統(tǒng)。通過本設計,使我達到了以下幾個目的:1、學會獨立分析和解決工程實踐中所遇到的各種問題。2、掌握獨立完成工程設計的方法。3、掌握總結(jié)和撰寫設計說明書的方法。4、學會通過語言表述自己的研究內(nèi)容、理論、方法、結(jié)論。5、為今后綜合能力的提高打下一個良好、扎實的基礎(chǔ)。國內(nèi)外研究概況及發(fā)展趨勢(含文獻綜述)國內(nèi)外研究概況第一代的破碎機械是在蒸汽機和電動機等動力機械逐漸完善和推廣之后相繼創(chuàng)造出來的。1806年出現(xiàn)了用蒸汽機驅(qū)動的輥式破碎機;1858年,美國的布萊克發(fā)明了破碎巖石的顎式破碎機;1878年美國發(fā)展了具有連續(xù)破碎動作的旋回破碎機,其生產(chǎn)效率高于作間歇破碎動作的顎式破碎機;1895年,美國的威廉發(fā)明能耗較低的沖擊式破碎機。美國人E.W.布萊克(Black)設計制造的世界上第一臺顎式破碎機。其結(jié)構(gòu)形式為雙肘板式(簡單擺動式)顎式破碎機。由于顎式破碎機具有結(jié)構(gòu)簡單、制造容易、工作可靠、維護方便,體積和高度較小等優(yōu)點。至今仍然被廣泛應用于破碎堅硬、中硬、軟質(zhì)礦石和各種物料,如各種礦石、溶劑、爐渣、建筑石料、大理石等。通常使用的顎式破碎機的破碎機為4~6,而小型顎式破碎機有時可達到10.大、中型破碎機的給料力度可達1000~2000mm,其產(chǎn)品粒度可達20~250mm,小型破碎機和新型細碎用顎式破碎機所得產(chǎn)品可以更細一些。顎式破碎機即可用于粗碎作業(yè),也可用于中、細作業(yè)。特別是被用于井下破碎作業(yè)和中、小型移動式破碎裝置。錘式破碎機的設計簡單、工作可靠和能破碎堅硬物料等優(yōu)點而被廣泛應用于選礦、建筑材料、硅酸鹽和陶瓷等工業(yè)部門。到20世紀80年代,每小時破碎800噸物料的大型顎式破碎機的給料粒度已達1800毫米左右。我國破碎機械制造業(yè)總體規(guī)模已進入國際生產(chǎn)大國行列,但總體競爭和發(fā)展后勁仍無法與發(fā)達國家相抗衡,目前國內(nèi)高端用戶和出口產(chǎn)品配套的基礎(chǔ)零部件主要依靠進口,隨著出口貿(mào)易磨擦的加大,勢必要受到國外競爭對手和供應商的制約。因此破碎機械今后振興發(fā)展的重心應放到基礎(chǔ)技術(shù)和基礎(chǔ)部件上來,提高自主開發(fā)水平。大型機械設備,其中錘式破碎機,破石機,顎式破碎機,大型磨粉機等設備已經(jīng)遠銷哥倫比亞,美國,沙特等地區(qū)取得了客戶的好評,特別是制砂機,碎石機設備得到了外商的大力贊賞。目前,我國破碎制造行業(yè)市場非常廣泛,包括化工、礦山、建筑、水利、冶金、煤礦、玻璃等各個行業(yè)。在中國最重要的應用領(lǐng)域是水泥行業(yè)、鋪路和礦山,應用在這兩個行業(yè)的破碎機各約占整個行業(yè)的30%左右。目前,國際上各國對破碎機的發(fā)展抱有較大期望,同時,也取得了一定的成效。尤其是美國、日本、德國在破碎機的研究開發(fā)與利用已經(jīng)達到了一個較高的水平。破碎機廣泛應用于資源開采、工程機械、城市建設、材料分解等多項領(lǐng)域,涉及包括化工、礦山、建筑、水利、冶金、煤礦、玻璃等各個行業(yè)。國內(nèi)近幾年由于經(jīng)濟的穩(wěn)定快速發(fā)展、以及西部大開發(fā)的深入進行,對破碎機的需求大量增加。另一方面,隨著國家繼續(xù)擴大內(nèi)需,基礎(chǔ)設施建設步伐的加大,這就帶動了破碎機的的蓬勃發(fā)展。但是一定程度上,我們對破碎機的研究開發(fā)與利用還遠沒有達到預期的效果,破碎技術(shù)的水平相對有限,為了進一步提高破碎水平,生產(chǎn)出就有高質(zhì)量和高技術(shù)含量的破碎機,盡快縮小與國外先進水平的差距,我們不得不對破碎機進行更加深入的研究。2.現(xiàn)如發(fā)展趨勢從上個世紀60年代德國克虜伯公司生產(chǎn)出第一臺液壓破碎錘以來,破碎錘經(jīng)歷了四十多年的發(fā)展,從這次參展情況來看,破碎錘已經(jīng)從當初結(jié)構(gòu)復雜、功能單一的形式發(fā)展到現(xiàn)在的產(chǎn)品多樣化、功能多樣化。具體可以歸納為以下幾個方面的新發(fā)展:(1)破碎錘的結(jié)構(gòu)形式多樣化。現(xiàn)在市場上有純液壓靜壓驅(qū)動型破碎錘、氣液聯(lián)合型破碎錘和氮氣爆炸式碎錘,可以根據(jù)需要選擇合適的型號;從與承載機的裝配上看,有側(cè)板裝配形式和箱體式裝配形式兩種,側(cè)板式裝配形式破碎錘附加功能一般較箱體形式的要少,且沖擊能檔次一般是中小型,大沖擊能的破碎錘現(xiàn)在一般采用箱體式結(jié)構(gòu),因為箱體式結(jié)構(gòu)便于采取隔音措施,以減小大沖擊能破碎錘工作時的噪聲。(2)產(chǎn)品系列化。根據(jù)工作對象的不同,可以選用同一系列不同型號的破碎錘。對于小塊、硬度較低的巖石選川沖擊能小的破碎錘,而對于大塊、硬度高的巖石選用沖擊能大的破碎錘,這樣就可以充分發(fā)揮系統(tǒng)的功能,提高能量的利用效率;當然,對于不同的工作對象,還可以選用不同零部件,如對于硬度不同、韌性不同的破碎對象,可以選用不同的釬桿,來達到有效破碎的目的。世界上比較有影響的幾家破碎設備生產(chǎn)廠家如克虜伯、Rammer公司、日本古河、卡特彼勒等,他們都是對某一種結(jié)構(gòu)形式的破碎錘進行系列化生產(chǎn),多的一種系列有十幾種型號。(3)功能多樣化、結(jié)構(gòu)柔性化。這一點是破碎錘近來最顯著的變化?,F(xiàn)在的破碎錘為了使用現(xiàn)代施工要求,已經(jīng)從功能單一的破碎設備發(fā)展到具有多種附加功能的多功能破碎設備。除了具備破碎功能外,對于大型的破碎錘可以利用其安裝外殼實行簡單的搬移功能,從而方便了本身的作業(yè);有些破碎錘同時具備陸上和水下作業(yè)功能;有些破碎錘具有噪聲和粉塵控制功能,成為典型的環(huán)保型產(chǎn)品;有的具有自動潤滑功能;有的具有防空打功能,從而具備了很高的可靠性?,F(xiàn)代破碎錘功能的多樣化,正是通過其結(jié)構(gòu)配置的柔性化來實現(xiàn)的。以上多種附加功能,都可以通過選購相應的功能裝置來進行配置,因而使破碎錘在功能上也具有了很大的柔性。(4)智能化。隨著液壓技術(shù)、電子技術(shù)、控制技術(shù)在工程機械上的不斷應用和發(fā)展,破碎錘也向著智能化方向發(fā)展。通過液壓控制技術(shù)和電子控制技術(shù),破碎錘能夠根據(jù)作業(yè)對象的不同,自動調(diào)節(jié)沖擊能和沖擊頻率。破碎錘實現(xiàn)自動調(diào)頻調(diào)能是破碎錘技術(shù)上的一個重大突破,也是破碎錘性能提升和發(fā)展的重要方向。(5)便捷的售后服務。任何產(chǎn)品生產(chǎn)出來后,最終都要走向市場,經(jīng)受市場的嚴格檢驗。在信息化、網(wǎng)絡化的服務型社會,產(chǎn)品的售后服務和技術(shù)支持是一個不可忽視的重要環(huán)節(jié),完善的售后服務和可靠的技術(shù)支持電同樣足提高產(chǎn)品競爭力的重要手段。國外的幾家大公司在這方面都做得非常出色。三、研究內(nèi)容及實驗方案1、總要求設計電動機下置式立軸錘式破碎機,該破碎機可以將尺寸小于200×200×150的脆性建筑垃圾粉碎成尺寸小于8×8×8的碎塊。2、給定的條件和要求電動機下置式立軸錘式破碎機設計;采用甩錘式結(jié)構(gòu),結(jié)合可更換破碎板工作;產(chǎn)量為每小時6噸;3、確定總體方案分析國內(nèi)外建筑垃圾破碎機發(fā)展和應用的情況,結(jié)構(gòu)類型和功能特點。結(jié)合國內(nèi)建筑行業(yè)的實際情況擬定建筑垃圾破碎機的總體方案,并對總體方案進行分析比較,最后確定總體方案。4、機械部分的設計(1)總體機械結(jié)構(gòu)設計,繪制總裝配圖。(2)傳動機構(gòu)設計,完成從電動機到主軸的傳動機構(gòu)的設計和計算,繪制部分裝配圖。(3)工作部件設計,完成主軸、甩錘、破碎板等工作部件設計,繪制工作部件部分裝配圖。(4)其他輔助機構(gòu)設計,完成除塵罩、進料口等鋼結(jié)構(gòu)部件的設計,繪制部分裝配圖。(5)主要零件設計,繪制主要零件的工作圖。5、撰寫畢業(yè)設計說明書6、外文資料翻譯7、圖紙要求機械結(jié)構(gòu)裝配圖要求視圖完整、符合最新國家標準,圖面整潔、質(zhì)量高。四、目標、主要特色及工作進度立軸錘式破碎機由上蓋、機殼、立軸轉(zhuǎn)子、底座和傳動裝置組成。上蓋一側(cè)上面設有喂料口(進料斗),中間設有轉(zhuǎn)子軸承座。機殼內(nèi)裝有可拆換的反擊板,中心立軸轉(zhuǎn)子安裝有數(shù)排對稱布置的打擊錘頭,傳動裝置由異步電動機、電機機座、張緊機構(gòu)及傳動機構(gòu)構(gòu)成,同立軸轉(zhuǎn)子相連,底座下部設有出料口及料斗。立軸錘式破碎機結(jié)構(gòu)簡圖如圖1如下:圖1立軸錘式破碎機結(jié)構(gòu)簡圖4.1立軸錘式破碎機的工作原理:立軸上設置有多層錘頭,由進料斗進來的物料利用物料自重均勻喂入,在自由墜落過程中,首先被上層高速運行的錘頭沖擊,物料被擊向反擊板,反擊板再將物料反彈向錘頭,隨物料的自重向錘頭與反擊板之間沖撞,物料與物料之間的沖撞,使物料粉碎,被粉碎的物料由底部出料斗排出機外。4.2立軸錘式破碎機的特點:該設備破碎比大,破碎水份含量高,對水份含量高的物料加工最為理想,出料粒度可任意調(diào)節(jié),無篩條設置,含泥沙量大的物料不會堵塞,不可破碎物進入機體可自動排出,不會造成設備的損壞。該設備粉碎特料直流,生產(chǎn)效率高,結(jié)構(gòu)獨特、運作平穩(wěn)、噪音低、維修方例,開啟工作倉門即可輕松更換損件。工作平穩(wěn)、運轉(zhuǎn)可靠、噪聲小、粉塵少。結(jié)構(gòu)合理,易損件種類少,操作、維修簡便。結(jié)構(gòu)緊湊,占地面積小。4.3方案對比:方案一:電動機上置的立軸錘式破碎機,通過帶輪和皮帶將電動機的轉(zhuǎn)矩傳遞給主軸,從而帶動錘頭旋轉(zhuǎn),來破碎物料。電動機上置的立軸錘式破碎機如下圖2所示:圖2電動機上置式立軸錘式破碎機方案二:電動機下置的立軸錘式破碎機,通過帶輪和皮帶將電動機的轉(zhuǎn)矩傳遞給主軸,從而帶動錘頭旋轉(zhuǎn),來破碎物料。電動機下置的立軸錘式破碎機如下圖圖3所示:圖3電動機下置式立軸錘式破碎機4.4論證結(jié)果1.破碎機總體方案的確定選擇電動機下置式錘式破碎機2.破碎機外形結(jié)構(gòu)的確定根據(jù)所給設計題目的要求:將尺寸小于200×200×150的脆性建筑垃圾粉碎成尺寸小于8×8×8的碎塊和每小時六噸的產(chǎn)量。破碎機的進料斗采用對稱的雙口進料。這樣可以在物料進入破碎腔時,更多的物料進行碰撞而破碎,減少了物料的粒度,從而也減輕了錘頭的工作量,減輕主軸的承載負荷,降低了電動機的功率。下面采用單個出料口,使在卸料的過程中,大塊的物料能夠再次破碎降低粒度。3.傳動機構(gòu)的確定由于破碎機的傳動不需要嚴格的傳動比,且根據(jù)它的破碎特點,采用帶式傳動。利用帶輪和傳動帶(v帶)間的摩擦將動力源(電動機)的動力傳遞給破碎機的主軸,帶動錘頭進行破碎。采用帶式傳動,能緩和載荷沖擊吸震,運動平穩(wěn),無噪聲;價格便宜;能夠?qū)崿F(xiàn)長距離的傳動。最重要的是在破碎機過載時將引起帶在帶輪上打滑,從而保護了主軸不被破壞。4.破碎機構(gòu)的確定破碎腔里面的破碎機構(gòu)采用單轉(zhuǎn)子多排錘可逆式,單轉(zhuǎn)子即一根主軸,多排錘頭通過連接裝置固定在主軸上,錘頭交錯布置。而且錘頭的回轉(zhuǎn)采用可逆式,這樣能夠在錘頭遇到大的破碎阻力時,錘頭向相反的方向轉(zhuǎn)動,減輕主軸的承載負荷,保護主軸不被損壞。里面的破碎襯板通過螺栓連接固定在筒體上。同時,在筒體上開有維修孔,方便對破碎機構(gòu)進行維修和更換。筒體和破碎機構(gòu)固定在底架上。電動機下置式立軸錘式破碎機結(jié)構(gòu)示意圖如下圖圖4:圖4電動機下置式立軸錘式破碎機結(jié)構(gòu)簡圖4.5工作進度1.查閱相關(guān)資料,外文資料翻譯(6000字符以上),撰寫開題報告。第1周—第2周2.運動及動力參數(shù)計算第3周—第4周3.總裝圖設計第5周—第8周4.主要零、部件強度及選用計算第9周—第10周5.完成進料口等輔助鋼結(jié)構(gòu)部件的設計第11周—第12周6.繪制零、部件圖第13周—第15周7.整理畢業(yè)論文及答辯準備第16周—第17周五、主要參考文獻【1】孫桓等主編.機械原理.北京:高等教育出版社,2001【2】濮良貴等主編.機械設計.北京:高等教育出版社,2001【3】胡家秀.機械零件設計實用手冊.北京:機械工業(yè)出版社,1999.【4】鄭鳴皋主編.破碎機綜述.北京:機械工業(yè)出版社,2001【5】范祖堯主編.現(xiàn)代機械設備設計手冊.北京:機械工業(yè)出版社,1996【6】徐灝主編.機械設計手冊(第四版).北京:機械工業(yè)出版社.1991【7】ShigleyJE,UicherJJ.Theoryofmachinesandmechanisms.NewYork:McGraw-HillBookCompany,198024點游戲課程設計報告1基本功能描述24點游戲是一種使用撲克牌來進行的益智類游戲,游戲內(nèi)容是:從一副撲克牌中抽去大小王剩下52張,任意抽取4張牌,把牌面上的數(shù)運用加、減、乘、除和括號等進行運算得出24。每張牌都必須使用一次,但不能重復使用。在不同版本中,對J、Q、和K的處理有些差異。一個常見的版本是把J、Q、和K去除,或當成10;還有一個版本是把J表示11,Q表示12,K代表13。本次課程設計采用將J、Q、K去除,使四張牌在1~10這十張牌中隨機取牌。具體功能如下:[1]由三個難度級別數(shù),分別為一級、二級和三級。每次發(fā)牌前可進行難度設置,若不設置,系統(tǒng)默認為難度級別數(shù)為二級。難度級別設置完后,點擊“發(fā)牌”按鈕,桌面上顯示四張翻開的撲克牌,并且游戲開始計時,進度條開始前進。[2]在規(guī)定的時間內(nèi),用戶可以在輸入算式編輯框中輸入想好的算式,并按下“驗算”按鈕。如果不輸入任何數(shù)字和算符,會彈出“表達式有問題!”,然后再彈出一個對話框,顯示“對不起,您的輸入不正確!”;如果輸入的數(shù)字與給出的不符或者符號不合法,會彈出“對不起,您的輸入不正確!”;如果輸入的數(shù)字與四張牌相符、字符亦合法但是答案不正確,就會出現(xiàn)“Theresultis:!”;如果輸入算式經(jīng)運算后所得答案正確,則會彈出“你做對了!”。點擊彈出對話框的確定按鈕,會出現(xiàn)本輪的用時和分數(shù)。[3]如果在規(guī)定的時間內(nèi),沒有點擊驗算按鈕,則會彈出一個對話框,上面顯示“TimeOver!”。[4]在結(jié)束本輪游戲后,如果用戶想繼續(xù)游戲,點擊“重新發(fā)牌”按鈕即可重新發(fā)牌;如果用戶想結(jié)束游戲,點擊“結(jié)束”按鈕即可結(jié)束游戲。2設計思路24點游戲的具體流程圖如下圖1所示,下面對流程圖進行詳細的說明。在游戲開始前有難度設置選項,用戶可根據(jù)自己的實際水平進行設置。難度級別有三個級別,分別為一級、二級和三級。三個級別是通過時間來區(qū)別的,級別越高,可用時間越少。三個級別的對應時間分別是100秒、60秒和50秒。該設置不是必選項。如果用戶不設置,系統(tǒng)默認為難度級別二。按下“發(fā)牌”,游戲開始,通過調(diào)用srand()和rand()函數(shù),桌面上會隨機顯示出4張紙牌,這四張牌從1~10這10張牌中隨機調(diào)出。同時,標識耗時時標的進度條開始前進(m_Progress1->SetPos(m_Progress1->GetPos()+1),計時同步開始(SpendTime++)。由于三個等級設置的時間不一樣,進度條在三種情況下的步長也不相同。YYNNYNYYN是否設置難度?一級:m_Hardlevel=100二級:m_Hardlevel=60三級:m_Hardlevel=50系統(tǒng)默認難度級別為二級m_Hardlevel=60初始化:OnInitDialog()發(fā)牌:srand();rand()計時開始:OnTimer()輸入算式,進行計算SubCompute();TotalCompute()m_Progress1->GetPos()>=m_Hardlevel顯示“TimeOver!”AfxMessageBox()OnYanSuan()函數(shù)判斷計算結(jié)果是否為24?算式為空白:顯示:“表達式不能為空白!”輸入字符錯誤:顯示:“對不起,你的輸入不正確!”運算結(jié)果正確:“你做對了!”運算結(jié)果錯誤:顯示:“Theresultis:!”繼續(xù)否?結(jié)束開始圖1圖124點游戲程序流程圖游戲設置了時間限制,該設置是通過比較函數(shù)m_Progress1->GetPos()的返回值和參數(shù)m_Hardlevel的大小。如果函數(shù)的返回值小于參數(shù)m_Hardlevel,代表游戲還沒結(jié)束,用戶還有時間進行思考。否則,本輪游戲結(jié)束,在函數(shù)OnTimer()的作用下,會彈出對話“TimeOver!”。若用戶在規(guī)定時間內(nèi)點擊了“驗算”按鈕,系統(tǒng)通過對SubCompute()和TotalCompute()兩函數(shù)的調(diào)用進行相應運算,緊接著系統(tǒng)調(diào)用OnYanSuan()函數(shù)對編輯框中運算出的結(jié)果進行驗算,根據(jù)驗算情況給出相應的結(jié)果。出現(xiàn)的結(jié)果有以下四中情況:(1)如果用戶沒在輸入算式中輸入算式,直接按“驗算”按鈕,會彈出“表達式不能為空白!”的提示對話框。(2)如果輸入的數(shù)字與給出的不符或者符號不合法,會彈出“你的輸入不正確!”的提示對話框。(3)如果輸入的數(shù)字與四張牌相符、字符亦合法但是答案不正確,會彈出“Theresultis:!”。(4)如果輸入算式經(jīng)運算后所得答案正確,則會彈出“你做對了!”在以上任意一種情況下,點擊彈出框中的“確定”按鈕,系統(tǒng)會自動給出本局的得分和耗時。游戲的耗時使用SSpendTime.Format("%d",SpendTime)這個函數(shù)進行顯示,游戲得分是在綜合考慮游戲級別、游戲所耗費時間的基礎(chǔ)上給出(m_score=100*(m_Hardlevel-SpendTime)/m_Hardlevel)。于是,本輪游戲結(jié)束。本輪游戲結(jié)束后,用戶可以選擇重新開始,否則,可以點擊“結(jié)束”按鈕退出游戲。3軟件設計3.1設計步驟24點游戲的具體設計步驟如下:[1]創(chuàng)建MFCAppWizard(exe)工程,鍵入對應的工程名(dinglu),在應用程序類型中選擇基本對話框,其余的都采用默認選項,完成對話框的創(chuàng)建。[2]通過插入-資源-Bitmap加載圖片,圖片通過拷貝和復制等操作加載完成。加載完成的圖片在對應的工作區(qū)可以找到,選中對其名字進行修改。在對話框中添加4個圖像、9個按鈕、3個編輯框、1個進度條和3個單選按鈕。然后,根據(jù)屬性對以上所添加的控件進行屬性修改,主要是對其進行重命名。圖像內(nèi)的屬性修改除改名外,還要添加位圖。[3]下一步是對以上控件建立類向?qū)?,主要包括AddFunction、AddVariable和EditCode這三項的添加。[4]在類的原文件中添加實現(xiàn)功能所需要的各種函數(shù),并添加相應的代碼,同時在頭文件中添加對各種函數(shù)及變量的聲明。[5]對完成的程序進行保存,然后開始調(diào)試,根據(jù)錯誤進行修改,直至程序不在報錯,并且可以實現(xiàn)預計的各種功能。圖224點游戲運行圖3.2界面設計24點游戲所用控件說明圖如下:表1控件類型、ID及相關(guān)說明對象IDCaption或說明變量名進程IDC_PROGRESS1耗時m_Progress1靜態(tài)文本IDC_STATIC靜態(tài)文字說明一級單選按鈕IDC_RADIO1一級m_Hardleve二級單選按鈕IDC_RADIO2二級三級單選按鈕IDC_RADIO3三級位圖IDC_Picture0位圖位圖IDC_Picture1位圖位圖IDC_Picture2位圖位圖IDC_Picture3位圖編輯框IDC_EDIT1輸入計算m_Edit1編輯框IDC_STATIC10時間SpendTime編輯框IDC_STATIC11得分m_score按鈕IDC_Start開始按鈕IDC_YanSuan驗算續(xù)表對象IDCaption或說明變量名按鈕IDC_OK退出按鈕IDC_PARENL_BUTTON(按鈕IDC_ADD_BUTTON+按鈕IDC_SUB_BUTTON-按鈕IDC_MUL_BUTTON*按鈕IDC_DEVIDE_BUTTON/按鈕IDC_PARENR_BUTTON)3.3關(guān)鍵功能的實現(xiàn)3.3.1發(fā)牌功能的實現(xiàn)首先,通過BOOLCDingluDlg::OnInitDialog()中,根據(jù)紙牌對應的ID號加載紙牌,例如:Bitmap[7].LoadBitmap(IDB_BITMAP7)這條語句加載標有7的紙牌。利用該函數(shù)加載了標號1~10的十張紙牌和兩張背景紙牌。然后運行中的以下一段代碼,即可在圖像框中得到四張鋪開的紙牌。代碼如下:srand((int)time(0));for(inti=0;i<4;i++)Number[i]=rand()%13;//產(chǎn)生一個0—12的隨機數(shù)((CStatic*)GetDlgItem(IDC_Picture0))->SetBitmap(HBITMAP(Bitmap[Number[0]]));((CStatic*)GetDlgItem(IDC_Picture1))->SetBitmap(HBITMAP(Bitmap[Number[1]]));((CStatic*)GetDlgItem(IDC_Picture2))->SetBitmap(HBITMAP(Bitmap[Number[2]]));((CStatic*)GetDlgItem(IDC_Picture3))->SetBitmap(HBITMAP(Bitmap[Number[3]]));srand(seed)用來設置rand()產(chǎn)生隨機數(shù)時的隨機數(shù)種子。參數(shù)seed必須是個整數(shù),通常可以利用geypid()或time(0)的返回值來當做seed。如果每次seed都設相同值,rand()所產(chǎn)生的隨機數(shù)值每次就會一樣。rand的內(nèi)部實現(xiàn)是用線性同余法做的,他不是真的隨機數(shù),只不過是因為其周期特別長,所以有一定的范圍里可看成是隨機的,rand()會返回一隨機數(shù)值,范圍在0至RAND_MAX間。在調(diào)用此函數(shù)產(chǎn)生隨機數(shù)前,必須先利用srand()設好隨機數(shù)種子,如果未設隨機數(shù)種子,rand()在調(diào)用時會自動設隨機數(shù)種子為1。rand()產(chǎn)生的是假隨機數(shù)字,每次執(zhí)行時是相同的。若要不同,以不同的值來初始化它.初始化的函數(shù)就是srand()。3.3.2計時功能的實現(xiàn)首先,在voidCDingluDlg::OnStart()中,通過m_Progress->SetStep(1)和m_Progress->SetPos(0)設置進度條的步長為1,進度條的初始位置居左。然后調(diào)用voidCDingluDlg::OnTimer(UINTnIDEvent)來完成計時功能。利用函數(shù)if(m_Progress1->GetPos()>=m_Hardlevel)來判斷即使結(jié)束了沒有,如果括號中的條件滿足,則計時結(jié)束,跳出“TimeOver!”的提示框。如果括號中的條件不滿足,則執(zhí)行以下代碼:CProgressCtrl*m_Progress1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);m_Progress1->SetRange(0,m_Hardlevel);m_Progress1->SetPos(m_Progress1->GetPos()+1);//進度條前進一步上述代碼表示,如果時間沒到,時間每流逝1秒,進度條就前進一步。當游戲時間即將結(jié)束的時候,進度條亦前進到最后一步。3.3.3計算功能的實現(xiàn)對于輸入結(jié)果的驗算,主要是通過intLastPos(CStringStr),intFirstPos(CStringStr),charFirstF(CStringStr),intSubCompute(CStringStr),intTotalCompute(CStringStr)等函數(shù)來來確定運算式各符號優(yōu)先級和最終計算出輸入算式的結(jié)果?,F(xiàn)摘兩段代碼進行詳細說明。代碼1:intPluPos=Str.Find('+')+1;intPos=200;if(PluPos==0)PluPos=200;if(Pos>PluPos)Pos=PluPos;charResult='-';inttempPos=SubPos;if(PluPos<tempPos){Result='+';tempPos=PluPos;}returnResult;代碼1的作用是判斷最先出現(xiàn)的符號是不是+號。Pluspos表示+號出現(xiàn)的位置,如果沒有+號出現(xiàn),對pluspos負一個不可能的值;如果+號存在,將pluspos與pos比較大小。如果pluspos小于pos,將pluspos的值負給pos。pluspos再與tempos比較,如果在減號之前出現(xiàn),顯示的結(jié)果是+號。代碼2:intCDingluDlg::TotalCompute(CStringStr){ intFirst=Str.ReverseFind('(')+1; while(First) {CStringSubStr=Str.Mid(First,(Str.GetLength()-First)); intLast=SubStr.Find(')')+1; Last+=First CStringLeft=Str.Mid(0,First-1) CStringMiddle=Str.Mid(First,Last-First-1) CStringRight=Str.Mid(Last,Str.GetLength()-Last) intResult=SubCompute(Middle) Middle.Format("%d",Result); Str=Left+Middle+Right; First=Str.ReverseFind('(')+1; } intResult=SubCompute(Str); returnResult;}代碼2的作用是對于編輯框中輸入的表達式進行計算,系統(tǒng)通過Str.ReverseFind('(')+1來反向查找定位第一個“(”所在的位置。然后通過while循環(huán)查找到表達式最內(nèi)層的括號,又借助于Str=Left+Middle+Right;將有優(yōu)先級差別同時不帶括號的表達式傳送到SubCompute()函數(shù)中,最終計算出輸入到編輯框中的表達式結(jié)果Result,并將其返回。3.3.4驗算功能的實現(xiàn)1.彈出框的實現(xiàn)在規(guī)定的時間內(nèi)輸入算式進行驗算,根據(jù)不同的情況會出現(xiàn)不同的對話框。有以下四種情況:如果用戶沒在輸入算式中輸入算式,直接按“驗算”按鈕,會彈出“表達式不能為空白!”的提示對話框;如果輸入的數(shù)字與給出的不符或者符號不合法,會彈出“你的輸入不正確!”的提示對話框;如果輸入的數(shù)字與四張牌相符、字符亦合法但是答案不正確,會彈出“Theresultis:!”;如果輸入算式經(jīng)運算后所得答案正確,則會彈出“你做對了!”。具體代碼如下:if(Str==""){MessageBox("表達式不能為空白!","Warning!",MB_OK);flag=0;}if(Result==24)MessageBox("你輸入正確!","TURE!",MB_OK);由于代碼太長,只摘取不輸入與輸入計算結(jié)果正確兩種情況進行說明。當輸入Str為空時,通過MessageBox()顯示“表達式不能為空白!”。當輸入算式正確,判斷計算結(jié)果Result==24,通過MessageBox()顯示“你輸入正確!”。當輸入字符有錯,通過一段很長的程序判斷,然后通過MessageBox()顯示“你輸入的不正確!”。2.等分功能的實現(xiàn)當用戶在每局游戲結(jié)束后,如果沒有計算出正確結(jié)果,得分會顯示為0分;如果計算出了正確結(jié)果,則會顯示一個0~100之間的整數(shù)值。用戶最終得分的確定是由其選擇的游戲級別和游戲所花費時間長短來確定的。實現(xiàn)代碼如下:if(Result==24){CStringSscore; m_score=100*(m_Hardlevel-SpendTime)/m_Hardlevel;Sscore.Format("%d",m_score); GetDlgItem(IDC_STATIC11)->SetWindowText(""+Sscore+"分");UpdateData(FALSE);}OnYanSuan()函數(shù)來對編輯框中運算出的結(jié)果進行驗算,如果Result==24,則if語句被執(zhí)行。語句m_score=100*(m_Hardlevel-SpendTime)/m_Hardlevel;說明用戶花費時間越長或者游戲剩余時間占總時間比重越小,則本局游戲得分也相應越小。而通過語句Sscore.Format("%d",m_score);的作用則將int量m_score轉(zhuǎn)換為Cstring量Sscore。同時,SetWindowText()函數(shù)發(fā)揮作用,顯示出分數(shù)Sscore。4結(jié)論與心得體會VC++的課程設計終于接近尾聲了,又到了寫課程設計報告的時間了。這次課設比以往的課設任務重、安排緊。之所以這么安排,我是這么理解的,這次安排單片機的課設是為了鞏固上課所學的知識,將其應用到實踐中來,好歹也是這學期學的。至于安排VC++的課設,我開始是很不能理解,因為我們是大二上學期學的,丟了快一年了,現(xiàn)在做課設又得重新將它撿起來,這很費時間。后來做完課設,看著自己的游戲界面,可以像平時玩的小游戲一樣玩,感覺還挺自豪的,覺得這一星期沒有白過。這一星期走來,我感受頗多,大約有以下幾點:首先,這次課設對VC+起到溫故知新的作用。課程設計之初,思路全無,舉步維艱,對于理論知識學習不夠扎實的我深感“書到用時方恨少”。于是,重新?lián)炱鹫n本,對照課本基本控件這一章,將計算器和菜單欄制作這兩個范例做了幾遍。對于進程條的設置不清楚,又找同學復制了以前的課件來看,經(jīng)與同學的再三討論,終于弄清了進程條的設置。至于編程這一塊,那是忘得更多了,于是又借了基本參考書來看,遇到難處先是仔細的思考然后在向同學請教??梢哉f開始的那么幾天都是在查找資料,翻閱相關(guān)的書籍。其次,這次課設讓我明白了實踐出真理的道理。最初答辯弄完后,還有一些程序不知道怎么寫。于是,又從網(wǎng)上收集相關(guān)程序,經(jīng)分析、查詢資料仍有一些地方看不懂。只能采用嘗試往對話框中添加相應代碼的方法。根據(jù)一大段的分析,感覺程序執(zhí)行某個功能,將這段代碼添加到對應位置。所有的代碼添加完后,運行、調(diào)試,開始會有很多錯誤出現(xiàn)。我記得最多的時候有63個錯誤,逐條進行修改,再進行運行和調(diào)試。也不知道改了多少次和重做了多少次,終于做出了完美的游戲界面。再者,讓我學會了如何創(chuàng)新。得到游戲界面后,我又從網(wǎng)上下了幾個24點游戲與我的相比較。相比較發(fā)現(xiàn),網(wǎng)上的游戲出牌比較合理,我的游戲出牌很雜亂,很多情況都是無解,我也相應做了調(diào)整。再者,我發(fā)現(xiàn)很多游戲都是倒計時,我也進行了嘗試。除此,我發(fā)現(xiàn)有些游戲也加了四張牌的按鈕,一發(fā)牌,對應的牌就顯示在快捷鍵上,這點我也做了嘗試。以上三點,就是我關(guān)于本次課設的創(chuàng)新,雖然最后沒能實現(xiàn),但這個過程的實踐是快樂的,代表我開動了腦筋。最后,這是一場毅力的考驗。課設開始給人感覺很難,但很慶幸我們都沒有畏懼,還是盡力去查資料、想辦法解決。怎么說,“態(tài)度決定一切”,我們終于跨越了這道障礙,圓滿完成了課設。5參考文獻[1]劉於勛等.C++程序設計.科學出版社,2007[2]榮欽科技.VisualC++游戲編程基礎(chǔ).電子工業(yè)出版社,2004[3]揣錦華.面向?qū)ο蟪绦蛟O計與VC++實踐.西安電子科技大學出版社,2005[4]羅偉堅.VisualC++經(jīng)典游戲程序設計.人民郵電出版社,20066思考題1.改變難度可以變化游戲的限時和游戲加分的規(guī)則,如何實現(xiàn)?游戲的限時是通過對進度條的設置來實現(xiàn)的,通過定義一個m_Hardlevel變量之后,用它來設置進度條的范圍(SetRange(0,m_Hardlevel);),即當用戶選擇不同級別的游戲時,進度條的范圍會隨著m_Hardlevel的值而不同,游戲難度越大,m_Hardlevel的值越小(本游戲中共設置了100秒、60秒、50秒三個級別),時間也就越短,反之時間越長。游戲的加分規(guī)則綜合考慮了用戶選擇的游戲級別和一局游戲所花費時間的長短,即:m_score=100*(m_Hardlevel-SpendTime)/m_Hardlevel;也就是說難度的選擇和用戶所用時間同時決定最后的得分。2.如何保證程序是根據(jù)給出的牌來書寫算式的?答:首先通過每張紙牌的ID號,將它們加載到Bitmap[]中,通過隨機函數(shù)得到四個隨機數(shù)之后,亦即得到四張系統(tǒng)隨機發(fā)放的紙牌;然后利用指針將得到的紙牌在voidCDingluDlg::OnStart()中進行相應設置;最后在voidCDingluDlg::OnYanSuan()中,通過Mid()和intm=(int)(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring));獲取用戶輸入到編輯框中的數(shù)據(jù),將m和Number[i]進行比較,從而最終確保程序是根據(jù)給出的牌來書寫算式的。3.如何使用隨機函數(shù)控制撲克牌的顯示?答:首先在BOOLCDingluDlg::OnInitDialog()中,用紙牌對應的ID號對紙牌進行加載(如Bitmap[12].LoadBitmap(IDB_BITMAP12)),然后在voidCDingluDlg::OnStart()中,利用srand((int)time(0));和Number[i]=rand()%13;兩條語句選出相對應的四張紙牌,即可得到隨機發(fā)放的四張撲克牌了。7附錄7.1調(diào)試報告7.1.1變量未定義造成錯誤在代碼添加過程中,由于涉及很多的函數(shù)和變量,可能會出現(xiàn)某幾個變量忘定義的情況,這些變量有可能是在頭文件中忘記定義或者在某個函數(shù)體中忘記定義。下面舉一個在頭文件中變量忘定義的例子,如下所示:圖3因變量未定義而出現(xiàn)的錯誤截面圖在添加完各個函數(shù)的代碼完畢后,以為頭文件會自動對相應得變量進行定義,但頭文件沒有對所有的變量都定義,才出現(xiàn)了如上圖所示的錯誤。打開頭文件,雙擊dingluDlg.h,在classCDingluDlg:publicCdialog類定義函數(shù)中添加對m_Hardlevel參數(shù)的定義。添加完畢后,程序不再報這個錯誤。7.1.2關(guān)鍵類未添加在畫圖對話框中,擺好各種控件后,逐一對每個控件添加類向?qū)?。對話框中出現(xiàn)的控件一般都不會忘記建立類向?qū)?,但有1個類向?qū)侨菀淄浀?,它是IDC_PROGRESS1建立的類向?qū)Q是OnOutofmemoryProgress1。下面用圖形表示這個錯誤,如下所示:根據(jù)錯誤提示,重新選中圖片,建立OnOutofmemoryProgress1的類向?qū)?。建立完畢后,重新運行程序,不再提示開錯誤。圖4因關(guān)鍵類未添加而出現(xiàn)的錯誤截面圖7.1.3進度條錯誤類導向和代碼添加完后,運行程序,出現(xiàn)游戲界面。點擊游戲界面內(nèi)的“發(fā)牌”按鈕,出現(xiàn)四張撲克展開,但是沒過2秒鐘跳出“TimeOver!”對話框,并且進度條不動。下面用圖形表示這個錯誤,如下圖所示:圖5進度條設置錯誤而出現(xiàn)的錯誤截面圖這個錯誤可能是計時時間設置的太短,進度條的步長設置的不合理。重新設置計時時間范圍和進度條步長,然后運行程序,錯誤仍然存在。再從頭到尾把程序檢查一遍,做相應修改,再運行,錯誤仍然存在。于是將所有類刪除后重新添加,并且添加相應程序,重新運行,錯誤消失。7.2測試結(jié)果7.2.1在規(guī)定時間內(nèi)完成點擊“驗算”按鈕操作測試過程中,由于既涉及到紙牌點數(shù)和運算符,又會涉及到運算式結(jié)果,于是相應地會顯示出四種結(jié)果,分別是:如果用戶沒在輸入算式中輸入算式,直接按“驗算”按鈕,會彈出“表達式不能為空白!”的提示對話框;如果輸入的數(shù)字與給出的不符或者符號不合法,會彈出“你的輸入不正確!”的提示對話框;如果輸入的數(shù)字與四張牌相符、字符亦合法但是答案不正確,會彈出“Theresultis:!”;如果輸入算式經(jīng)運算后所得答案正確,則會彈出“你做對了!”。下面用圖形做相應說明:[1]輸入算式為空,點擊“驗算”,顯示“表達式不能為空白!”,如下圖所示:圖6輸入表達式為空而出現(xiàn)的游戲界面[2]輸入的數(shù)字與給出的不符或者符號不合法,點擊“驗算”,會彈出“你的輸入不正確!”,如下圖所示:圖7輸入字符錯誤而出現(xiàn)的游戲界面[3]如果輸入的數(shù)字與四張牌相符、字符亦合法但是答案不正確,點擊“驗算”,會彈出“Theresultis:!”,如下圖所示:圖8輸入字符正確而運算結(jié)果不正確出現(xiàn)的游戲界面[4]如果輸入算式經(jīng)運算后所得答案正確,點擊“驗算”,則會彈出“你做對了!”,如下圖所示:圖9輸入結(jié)果正確而出現(xiàn)的游戲界面7.2.2在規(guī)定時間內(nèi)未完成點擊“驗算”按鈕操作規(guī)定時間內(nèi)未進行輸入,或輸入后未完成點擊“驗算”按鈕操作,顯示“TimeOver!”,如下圖所示:7.3關(guān)鍵源代碼BOOLCDingluDlg::OnInitDialog()/程序初始化{ CDialog::OnInitDialog(); Bitmap[0].LoadBitmap(IDB_BITMAP13);//為紙牌圖片的數(shù)組加載13張初始圖像Bitmap[1].LoadBitmap(IDB_BITMAP1);Bitmap[2].LoadBitmap(IDB_BITMAP2); Bitmap[3].LoadBitmap(IDB_BITMAP3);Bitmap[4].LoadBitmap(IDB_BITMAP4);Bitmap[5].LoadBitmap(IDB_BITMAP5);Bitmap[6].LoadBitmap(IDB_BITMAP6); Bitmap[7].LoadBitmap(IDB_BITMAP7);Bitmap[8].LoadBitmap(IDB_BITMAP8); Bitmap[9].LoadBitmap(IDB_BITMAP9); Bitmap[10].LoadBitmap(IDB_BITMAP10); Bitmap[11].LoadBitmap(IDB_BITMAP11); Bitmap[12].LoadBitmap(IDB_BITMAP12);CProgressCtrl*m_Progress1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/設置時間的指針m_Progress1->SetRange(0,1000);/設置進度條的取值范圍 m_Progress1->SetPos(0);//設置進度條的初值GetDlgItem(IDC_YanSuan)->EnableWindow(FALSE);/使驗算按鈕無效CheckRadioButton(IDC_RADIO1,IDC_RADIO3,IDC_RADIO2);/測試選中的難度級別UpdateData(FALSE);/難度級別顯示voidCDingluDlg::OnStart()/發(fā)牌代碼{ S=1; m_Edit1=_T("");/對編輯框清空 m_score=0;/將等分初始化為0 UpdateData(FALSE);/用負給控件變量的值來刷新控件,讓控件把操作后的變量顯示出srand((int)time(0));/以(int)time(0)做為srand()函數(shù)的種子seed for(inti=0;i<4;i++)/應用for語句來為四張牌賦值Number[i]=rand()%13;/產(chǎn)生一個0—12的隨機數(shù)((CStatic*)GetDlgItem(IDC_Picture0))->SetBitmap(HBITMAP(Bitmap[Number[0]]));((CStatic*)GetDlgItem(IDC_Picture1))->SetBitmap(HBITMAP(Bitmap[Number[1]]));((CStatic*)GetDlgItem(IDC_Picture2))->SetBitmap(HBITMAP(Bitmap[Number[2]]));((CStatic*)GetDlgItem(IDC_Picture3))->SetBitmap(HBITMAP(Bitmap[Number[3]]));/將隨機產(chǎn)生的四張圖片加載在四張撲克牌位置 GetDlgItem(IDC_Start)->SetWindowText("重新開始");/將“發(fā)牌”按鈕的名字改為“重新開始” GetDlgItem(IDC_YanSuan)->EnableWindow(TRUE);/使驗算按鈕被鼠標點擊有效 /設置三個難度級別intiRADIO=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3); if(iRADIO==IDC_RADIO1){m_Hardlevel=100;}/一級,允許時間為100秒elseif(iRADIO==IDC_RADIO2){m_Hardlevel=60;}/二級,允許時間為60秒 elseif(iRADIO==IDC_RADIO3){m_Hardlevel=50;}/三級,允許時間為50秒CProgressCtrl*m_Progress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/定義進度條指針變量m_Progressm_Progress->SetStep(1);//設置步長值為1m_Progress->SetPos(0);//進度條初始位置居左SetTimer(1,1000,NULL);/設置計時器,每隔1秒發(fā)出一個消息映射 SpendTime=0;/游戲耗時初始化為0GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE);/游戲開始后,難度選擇按鈕禁用GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);GetDlgItem(IDC_RADIO3)->EnableWindow(FALSE); }voidCDingluDlg::OnTimer(UINTnIDEvent){if(nIDEvent==1)/判斷計時器 { CProgressCtrl*m_Progress1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/定義進度條指針變量m_progress1 m_Progress1->SetPos(m_Progress1->GetPos()+1);/進度條前進一步 m_Progress1->SetRange(0,m_Hardlevel);/進度條的變化范圍在0與m_Hardlevel之間 if(m_Progress1->GetPos()>=m_Hardlevel)/計時是否結(jié)束的判斷語句 { KillTimer(nIDEvent);/計時停止 AfxMessageBox("TimeOver!",MB_OK);/顯示“TimeOver!”對話框GetDlgItem(IDC_YanSuan)->EnableWindow(FALSE);/使驗算按鈕無效GetDlgItem(IDC_RADIO1)->EnableWindow(TRUE);GetDlgItem(IDC_RADIO2)->EnableWindow(TRUE);GetDlgItem(IDC_RADIO3)->EnableWindow(TRUE);/使三個難度級別按鈕無效 } } SpendTime++;/時間的流逝,執(zhí)行一次,自加一次 CStringSSpendTime;/定義指針變量SSpendTime SSpendTime.Format("%d",SpendTime);/輸出SSpendTime字符串中的內(nèi)容 GetDlgItem(IDC_EDIT3)->SetWindowText(""+SSpendTime+"秒");/顯示時鐘秒的時間 CStringSscore;/定義指針變量SscoreSscore.Format("%d",m_score);/輸出字符串Sscore中的內(nèi)容GetDlgItem(IDC_EDIT4)->SetWindowText(""+Sscore+"分");/顯示時鐘分的時間 CDialog::OnTimer(nIDEvent); }/判斷最先出現(xiàn)的符號是+號、-號、*號還是/號charCDingluDlg::FirstF(CStringStr){ intSubPos=Str.Find('-')+1;/從字符串Str中查找減號的位置 intPluPos=Str.Find('+')+1;/從字符串Str中查找加號的位置 intMulPos=Str.Find('*')+1;/從字符串Str中查找乘號的位置 intDivPos=Str.Find('/')+1;/從字符串Str中查找除號的位置 intPos=200;/設定一個變量,并賦初值200 if(SubPos==0) SubPos=200;/如果沒有減號,給SubPos賦一個不可能的值 if(PluPos==0) PluPos=200;/如果沒有加號,給PluPos賦一個不可能的值 if(MulPos==0) MulPos=200;/如果沒有乘號,給MulPos賦一個不可能的值 if(DivPos==0) DivPos=200;/如果沒有除號,給DivPos賦一個不可能的值 if(Pos>SubPos) Pos=SubPos;/減號存在,并且把SubPos的值賦給Posif(Pos>PluPos) Pos=PluPos;/加號存在,并且把PlusPos的值賦給Pos if(Pos>MulPos) Pos=MulPos;/乘號存在,并且把MulPos的值賦給Pos if(Pos>DivPos) Pos=DivPos;/除號存在,并且把DivPos的值賦給Pos charResult='-';/將'-'賦給Result inttempPos=SubPos;/定義變量tempPos,并將SubPos的值賦給tempPos if(PluPos<tempPos) { Result='+'; tempPos=PluPos;/如果+號在-號之前出現(xiàn),Result的值為'+' } if(MulPos<tempPos) { Result='*'; tempPos=MulPos;/如果*號在-號之前出現(xiàn),Result的值為'*' } if(DivPos<tempPos) { Result='/'; tempPos=DivPos;/如果/號在-號之前出現(xiàn),Result的值為'/' } returnResult;/將Result的值返回}/定位第一個算術(shù)符號的位置intCDingluDlg::FirstPos(CStringStr) { intSubPos=Str.Find('-')+1;/從字符串Str中查找減號的位置 intPluPos=Str.Find('+')+1;/從字符串Str中查找加號的位置 intMulPos=Str.Find('*')+1;/從字符串Str中查找乘號的位置 intDivPos=Str.Find('/')+1;/從字符串Str中查找除號的位置 intPos=200; if(SubPos==0)/如果沒有-號 SubPos=200;/將SubPos設置成一個不可能的值 if(PluPos==0)/如果沒有+號 PluPos=200;/將PluPos設置成一個不可能的值 if(MulPos==0)/如果沒有*號 MulPos=200;/將MulPos設置成一個不可能的值 if(DivPos==0)/如果沒有/號 DivPos=200;/將DivPos設置成一個不可能的值 if(Pos>SubPos) Pos=SubPos;/減號存在,并且把SubPos的值賦給Posif(Pos>PluPos) Pos=PluPos;/加號存在,并且把PlusPos的值賦給Pos if(Pos>MulPos) Pos=MulPos;/乘號存在,并且把MulPos的值賦給Pos if(Pos>DivPos) Pos=DivPos;/除號存在,并且把DivPos的值賦給Pos returnPos;/將Pos的值返回 }/定位最后一個算術(shù)符號的位置intCDingluDlg::LastPos(CStringStr) { intSubPos=Str.ReverseFind('-')+1;/從字符串Str中查找減號的位置 intPluPos=Str.ReverseFind('+')+1;/從字符串Str中查找加號的位置 intMulPos=Str.ReverseFind('*')+1;/從字符串Str中查找乘號的位置 intDivPos=Str.ReverseFind('/')+1;/從字符串Str中查找除號的位置 intPos=SubPos;/定義變量Pos,并給它賦初值 if(Pos<PluPos)/通過以下條件更改Pos的值 Pos=PluPos; if(Pos<MulPos) Pos=MulPos; if(Pos<DivPos) Pos=DivPos; returnPos;/返回Pos的值 }intCDingluDlg::SubCompute(CStringStr){ CStringMiddle=""; CStringMul2=""; CStringRight="";/定義三個變量,Middle、Mul2、Right intMulPos=Str.Find('*')+1;/定義*號的位置 intDivPos=Str.Find('/')+1;/定義/號的位置 intFirst=MulPos; if(MulPos>DivPos) First=DivPos;/如果/號在*號之前出現(xiàn),將DivPos的值送給First if(DivPos==0&&MulPos!=0) { First=MulPos; DivPos=2000;/除號不存在,并且乘號存在,將MulPos的值送給First,并且將DivPos設為不可能值 } if(MulPos==0&&DivPos!=0) { First=DivPos; MulPos=2000;/乘號不存在,并且除號存在,將DivPos的值送給First,并且將MulPos設為不可能值} while(First) { CStringtempStr=Str.Mid(0,First-1);inttemp=LastPos(tempStr); CStringLeft=Str.Mid(0,temp); CStringMul1=Str.Mid(temp,First-temp-1); tempStr=Str.Mid(First,Str.GetLength()-First); temp=FirstPos(tempStr); if(temp==200) {Mul2=tempStr; Right=""; } else { Mul2=tempStr.Mid(0,temp-1); Right=tempStr.Mid(temp-1,tempStr.GetLength()-temp+1); } if(MulPos>DivPos) Middle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)/ strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring))); elseMiddle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)* strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring))); Str=Left+Middle+Right; MulPos=Str.Find('*')+1; DivPos=Str.Find('/')+1;First=MulPos; if(MulPos>DivPos) First=DivPos; if(DivPos==0&&MulPos!=0) {First=MulPos; DivPos=2000;}/將除號所在位置設置成一個大于MulPos但又不可能的值 if(MulPos==0&&DivPos!=0) {First=DivPos; MulPos=2000;}/將乘號所在的位置設置成一個大于DivPos但不可能的值 }/定位+號、-號首先出現(xiàn)的位置 First=FirstPos(Str); if(First==200)/如果沒有+號、-號,則可以直接返回結(jié)果 return(int)strtod(Str.GetBuffer(Str.GetLength()),&stopstring); charFuhao=FirstF(Str);/確定首先出現(xiàn)的符號是+號還是-號 while(First) {/如果找到+號或-號 CStringtempStr=Str.Mid(0,First-1);inttemp=LastPos(tempStr); CStringLeft=Str.Mid(0,temp); CStringMul1=Str.Mid(temp,First-temp-1);tempStr=Str.Mid(First,Str.GetLength()-First); temp=FirstPos(tempStr); if(temp==200) {Mul2=tempStr;Right="";} else {Mul2=tempStr.Mid(0,temp-1);Right=tempStr.Mid(temp-1,tempStr.GetLength()-temp+1);} if(Fuhao=='+') Middle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)+ strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring))); elseMiddle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)- strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring))); Str=Left+Middle+Right; First=FirstPos(Str); if(First==200)break; Fuhao=FirstF(Str);} return(int)strtod(Middle.GetBuffer(Middle.GetLength()),&stopstring);}/用于計算表達式的結(jié)果intCDingluDlg::TotalCompute(CStringStr){ intFirst=Str.ReverseFind('(')+1; while(First) {CStringSubStr=Str.Mid(First,(Str.GetLength()-First)); intLast=SubStr.Find(')')+1; Last+=First;/定位最后一個(號以后的最開始的)號位置 CStringLeft=Str.Mid(0,First-1);/(號左邊的字符串 CStringMiddle=Str.Mid(First,Last-First-1);/()號中間的字符串 CStringRight=Str.Mid(Last,Str.GetLength()-Last);/()號右邊的字符串 intResult=SubCompute(Middle);/進入下面的計算 Middle.Format("%d",Result); Str=Left+Middle+Right; First=Str.ReverseFind('(')+1; } intResult=SubCompute(Str); returnResult;}voidCDingluDlg::OnYanSuan(){KillTimer(1);/點擊驗算按鈕后停止計時 UpdateData();/數(shù)據(jù)刷新 intflag=1;/設置變量flag,作為后續(xù)程序的判斷標準CStringStr=m_Edit1;intFirst=Str.ReverseFind('(')+1;while(First) {CStringSubStr=Str.Mid(First,(Str.GetLength()-First)); intLast=SubStr.Find(')')+1; Last+=First; CStringLeft=Str.Mid(0,First-1); CStringMiddle=Str.Mid(First,Last-First-1); CStringRight=Str.Mid(Last,Str.GetLength()-Last); Str=Left+Mid

溫馨提示

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

評論

0/150

提交評論