基于Qt的連連看游戲的設(shè)計(jì)_第1頁
基于Qt的連連看游戲的設(shè)計(jì)_第2頁
基于Qt的連連看游戲的設(shè)計(jì)_第3頁
基于Qt的連連看游戲的設(shè)計(jì)_第4頁
基于Qt的連連看游戲的設(shè)計(jì)_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

摘要在現(xiàn)今電子信息高速開展的時(shí)代,電子游戲已然成為群眾最受歡送的娛樂消遣方式,經(jīng)典的連連看是個(gè)老少皆宜的小游戲,它實(shí)現(xiàn)由各式各樣的成對圖片組成,然后存儲(chǔ)在一個(gè)二維的數(shù)組中,計(jì)算機(jī)隨機(jī)產(chǎn)生各種不同類型的圖片,根據(jù)計(jì)算機(jī)時(shí)鐘控制它在一定的時(shí)間內(nèi)隨機(jī)產(chǎn)生,用戶可根據(jù)鼠標(biāo)和回車鍵點(diǎn)擊圖片、假設(shè)兩次點(diǎn)擊的圖片一樣,那么消掉圖片。本文用QT來設(shè)計(jì)與實(shí)現(xiàn)簡單的連連看游戲的根本功能,玩家可以在游戲區(qū)域中通過鍵盤控制來選取相同的兩個(gè)物件,采用特定的消除規(guī)那么對它們進(jìn)行消除的操作,當(dāng)游戲區(qū)域中的所有方塊對都被消除后玩家即可勝利。文章對該游戲的算法以及游戲圖案的繪制進(jìn)行詳細(xì)的介紹。實(shí)現(xiàn)起來較簡單,同時(shí)也比擬實(shí)用。關(guān)鍵詞:Qt;游戲設(shè)計(jì);算法;數(shù)組;信號(hào)與槽ABSTRACTInthecurrenteraofrapiddevelopmentofelectronicinformation,electronicgamehasbecomethemostpopularentertainmentpopularpastime,classicRussiansquareisaenjoyedbyyoungandoldlittlegame,itachievedbyfoursquareofcolorpiece,andthenstoredinatwodimensionalarray,computerrandomgenerationsevendifferenttypesofsquare,accordingtothecomputerclockcontrolitincertaintimekeepproduced,theusercanaccordingtothekeyboardfourthedirectionkeycontrolblockturns,movesleft,movetotheright,movedownoperationandtheprogramaccordingtothesevensquarearestackedintoadifferentmodel.AndLaurasquareisbasedonsquareinRussia,givetheRussiansquarenewchallengepattern,itsinspirationfromthenetworkanotherkindofpopularvideogames-tombraider.Playerstotheidentityoftheadventurersintothegame,playersneedonlytoacertainscore,canchallengehigherdifficultylevelsofthegame,ofcourse,ifyouaregood,youwillhavethechancetoopenthemysterioushideorgans,themorefullofimaginationandstimulationofplaywillwaitforyoutakeyourchallenge.Keywords:Qt;Gamedesign;Algorithm;Array;Signalsandslots.目錄TOC\o"1-2"\h\z\u摘要IABSTRACTII第一章緒論21.1游戲背景21.2游戲概述2第二章方案論證42.1選擇開發(fā)語言4第三章需求分析113.1軟硬件需求113.2游戲功能需求11第四章游戲總體設(shè)計(jì)134.1總體設(shè)計(jì)134.2游戲開始模塊設(shè)計(jì)144.3游戲設(shè)置模塊設(shè)計(jì)144.4游戲核心模塊的設(shè)計(jì)15第五章具體實(shí)現(xiàn)165.1模型層設(shè)計(jì)165.2視圖層設(shè)計(jì)175.3其它相關(guān)技術(shù)的實(shí)現(xiàn)18第六章游戲測試196.1按鍵事件的功能測試206.2圖片消失測試206.3聲音和顯示測試206.4測試結(jié)果分析20總結(jié)21致謝22參考文獻(xiàn)23附錄源代碼24第一章緒論1.1游戲背景說到連連看,就不得不從經(jīng)典小游戲說起,連連看是一款古老的風(fēng)行全球的經(jīng)典游戲,它最早出現(xiàn)在PC機(jī)上,我國的用戶都是通過紅白機(jī)了解、喜歡上它的,相信有很多人到現(xiàn)在還是對它念念不忘的。無可爭議,《連連看》是有史以來最偉大的游戲之一。在曾經(jīng)發(fā)布過的所有游戲中,《連連看》還被認(rèn)為是僅有的一個(gè)能夠真正吸引廣泛人群的作品,曾今造成的轟動(dòng)與經(jīng)濟(jì)價(jià)值可以說是游戲史上的一件大事,它看似簡單卻變化無窮,令人著迷,相信大多數(shù)玩家都還記得為它癡迷得茶飯不思的那個(gè)連連看時(shí)代。但是隨著網(wǎng)絡(luò)信息的高速開展,連連看也要跟隨時(shí)代的開展,以滿足群眾的需要。到如今,網(wǎng)絡(luò)上已經(jīng)出現(xiàn)了各種不同版本的連連看,它賦予玩家冒險(xiǎn)家的角色,不斷挑戰(zhàn)你的想象,其全新的設(shè)計(jì),創(chuàng)新的玩法,為經(jīng)典的連連看蒙上了一層更加神秘的色彩。1.2游戲概述游戲簡介游戲“連連看〞顧名思義就是找出相關(guān)聯(lián)的東西,這個(gè)連連看在網(wǎng)上根本是用在小游戲中,就是找出相同的兩樣?xùn)|西,在一定的規(guī)那么之內(nèi)可以做為相關(guān)聯(lián)處理?!斑B連看〞的開展經(jīng)歷了從桌面游戲、在線游戲、社交游戲三個(gè)過程。游戲“連連看〞是源自臺(tái)灣的桌面小游戲,自從流入大陸以來風(fēng)行一時(shí),也吸引眾多程序員開發(fā)出多種版本的“連連看〞。這其中,顧方編寫的“阿達(dá)連連看〞以其精良的制作廣受好評(píng),這也成為顧方“阿達(dá)系列軟件〞的核心產(chǎn)品。并于2004年,取得了國家版權(quán)局的計(jì)算機(jī)軟件著作權(quán)登記證書。隨著Flash應(yīng)用的流行,網(wǎng)上出現(xiàn)了多種在線Flash版本“連連看〞。如“水晶連連看〞,“果蔬連連看〞等,流行的“水晶連連看〞以華美界面吸引了一大批的女性玩家。2023年,隨著社交網(wǎng)絡(luò)的普及和開放平臺(tái)的興起,“連連看〞被引入了社交網(wǎng)絡(luò)。“連連看〞與個(gè)人空間相結(jié)合,被快速的傳播,成為一款熱門的社交游戲,其中以開發(fā)者Jonevey在Manyou開放平臺(tái)上推出的“寵物連連看〞最為流行。游戲功能本次設(shè)計(jì)連連看主要是在原連連看對戰(zhàn)的根底上設(shè)計(jì)挑戰(zhàn)模式,具體的功能如下所述:游戲運(yùn)行界面簡單美觀,操作簡單,運(yùn)行穩(wěn)定;能夠根據(jù)不同的等級(jí)模式播放不同的游戲背景音樂,包括操作方向鍵、消行時(shí)的聲音,音量由玩家操作控制;設(shè)計(jì)不同的游戲難度,當(dāng)玩家到達(dá)一定的積分,可以進(jìn)入相關(guān)難度的等級(jí);玩家可直接操作界面上的相關(guān)按鈕來控制游戲的開始、暫停、設(shè)置、退出等功能。第二章方案論證2.1選擇開發(fā)語言根據(jù)自己以前所學(xué)的關(guān)于C語言、C++、Java、以及Qt的相關(guān)知識(shí),并通過網(wǎng)上查找相關(guān)資料,了解到C、C++、VB、Delphi、C#、Java等均可以現(xiàn)勞拉方塊游戲的設(shè)計(jì)。下面簡單介紹下VB、C++、Java、Qt各自的特點(diǎn):VB的特點(diǎn)全稱VisualBasic,它是以Basic語言作為其根本語言的一種可視化編程工具。在中國乃至全世界都能看到它的身影,它曾是在中國最為流行的編程工具,到現(xiàn)在還占據(jù)著非常重要的地位,對于它的好壞大家都有一定的了解,VB作為一種較早出現(xiàn)的開發(fā)程序以其容易學(xué)習(xí),開發(fā)效率較高,具有完善的幫助系統(tǒng)等優(yōu)點(diǎn)曾影響了好幾代編程人員,但是由于VB不具備跨平臺(tái)這個(gè)特性,從而也決定了VB在未來的軟件開發(fā)中將會(huì)逐漸地退出其歷史舞臺(tái);它對組件技術(shù)的支持是基于COM和ActiveX,對于組件技術(shù)不斷完善開展的今天,它也顯出了它的落后性;同時(shí)VB在進(jìn)行系統(tǒng)底層開發(fā)的時(shí)候也是相對復(fù)雜的,調(diào)用API函數(shù)需聲明,調(diào)用不方便,不能進(jìn)行DDK編程,不可能深入Ring0編程,不能嵌套匯編;而且面向?qū)ο蟮奶匦圆睿痪W(wǎng)絡(luò)功能和數(shù)據(jù)庫功能也沒有非常突出的表現(xiàn),綜上所述,VB作為一種可視化的開發(fā)工具由于其本身的局限性,導(dǎo)致了它在未來軟件開發(fā)中逐步被其他工具所代替。C++的特點(diǎn)C/C++的哲學(xué)就不一樣了,同一份程序代碼,只要在該平臺(tái)重新Compile成該平臺(tái)的執(zhí)行檔,就能在該平臺(tái)執(zhí)行,假設(shè)文字模式下的程序,確實(shí)可以跨平臺(tái),程序完全不需修改,但GUI盛行以后,由于各GUI的Library都不一樣且沒有標(biāo)準(zhǔn),所以GUI程序并沒方法跨平臺(tái)Compile,因?yàn)楦髌脚_(tái)都有專屬的Library。但是C/C++優(yōu)勢就是執(zhí)行速度快,假設(shè)能解決GUILibrary的問題,那么跨平臺(tái)即可解決。除了GUILibrary需要統(tǒng)一外,還得看該Library設(shè)計(jì)的好不好才行,LinuxGUI我沒寫過就不說了,假設(shè)在Windows平臺(tái),Borland的C++Builder使用Delphi的VCLLibrary,Microsoft的VisualC++可以用MFC和.NETFramework,首先來看Borland的C++Builder,它使用標(biāo)準(zhǔn)的ANSIC++語言開發(fā),利用VCL寫出來的程序也算蠻漂亮的,執(zhí)行速度很快,比擬麻煩的是C++Builder當(dāng)初為了縮短上市時(shí)間,并沒有設(shè)計(jì)自己的Library,而是藉用Delphi的Library,導(dǎo)致C++Builder在Compile時(shí),是先用Delphi的Compiler將VCLcompile成objectfile后,再用C++Builder將你寫的C++程序compile成objectfile,最后再用Linker將所有的objectfilelink起來,由于這都是IDE在做,對程序設(shè)計(jì)師似乎影響不大,但VCL由于是Delphi的Library,所以假設(shè)想深入研究VCL的sourcecode時(shí),那么必須學(xué)Delphi的Pascal才行,否那么看不懂VCLsourcecode,這也是很多人對C++Builder卻步的原因。再來看Microsoft的VisualC++,MFC用的是完整的ANSIC++語言,所以語言局部不是問題,但假設(shè)你看過用MFC寫的程序,你一定會(huì)驚訝為什么這么復(fù)雜,程序代碼非常冗長不好看,且MFC是有名的難學(xué),假設(shè)VisualC++搭配.NETFramrwork,那么無法使用ANSIC++,得用其.NET平臺(tái)版本的C++/CLI,相信這點(diǎn)很多人就有意見了,不過.NETFramework由于設(shè)計(jì)的不錯(cuò),所以寫出來的程序相當(dāng)精簡漂亮,感覺和C++Builder差不多,不過無論是C++Builder或VisualC++開發(fā)的GUI,所開發(fā)出來的程序都無法跨平臺(tái),當(dāng)然也無法跨平臺(tái)Compile。2.1.3JavaJava具有平安性、可移植性、多線程機(jī)制以及跨平臺(tái)的良好特性,但是由于本人對Java語言不是很熟悉,所以此方案也予以否決。2.1.4Qt的Qt擁有一個(gè)單一的Library,讓你開發(fā)各種不同平臺(tái)的程序,目前支持Windows、Linux、Mac、UNIX、EmbeddedLinux,講白話點(diǎn),就是它提供了一個(gè)Library讓你開發(fā)GUI程序,寫好之后,只要在各平臺(tái)重新Compile后,就可以在各平臺(tái)執(zhí)行,而且使用完整的ANSIC++語言,且不限Compiler,只要是C++的Compiler都可以,重要的是,該Library相當(dāng)漂亮,寫出來的程序很像C++Builder或.NETFramework的那樣精簡,不會(huì)向MFC那樣復(fù)雜。目前Qt已經(jīng)到第四個(gè)版本,GUI局部算支持的相當(dāng)完整,且支持?jǐn)?shù)據(jù)庫、XML、Multi-Thread、Socket等方面的programming。假設(shè)以后臺(tái)角度來說,無論后端是什么數(shù)據(jù)庫,只要透過相同的Interface,不同數(shù)據(jù)庫的Class來實(shí)做這個(gè)Interface,前端GUI的程序?qū)懛ㄍ耆挥酶淖?,同理,面對不同的OS,理論上只要透過相同的Interface,不同OS的Class各自實(shí)做這個(gè)Interface,前端GUI的程序也完全不用改變,最后只要靠Compiler將程序compile成各平臺(tái)的原生程序即可,這樣即可保證其執(zhí)行速度,不用再靠VirtualMachine。但很可惜這個(gè)理想,這么多年來都沒人可以做出來,或許是我孤陋寡聞吧。Qt無疑是GUI終極解決方案,有強(qiáng)力的ANSIC/C++語言背書,又有單一的GUILibrary,且精簡漂亮,又能Compile成各平臺(tái)的原生執(zhí)行檔,幾乎是最完美的解決方案了。2.1.5經(jīng)過以上比擬好,考慮到Qt的眾多良好特性,尤其是其跨平臺(tái)性,加上自己最近正在學(xué)習(xí)Qt,為了能夠更進(jìn)一步掌握Qt編程,因此決定使用Qt開發(fā)連連看游戲。2.2Qt關(guān)鍵技術(shù)的介紹Qt特點(diǎn)的具體介紹1.可移植性Qt是一個(gè)跨平臺(tái)GUI工具箱,不僅適用于Unix,它同樣適用于MSWindows。如果開發(fā)平臺(tái)是MSWindows,可能選擇的GUI工具箱為MicrosoftFoundationClasses〔MFC〕,這樣就會(huì)失去眾多的Unix用戶。相反,如果開發(fā)平臺(tái)是Unix,可能選擇其它工具箱,如Motif等,同樣會(huì)失去眾多的Windows用戶。如果選擇的GUI工具箱為Qt,那么只要在不同的平臺(tái)上簡單的編譯源代碼,就可以使原程序在不同的平臺(tái)上運(yùn)行,從而解決喪失用戶的問題。Qt把在處理不同窗口系統(tǒng)時(shí)的潛在問題隱藏了起來。為使Qt使用方便,Qt包含了一系列類,這些類使開發(fā)人員防止了在文件處理、時(shí)間處理等方面存在的依賴操作系統(tǒng)方面的細(xì)節(jié)。2.國際化所謂國際化,通俗的講,就是指在某國開發(fā)的軟件可以方便的被其它國家的人使用。Qt為本地化應(yīng)用提供完全的支持,所有用戶界面文本都可以基于消息翻譯表被翻譯成各國語言。另外,Qt完全支持雙字節(jié)16bit國際字符標(biāo)準(zhǔn)。利用Qt開發(fā)跨平臺(tái)的國際化軟件是一個(gè)方便、增量的過程。在開發(fā)過程中,利用Qt的linguist界面工具就能方便的將開發(fā)的軟件翻譯成各國語言,從而實(shí)現(xiàn)軟件的國際化。3.面向?qū)ο驫t是一個(gè)C++工具箱,它由幾百個(gè)C++類構(gòu)成。在程序設(shè)計(jì)中可以使用這些類,如果Qt沒有提供真正適合需求的組件,那么可以方便的修改現(xiàn)有的組件或者重新編寫組件。Qt具有模塊設(shè)計(jì)和注重軟件構(gòu)件或元素的可重用性的特點(diǎn)。一個(gè)組件不需要知道它的內(nèi)容,而通過Qt特有的signal和slot機(jī)制與外界通信、交流。使用Qt進(jìn)行應(yīng)用程序的開發(fā),可以充分利用其面向?qū)ο蠛湍K化的特征,從繁瑣的編程中解脫出來,專注于應(yīng)用程序本身的實(shí)現(xiàn)。4.可用戶化的外觀Qt支持主題,所以基于Qt的應(yīng)用軟件能在Motif外觀、Windows外觀,以及另一些用戶化的外觀之間互換,甚至改變運(yùn)行時(shí)間。這些應(yīng)用程序不管是在XWindows下還是在MicrosoftWindows下都可以獨(dú)立操作、運(yùn)行。5.獨(dú)有的SignalSlot機(jī)制SignalSlot機(jī)制是Qt最重要的特征。在MSWindows中,程序通過消息機(jī)制和事件循環(huán)來實(shí)現(xiàn)圖形對象行為的觸發(fā)和處理;在Qt中,程序在一個(gè)類中定義多個(gè)Signal和Slot,Signal就相當(dāng)于“事件〞,而Slot就相當(dāng)于響應(yīng)事件的“方法〞。為了實(shí)現(xiàn)“事件驅(qū)動(dòng)〞,需要將一個(gè)類的Signal和另一個(gè)類的Slot連接起來(使用connect)。采用這種機(jī)制是一種平安可靠的方法,它允許回調(diào)。并支持對象之間在彼此不知道對方信息的情況下進(jìn)行合作,這使Qt非常適合于真正的構(gòu)件編程。6.開發(fā)程序的方便性Qt提供了一個(gè)可視化的開發(fā)工具QtDesigner,使用該工具就像在Windows中使用VisualC++那樣可以直接向工程中添加各種組件,而不需要一步一步地編寫代碼,這個(gè)特點(diǎn)是其它非可視化編程工具望塵莫及的。QtDesigner中包含全面的聯(lián)機(jī)幫助文檔,包括超文本方式的QtManual,man幫助手冊頁和補(bǔ)充指南。這些幫助不管是對于初學(xué)者還是專業(yè)人士,都是非常方便的。7.強(qiáng)大的功能Qt的強(qiáng)大功能主要表達(dá)在以下幾方面:擁有一套完整的組件,用戶可以直接基于這些現(xiàn)成的組件開發(fā)出優(yōu)秀的界面;擁有豐富的API函數(shù),大概有250多個(gè)C++類;具有優(yōu)越的繪畫功能和2D/3D圖形潤色功能,Qt的繪畫工具類Qpainter,可以在任意一個(gè)繪畫設(shè)備上潤色圖形,對于更高級(jí)的2D/3D圖形可以結(jié)合使用OpenGL和Qt的組件,使用OpenGL就像用任意一個(gè)Qt組件一樣方便,而且效果比純粹使用OpenGL作2D/3D圖形更好;支持XML。Qt的類庫Qt類庫大致可以分為三個(gè)局部:控件,框架和工具。1.控件控件局部包括環(huán)境控件,主窗口控件,標(biāo)準(zhǔn)對話框,根本的GUI控件,擴(kuò)展GUI控件,GUI組織控件,以及幫助系統(tǒng)控件。環(huán)境控件為應(yīng)用程序提供全局效勞的類,包括系統(tǒng)設(shè)定、國際化等。例如QTranslator,Qapplication。主窗口類為應(yīng)用程序提供界面框架,可以在上面添加菜單、工具條等,為應(yīng)用程序提供集裝箱的功能,如QMainWindow。標(biāo)準(zhǔn)對話框類是為翻開/關(guān)閉文件,選擇顏色等預(yù)先設(shè)計(jì)的標(biāo)準(zhǔn)對話框,如QColorDialog,QFileDialog。根本控件包括所有的GUI控件,如按鈕、組合框等,如QPushButton。擴(kuò)展的控件包括樹狀視圖、進(jìn)度條等,如QListView。GUI組織類負(fù)責(zé)對各種控件進(jìn)行組織以構(gòu)成復(fù)雜的對話框,如QGroupBox。幫助系統(tǒng)控件是為應(yīng)用程序提供在線幫助的類,QStatusBar,QToolTip。2.框架框架局部包括的是一些抽象的類,通常不可見,如對象模型、抽象控件、繪圖、拖放、控件外觀。對象模型是框架的根底,如QObject??梢姷目丶话銖某橄罂丶缮鏠Button。繪圖類控制繪圖,如QBrush。拖放類控制拖放操作,如QDragObject。控件外觀類控制控件的外觀如顏色、字體等。例如QColor。3.工具工具局部包括時(shí)間日期和鏈表樹等數(shù)據(jù)結(jié)構(gòu),它們和GUI無關(guān)。普通工具包括鏈表、堆棧、隊(duì)列、樹等常見數(shù)據(jù)結(jié)構(gòu),如QArray。圖形處理工具控制圖像的編碼/解碼算法。如QImageIO。I/O控制工具處理I/O的一些類,如QFile。時(shí)間和日期工具類處理時(shí)間和日期,如Qdate,QTime。另外還有其他雜類如Qsignal,QIconSet等。Qt對象通訊機(jī)制對象間通訊是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)極其重要的內(nèi)容,類似于MicrosoftMFC的消息映射和事件循環(huán),Qt的對象間通訊采用的是信號(hào)—槽(signal—slot)機(jī)制,信號(hào)就好似是事件,而槽那么是響應(yīng)事件的方法。如果需要實(shí)現(xiàn)對象間的通訊,只需要把一個(gè)對象的信號(hào)和另外一個(gè)對象的槽使用連接(connect)起來。信號(hào)—槽機(jī)制說明:Qt下對象間的通訊用信號(hào)—槽機(jī)制來實(shí)現(xiàn)。信號(hào)—槽機(jī)制是Qt的一個(gè)中心特征并且也是它與其它圖形工具包的最不相同的局部。圖2-1直觀地表示了這種機(jī)制是如何工作的。圖2-1信號(hào)與槽的連接原理圖在圖形用戶界面編程中,經(jīng)常希望一個(gè)窗口部件的一個(gè)變化被通知給另一個(gè)窗口部件。更一般地,希望任何一類對象可以和其它對象進(jìn)行通訊。例如,如果正在解析一個(gè)XML文件,當(dāng)遇到一個(gè)新的標(biāo)簽時(shí),也許要通知列表視圖正在用來表達(dá)XML文件的結(jié)構(gòu)。較老的工具包是使用一種被稱作回調(diào)的通訊方式來實(shí)現(xiàn)同一目的?;卣{(diào)是指一個(gè)函數(shù)的指針,所以如果希望一個(gè)處理函數(shù)通知一些事件,可以把另一個(gè)函數(shù)(回調(diào))的指針傳遞給處理函數(shù),處理函數(shù)在適當(dāng)?shù)臅r(shí)候調(diào)用回調(diào)函數(shù)?;卣{(diào)有兩個(gè)主要缺點(diǎn):首先他們不是類型平安的,從來都不能確定處理函數(shù)使用了正確的參數(shù)來調(diào)用回調(diào);其次回調(diào)和處理函數(shù)是非常強(qiáng)有力地聯(lián)系在一起的,因?yàn)樘幚砗瘮?shù)必須知道要調(diào)用哪個(gè)回調(diào)。在Qt中有一種可以替代回調(diào)的技術(shù):使用信號(hào)和槽。當(dāng)一個(gè)特定事件發(fā)生的時(shí)候,一個(gè)信號(hào)被發(fā)射。Qt的窗口部件有很多預(yù)定義的信號(hào),但是總是可以通過繼承來參加自己定義的信號(hào)。槽就是一個(gè)可以被調(diào)用處理特定信號(hào)的函數(shù)。Qt的窗口部件有很多預(yù)定義的槽,通常也可以參加自己的槽,這樣就可以處理感興趣的信號(hào)了。信號(hào)—槽機(jī)制是類型平安的:一個(gè)信號(hào)的簽名必須與它的接收槽的簽名相匹配。實(shí)際上一個(gè)槽的簽名可以比它接收的信號(hào)的簽名少,因?yàn)樗梢院雎灶~外的簽名。因?yàn)楹灻且恢碌?,編譯器就可以幫助檢測類型是否匹配。信號(hào)和槽是寬松地聯(lián)系在一起的:一個(gè)發(fā)射信號(hào)的類不用知道哪個(gè)槽要接收這個(gè)信號(hào)。Qt的信號(hào)和槽的機(jī)制可以保證如果把一個(gè)信號(hào)和一個(gè)槽連接起來,槽會(huì)在正確的時(shí)間使用信號(hào)的參數(shù)而被調(diào)用。信號(hào)和槽可以使用任何數(shù)量、任何類型的參數(shù)。它們是完全類型平安的,不會(huì)再有回調(diào)核心轉(zhuǎn)儲(chǔ)。從QObject類或者它的一個(gè)子類(比方QWidget類)繼承的所有類都可以包含信號(hào)槽。當(dāng)對象的狀態(tài)發(fā)生改變的時(shí)候,信號(hào)被發(fā)送給其它對象,從而實(shí)現(xiàn)了該對象與其它對象的通信。對象在發(fā)射信號(hào)時(shí),無須知道有沒有槽接收它所發(fā)射的信號(hào),而槽是正常的成員函數(shù),一個(gè)槽不知道它是否被任何信號(hào)連接,這就是信息封裝,這種封裝確保了對象可以用作一個(gè)軟件組件。此外,使用對象時(shí)也無須知道這種通訊機(jī)制的實(shí)現(xiàn)細(xì)節(jié)。在信號(hào)—槽機(jī)制實(shí)現(xiàn)的過程中,可以把許多信號(hào)和單一槽相連,也可以把一個(gè)信號(hào)和許多槽相連。把一個(gè)信號(hào)和另一個(gè)信號(hào)直接相連也是可以的。(這時(shí),只要第一個(gè)信號(hào)被發(fā)射時(shí),第二個(gè)信號(hào)立刻就被發(fā)射)??傮w來看,信號(hào)和槽構(gòu)成了一個(gè)強(qiáng)有力的組件編程機(jī)制。第三章需求分析3.1軟硬件需求本次的開發(fā)環(huán)境所采用的操作系統(tǒng)為Linux操作系統(tǒng)的Ubuntu10.10版本,編程環(huán)境是基于QT4.7的Qtcreator版本,由于本游戲?qū)τ布囊蟛皇呛車?yán)格,所以硬件需求不做討論。3.2游戲功能需求本次設(shè)計(jì)是在傳統(tǒng)的連連看上設(shè)計(jì)實(shí)現(xiàn)對戰(zhàn)的連連看,玩家通過到達(dá)一定的積分來獲得繼續(xù)闖關(guān)的時(shí)機(jī),還有時(shí)機(jī)開啟神秘的應(yīng)藏關(guān),以此來增加游戲的可玩性。游戲的根本規(guī)那么:程序隨機(jī)產(chǎn)生任意成對的圖片,當(dāng)定點(diǎn)擊開始游戲時(shí),電腦根據(jù)時(shí)間參數(shù)隨機(jī)生成固定的成對圖片,游戲再次開始,玩家可通過鼠標(biāo)上的左鍵,自由的點(diǎn)兩張圖片。如果點(diǎn)擊兩次時(shí),兩張圖片相同,且滿足程序的算法那么這兩張圖片可消去。消去圖片后,游戲可給玩家加分,假設(shè)在規(guī)定的時(shí)間內(nèi),玩家沒有消掉所有的圖片那么游戲失敗。由于是闖關(guān)模式,到達(dá)一定分?jǐn)?shù)的玩家可以繼續(xù)挑戰(zhàn)新的游戲,游戲的難度會(huì)相應(yīng)增加,并且還增加了新玩法。具體的游戲功能如下:游戲界面需求:設(shè)計(jì)良好的游戲界面可以讓玩家充分感受到游戲帶來的娛樂性,游戲的背景取自網(wǎng)上中的圖片,表達(dá)了游戲的挑戰(zhàn)性。鼠標(biāo)處理事件需求:通過點(diǎn)擊主窗體中相應(yīng)的按鈕,可以實(shí)現(xiàn)游戲的開始、暫停、結(jié)束,通過點(diǎn)擊選項(xiàng)設(shè)置中相應(yīng)的按鈕,可設(shè)置聲音的大小及方向鍵↓的功能。顯示需求:當(dāng)兩次點(diǎn)擊的圖片相同且滿足算法可以消去,當(dāng)?shù)竭_(dá)一定分?jǐn)?shù)的時(shí)候,游戲會(huì)進(jìn)入下一關(guān),并有障礙了。游戲闖關(guān)設(shè)計(jì)需求:隨著游戲的難度不同,玩法會(huì)發(fā)生改變,需要在游戲中設(shè)置障礙,蒙手游戲。如果玩家能到達(dá)并完成最后一關(guān),那么玩家挑戰(zhàn)成功,游戲結(jié)束。圖3.1游戲開始界面第四章游戲總體設(shè)計(jì)4.1總體設(shè)計(jì)整體設(shè)計(jì)思想:進(jìn)入游戲后,有三個(gè)按鈕可供玩家選擇:開始游戲,游戲設(shè)置,退出游戲,在進(jìn)入相應(yīng)子菜單后也可返回到主菜單,每個(gè)菜單的具體設(shè)計(jì)將在后面介紹,以下是總體的游戲流程圖。主菜單主菜單開始游戲暫停繼續(xù)鍵盤方向鍵控制游戲返回主菜單退出游戲設(shè)置選項(xiàng)第一關(guān)過關(guān)第二關(guān)過關(guān)第…關(guān)過關(guān)第六關(guān)失敗設(shè)置聲音設(shè)置網(wǎng)格挑戰(zhàn)成功設(shè)置加速圖4-1游戲總體流程圖設(shè)計(jì)4.2游戲開始模塊設(shè)計(jì)此模塊為本次設(shè)計(jì)的核心模塊,玩家在主菜單設(shè)置好游戲選項(xiàng)后點(diǎn)擊開始按鈕后開始游戲,并進(jìn)入游戲窗口,游戲窗口大體是這樣設(shè)計(jì)的:首先最上面一欄顯示當(dāng)前處于第幾關(guān),游戲區(qū)域分為兩局部,主游戲區(qū)顯示當(dāng)前游戲畫面,其寬設(shè)置為10個(gè)單位的小方塊圖片的邊長,高為20,游戲區(qū)域右邊的上面局部設(shè)置了3個(gè)功能按鈕:重新開始游戲、暫停、返回主菜單按鈕;游戲區(qū)域右邊的下面局部那么顯示主菜單界面,該界面在游戲開始后處于隱藏狀態(tài),當(dāng)玩家點(diǎn)擊“返回主菜單〞按鈕后,主菜單會(huì)重新顯示出來,同時(shí)游戲界面處于隱藏狀態(tài)。在開始游戲后,當(dāng)玩家獲得一定積分后,會(huì)進(jìn)入下一關(guān),如果失敗,那么必須重新開始。玩家在順利完成第五關(guān)后,這時(shí),玩家就能進(jìn)入神秘的隱藏關(guān),一次來增加游戲難度〔相信那將會(huì)很有趣〕。4.3游戲設(shè)置模塊設(shè)計(jì)游戲設(shè)置模塊提供了3個(gè)設(shè)置選項(xiàng):是否顯示游戲網(wǎng)格、音量設(shè)置以及音效設(shè)置,這些設(shè)置的靈活性可以方便不同水平用戶的自由選擇,以便一步步晉級(jí)。而音效效果那么可以增加用戶玩游戲的樂趣。設(shè)置好游戲選項(xiàng)后,即可返回主菜單開始游戲,在游戲的過程中也可以隨時(shí)暫停返回主菜單,再進(jìn)行重新設(shè)置游戲選項(xiàng),這樣更加方便用戶的使用。4.4游戲核心模塊的設(shè)計(jì)連連看所要求的是:1:兩個(gè)目標(biāo)是相同的2:兩個(gè)目標(biāo)之間連接線的折點(diǎn)不超過兩個(gè)?!策B接線由x軸和y軸的平行線組成〕那么分析一下連接的情況可以看到,一般分三種情況1:直線相連2:一個(gè)折點(diǎn)3:兩個(gè)折點(diǎn):可以發(fā)現(xiàn),如果有折點(diǎn),每個(gè)折點(diǎn)必定有且至少有一個(gè)坐標(biāo)〔x或者y〕是和其中一個(gè)目標(biāo)點(diǎn)是相同的,也就是說,折點(diǎn)必定在兩個(gè)目標(biāo)點(diǎn)所在的x方向或y方向的直線上。所以設(shè)計(jì)思路就是:假設(shè)目標(biāo)點(diǎn)p1,p2,如果有兩個(gè)折點(diǎn)分別為z1,z2那么,所要進(jìn)行的是1:如果驗(yàn)證p1,p2直線連線,那么連接成立2:搜索以p1,p2的x,y方向四條直線〔可能某兩條直線會(huì)重合〕上的有限點(diǎn),每次取兩點(diǎn)作為z1,z2,驗(yàn)證p1到z1/z1到z2/z2到p2是否都能直線相連,是那么連接成立。連連看消去算法實(shí)現(xiàn)在檢驗(yàn)兩張圖片能否消掉的時(shí)候,我們要讓兩張圖片同時(shí)滿足兩個(gè)條件才行,就是兩者配對并且連線成功。分3種情況:(從下面的這三種情況,我們可以知道,需要三個(gè)檢測,這三個(gè)檢測分別檢測一條直路經(jīng)。這樣就會(huì)有三條路經(jīng)。假設(shè)這三條路經(jīng)上都是空按鈕,那么就剛好是三種直線〔兩個(gè)轉(zhuǎn)彎點(diǎn)〕把兩個(gè)按鈕連接起來了)1.相鄰2.假設(shè)不相鄰的先在第一個(gè)按鈕的同行找一個(gè)空按鈕。1).找到后看第二個(gè)按鈕橫向到這個(gè)空按鈕所在的列是否有按鈕。2).沒有的話再看第一個(gè)按鈕到與它同行的那個(gè)空按鈕之間是否有按鈕。3).沒有的話,再從與第一個(gè)按鈕同行的那個(gè)空按鈕豎向到與第二個(gè)按鈕的同行看是否有按鈕。沒有的話路經(jīng)就通了,可以消了.3.假設(shè)2失敗后,再在第一個(gè)按鈕的同列找一個(gè)空按鈕。1).找到后看第二個(gè)按鈕豎向到這個(gè)空按鈕所在的行是否有按鈕2).沒有的話,再看第一個(gè)按鈕到與它同列的那個(gè)空按鈕之間是否有按鈕。3).沒有的話,再從與第一個(gè)按鈕同列的那個(gè)空按鈕橫向到與第二個(gè)按鈕同列看是否有按鈕。沒有的話路經(jīng)就通了,可以消了。假設(shè)以上三步都失敗,說明這兩個(gè)按鈕不可以消去。第五章具體實(shí)現(xiàn)5.1模型層設(shè)計(jì)圖形的產(chǎn)生通過圖形工廠類ShapeFactory的getShape(ShapeListenerlistener)方法隨機(jī)產(chǎn)生方塊的某種狀態(tài),這里運(yùn)用了工廠設(shè)計(jì)模式。圖形的變形圖形的變形是通過函數(shù)char*MyItem::itemChange(unsignedchar*currentItem)來實(shí)現(xiàn)的,該函數(shù)首先是在內(nèi)存中開辟一個(gè)新的4*4數(shù)組,用來保存變化后的方塊,通過兩個(gè)for循環(huán),依次將數(shù)組中個(gè)元素的橫坐標(biāo)與列坐標(biāo)交換位置,即可使原來的方塊逆時(shí)針旋轉(zhuǎn)90度,到達(dá)旋轉(zhuǎn)方塊的目的。判段消掉圖片如果兩在張圖片滿足一個(gè)拐點(diǎn),沒有拐點(diǎn)。兩個(gè)拐點(diǎn)那么該兩張圖片就可以消掉,同時(shí)需要用一個(gè)全局變量fullRowNum來保存此次一共消除了多少張,以便算分,沒有拐點(diǎn)10分,一個(gè)拐點(diǎn)20分,二個(gè)拐點(diǎn)的是30分。具體是通過函數(shù)voidGameArea::clearRow()來實(shí)現(xiàn)的。5.2視圖層設(shè)計(jì)圖片的顯示方塊的顯示是通過調(diào)用GameArea類中的draw_currentMap()方法實(shí)現(xiàn)的,首先判斷存儲(chǔ)方塊的數(shù)組的值,但凡值為1的成員那么給該數(shù)組控制的對應(yīng)游戲區(qū)域的坐標(biāo)通過調(diào)用painter.drawPixmap()繪制圖片,具體的坐標(biāo)和范圍以及圖片來源都是有painter.drawPixmap()中的參數(shù)給定的。在調(diào)用painter.drawPixmap()函數(shù)之前,還可以設(shè)置圖片顏色,具體是通過painter.setPen()h和painter.setBrush()來實(shí)現(xiàn)的這樣就能顯示方塊,而且可以不斷的改變顏色,使游戲界面富有動(dòng)感。游戲區(qū)域的顯示游戲區(qū)域的繪制包括網(wǎng)格和游戲區(qū)的方塊的繪制,具體通過調(diào)用GameArea類中的draw_gameArea()函數(shù)來實(shí)現(xiàn),在該函數(shù)中調(diào)用到了繪制網(wǎng)格的draw_Grid()函數(shù)和顯示圖片的draw_currrentMap()函數(shù),在draw_Grid()函數(shù)中調(diào)用Painter類的painter.drawLine()函數(shù)繪制網(wǎng)格,具體的起始點(diǎn)和結(jié)束點(diǎn)同樣由傳遞參數(shù)獲得。首先需要設(shè)置游戲區(qū)域大小,可以通過this->gameArea->setGameAreaPi〔〕實(shí)現(xiàn),還需要安置新的坐標(biāo)原點(diǎn)可以通過調(diào)用該函數(shù)。5.3其它相關(guān)技術(shù)的實(shí)現(xiàn)鍵盤事件響應(yīng)連連看是通過鼠標(biāo)左鍵來控制游戲的運(yùn)行,那么是具體如何實(shí)現(xiàn)的呢?這就需要用到鍵盤的左擊事件,通過響應(yīng)鼠標(biāo)的按下事件來實(shí)現(xiàn)。玩家通過鼠標(biāo)左鍵來控制圖片的點(diǎn)擊。具體代碼實(shí)現(xiàn):通過重新實(shí)現(xiàn)虛函數(shù)QWidget::keyPressEvent來響應(yīng)相應(yīng)的鍵盤按鍵事件。聲音的實(shí)現(xiàn)聲音的實(shí)現(xiàn)在這里用到了一個(gè)單獨(dú)的類MyBoxAudio來封裝,聲音的實(shí)現(xiàn)要用到庫類中的Phonon類,首先創(chuàng)立一個(gè)媒體對象medioObject和用于輸出聲音的設(shè)備接口對象audioOutput,有了這兩個(gè)對象以后再調(diào)用Phonon::createPath()函數(shù)生成路徑,然后綁定音頻文件〔必須為.wav格式的〕,最后調(diào)用medioObject.play()函數(shù),即可實(shí)現(xiàn)聲音的播放。第六章游戲測試6.1選項(xiàng)按鈕的功能測試〔1〕點(diǎn)擊“游戲開始〞:游戲正常開始,結(jié)果正常;〔2〕點(diǎn)擊“游戲設(shè)置〞:彈出游戲設(shè)置對話框;能夠選中向下鍵↓選項(xiàng)和是否繪制網(wǎng)格選項(xiàng),聲音大小可調(diào),點(diǎn)擊“返回〞按鈕能夠回到主菜單,結(jié)果正常;〔3〕點(diǎn)擊“退出游戲〞:游戲正常退出,結(jié)果正常;〔4〕點(diǎn)擊“暫停〞:游戲停止,“暫停〞變?yōu)椤叭∠麜和(?,再點(diǎn)擊“取消暫停〞:游戲繼續(xù),結(jié)果正常;〔5〕點(diǎn)擊“返回主菜單〞:游戲退回到主菜單界面,結(jié)果正常;6.2按鍵事件的功能測試〔1〕兩次點(diǎn)擊相同圖片,假設(shè)滿足算法,圖片消失,那么結(jié)果正常;〔2〕圖片點(diǎn)擊測試:游戲過程中,點(diǎn)擊鼠標(biāo)左鍵:圖片在沒有其他圖片阻擋的情況下可變灰色,結(jié)果正常;6.3圖片消失測試〔1〕當(dāng)點(diǎn)擊兩張相同圖片:兩站圖片同時(shí)消失,結(jié)果正常;〔2〕當(dāng)圖片消失,且滿足一條直線時(shí)分?jǐn)?shù)增加10分,滿足一個(gè)拐點(diǎn)分?jǐn)?shù)增加20分,滿足兩個(gè)拐點(diǎn),分?jǐn)?shù)增加30分;6.4聲音和顯示測試〔1〕進(jìn)入游戲時(shí):背景音樂正常播放,圖片消失時(shí),有背景音樂播放;〔2〕在游戲過程中,游戲區(qū)域背景顏色不斷改變;在開始最后一關(guān)時(shí):游戲區(qū)域越來越大,結(jié)果正常;6.5測試結(jié)果分析經(jīng)過測試,本游戲?qū)崿F(xiàn)了根本的連連看的功能,運(yùn)行比擬穩(wěn)定,不過有些細(xì)節(jié)方面可能需要改良,游戲在很多方面還需要進(jìn)一步完善??傮w的游戲界面效果如下列圖所示:圖6.1游戲界面效果總結(jié)游戲設(shè)計(jì)與實(shí)踐是一項(xiàng)復(fù)雜而龐大的工作,在選題之后,我才意識(shí)到過程的艱難,因?yàn)橐郧皬膩矶紱]有接觸過游戲設(shè)計(jì),剛開始有點(diǎn)迷茫和彷徨。后來通過翻閱書籍和在網(wǎng)上查閱資料,逐漸找到了一些感覺,在老師的指導(dǎo)下,自己也手動(dòng)編寫了幾個(gè)簡單的游戲,打地鼠游戲和網(wǎng)絡(luò)N子棋雙人對戰(zhàn)游戲,本文以連連看游戲?yàn)槔枰哉f明。本次設(shè)計(jì)讓我初步懂得了電子游戲涉及到的有關(guān)技術(shù)、方法,包括電子游戲選題、構(gòu)思、設(shè)計(jì)步驟等。并實(shí)現(xiàn)一些可演示的游戲軟件,其中有很多應(yīng)用了學(xué)習(xí)的相關(guān)技術(shù),并且做到了界面、聲音都能實(shí)際演示。此次設(shè)計(jì)過程中印象最深的收獲有:1、學(xué)到了很多新知識(shí),并且對老知識(shí)進(jìn)行了回憶。經(jīng)過長時(shí)間的學(xué)習(xí),更進(jìn)一步熟悉了Qt編程、通過不斷上機(jī)實(shí)驗(yàn),調(diào)試程序,總結(jié)經(jīng)驗(yàn),從對課題的不理解到能夠開始動(dòng)手去做,提出新問題并自己想方法去解決問題,自己多實(shí)踐,所以增強(qiáng)了動(dòng)手能力。2、提高了中、英文資料的檢索能力。這次畢業(yè)設(shè)計(jì)過程中我查閱了多資料,包括一些期刊、雜志,還有網(wǎng)絡(luò)中的電子文檔、電子書籍、網(wǎng)頁及下載的視頻教學(xué)課程;不但有中文資料還有英文資料。這些資料,使我的眼界更開闊,對課題的認(rèn)識(shí)更加深刻,編寫程序的時(shí)候思路更加清楚,少走了很多彎路?;貞洿舜卧O(shè)計(jì)過程,我學(xué)到了許多書本上沒有學(xué)到的知識(shí)。通過這次自己制作的軟件,豐富了自己的實(shí)踐技能,擴(kuò)張了本專業(yè)的知識(shí)面,使我受益匪淺,同時(shí)也體驗(yàn)到了搞軟件開發(fā)的難度。在這次設(shè)計(jì)的同時(shí),由于我對這樣的軟件開發(fā)還只是一個(gè)開始,了解的不多,這其中或許還有很多的缺乏,有些模塊做得不是很好,有些功能還不能夠完全的實(shí)現(xiàn),如播放背景音樂時(shí),只能播放一遍,因?yàn)橛螒騋t類庫中封裝的東西太多,有些函數(shù)它底層的具體實(shí)現(xiàn)可能還沒有真正的理解,所以,這也許就是本次游戲設(shè)計(jì)的缺乏之處。致謝今天,畢業(yè)設(shè)計(jì)也告一段落了,也就意味著我的大學(xué)時(shí)代即將結(jié)束?;叵氘厴I(yè)設(shè)計(jì)這幾個(gè)月,回想大學(xué)這四年的時(shí)光,感慨萬千。值得留戀,值得追憶的,實(shí)在太多。還有很多老師,同學(xué),朋友要感謝。首先,要感謝我的指導(dǎo)老師黃同成老師,他認(rèn)真負(fù)責(zé)、踏實(shí)努力的工作精神,一絲不茍、嚴(yán)謹(jǐn)治學(xué)的專業(yè)作風(fēng),給我留下了深刻的印象。黃老師教給我的不僅是科學(xué)知識(shí),他還教給了我做人的道理,所有這些都為我今后的人生道路奠定了堅(jiān)實(shí)的根底,使我受益終生。同時(shí),也要感謝成老師,黃磊老師,感謝信息工程系所有老師四年來的悉心教誨。我們所在的實(shí)驗(yàn)室是一個(gè)溫暖的大集體,也要感謝我們實(shí)驗(yàn)室各位老師給我的幫助。也要感謝與我同寢室的同學(xué)四年來,在工作和學(xué)習(xí)中給與我的鼓勵(lì)和幫助。最后,我還要向我的父母表示最真誠的感謝和祝福,是他們的辛勤和汗水養(yǎng)育了我,是他們的精神鼓舞了我,使我能夠不懈努力和拼搏。致謝人:陳嚴(yán)2012參考文獻(xiàn)[1]MarkSummerfield著.白建平等譯.Qt高級(jí)編程[M].電子工業(yè)出版社2023.8.[2]StanleyB.Lippman等著.李師賢等譯.C++Primer中文版[M].人民郵電出版社2023.7.[3]W.RichardStevens、StephenA.Rago著.尤晉元等譯.UNIX環(huán)境高級(jí)編程[M].人民郵電出版社2023.10.[4]Stanleyb.Lippman著.侯捷譯.深度探索C++對象模型[M].華中科技大學(xué)出版社2001.5.[5]譚浩強(qiáng)著.C程序設(shè)計(jì)第三版[M].清華大學(xué)出版社2005.7.[6]嚴(yán)蔚敏、吳偉民著.數(shù)據(jù)結(jié)構(gòu)[M].清華大學(xué)出版社2023.9.[7]宋勁杉編著.LinuxC編程一站式學(xué)習(xí)[M].電子工業(yè)出版社2023.12.[8]KennethA.Reek著.徐波譯.C和指針[M].人民郵電出版社2003.9.[9]JasmineBlanchette、MarkSummerfield著.閆鋒欣等譯.C++GUIQt4編程[M].電子工業(yè)出版社2023.8.[10]丁林松、黃麗琴編著.Qt4圖形設(shè)計(jì)與嵌入式開發(fā)[M].人民郵電出版社.2023.4.附錄源代碼Mainwindow.cpp#include<resolv.h>#include<stdlib.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<QScrollBar>#include"mainwindow.h"#include"ui_mainwindow.h"#include"udp.h"#include<QImage>#include<QTime>#include"llk.h"#include<iostream>usingnamespacestd;MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);connect(this,SIGNAL(recvMessage(QString,QString)),this,SLOT(onRecvMessage(QString,QString)));//this->setCentralWidget(link);//link->setMaximumSize(300,300);ui->editChatRec->setReadOnly(true);//link=newllk();size=6;isLinkE=false;sendMessage("55",8838,"o17",true);}MainWindow::~MainWindow(){deleteui;}voidMainWindow::changeEvent(QEvent*e){QMainWindow::changeEvent(e);switch(e->type()){caseQEvent::LanguageChange:ui->retranslateUi(this);break;default:break;}}voidMainWindow::on_btnSend_clicked(){QStringstring=ui->lineEdit->text();if(ui->radiosingle->isChecked()==true){sendMessage(string,8838,'c'+ui->editChat->text(),true);}else{string="55";sendMessage("55",8838,'c'+ui->editChat->text(),true);}QStringstr=trUtf8("自己對")+string+trUtf8("發(fā)送:")+"\n"+ui->editChat->text();ui->editChatRec->setPlainText(ui->editChatRec->toPlainText()+"\n"+str);ui->editChat->clear();QScrollBar*bar=ui->editChatRec->verticalScrollBar();bar->setSliderPosition(bar->maximum());}Ui::MainWindow*MainWindow::getUi(){returnui;}voidMainWindow::onRecvMessage(QStringmsg,QStringipAdd){//QStringtime=QTime::currentTime().toString();QStringstring=time+"\n"+QString(trUtf8("收到來自"))+ipAdd+trUtf8(":的消息:")+"\n"+msg.right(msg.length()-1);switch(msg.at(0).toAscii()){case'o'://如果接受的是上線消息ui->listWidget->addItem(msg.right(msg.length()-1));break;default://如果接受的是普通消息ui->editChatRec->setPlainText(ui->editChatRec->toPlainText()+"\n"+string);break;}QScrollBar*bar=ui->editChatRec->verticalScrollBar();bar->setSliderPosition(bar->maximum());}voidMainWindow::on_action_begin_triggered(){/*link=newllk();link->setsize(6);link->arrayInit(6);link->Create(6);link->show();isLinkE=true;*///size=4;if(isLinkE){//link=newllk();//link->setsize(8);//link->arrayInit(8);//link->Create(8);link->close();isLinkE=false;}else{link=newllk();link->setsize(size);link->arrayInit(size);link->Create(size);link->show();isLinkE=true;}if(isLinkE==false){link=newllk();link->setsize(size);link->arrayInit(size);link->Create(size);link->show();isLinkE=true;}}voidMainWindow::on_action_close_triggered(){this->close();link->close();}voidMainWindow::on_action_pause_triggered(){if(isLinkE)link->setEnabled(false);}voidMainWindow::on_action_return_triggered(){link->setEnabled(true);}voidMainWindow::on_action_easy_triggered(){size=6;if(isLinkE){//link=newllk();//link->setsize(8);//link->arrayInit(8);//link->Create(8);link->close();isLinkE=false;}else{link=newllk();link->setsize(6);link->arrayInit(6);link->Create(6);link->show();isLinkE=true;}if(isLinkE==false){link=newllk();link->setsize(6);link->arrayInit(6);link->Create(6);link->show();isLinkE=true;}}voidMainWindow::on_action_soso_triggered(){size=8;/*llk*lin;lin=newllk();//this->setCentralWidget(lin);//lin->setGeometry(30,30,500,500);lin->setsize(8);lin->arrayInit(8);lin->Create(8);lin->setVisible(true);lin->close();*/if(isLinkE){//link=newllk();//link->setsize(8);//link->arrayInit(8);//link->Create(8);link->close();isLinkE=false;}else{link=newllk();link->setsize(8);link->arrayInit(8);link->Create(8);link->show();isLinkE=true;}if(isLinkE==false){link=newllk();link->setsize(8);link->arrayInit(8);link->Create(8);link->show();isLinkE=true;}}voidMainWindow::on_action_diffcult_triggered(){size=10;/*llk*lin;lin=newllk();//this->setCentralWidget(lin);//lin->setGeometry(30,30,500,500);lin->setsize(8);lin->arrayInit(8);lin->Create(8);lin->setVisible(true);lin->close();*/if(isLinkE){//link=newllk();//link->setsize(8);//link->arrayInit(8);//link->Create(8);link->close();isLinkE=false;}else{link=newllk();link->setsize(10);link->arrayInit(10);link->Create(10);link->show();isLinkE=true;}if(isLinkE==false){link=newllk();link->setsize(10);link->arrayInit(10);link->Cremybutton.cpp#include"mybutton.h"MyButton::MyButton(intvalue,QWidget*parent){this->value=value;this->setParent(parent);QObject::connect(this,SIGNAL(clicked()),this,SLOT(mySlot()));}voidMyButton::mySlot(){emitmyClicked(this->value);}

Main.cpp#include<QtGui/QApplication>#include"mainwindow.h"#include<QtGui/QApplication>#include<errno.h>#include<sys/socket.h>#include<resolv.h>#include<stdlib.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<iostream>#include<string>usingnamespacestd;constunsignedintMAXBUF=1024;void*thd_handler(void*window){MainWindow*w=(MainWindow*)window;intsockfd;structsockaddr_inmy_addr;socklen_taddrlen;charbuffer[MAXBUF];unsignedintmyport=8838;printf("serverstarted!\n");//createasocketforudpif((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0) //attention{perror("socketcreationfailure");exit(errno);}//initializesockaddr_inbzero(&my_addr,sizeof(my_addr));my_addr.sin_family=AF_INET;my_addr.sin_port=htons(myport);my_addr.sin_addr.s_addr=INADDR_ANY;//bindif(bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr))==-1){perror("bindfailure");exit(errno);}printf("bindsuccess\n");addrlen=sizeof(structsockaddr);while(true){bzero(buffer,MAXBUF);intlen=recvfrom(sockfd,buffer,MAXBUF,0,(sockaddr*)&my_addr,&addrlen);if(len<0){perror("recvfrom");exit(errno);}emitw->recvMessage(QObject::trUtf8(buffer),inet_ntoa(my_addr.sin_addr));}//closeconnectionclose(sockfd);}intmain(intargc,char*argv[]){pthread_tntid;QApplicationa(argc,argv);MainWindoww;pthread_create(&ntid,NULL,thd_handler,&w);w.show();returna.exec();}udp.cpp#include"udp.h"#include<QString>#include<errno.h>#include<sys/socket.h>#include<resolv.h>#include<stdlib.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>voidsendMessage(QStringipAddress,unsignedintport,QStringmsg,boolisBroad){ //constunsignedintMAXBUF=1024;intsockfd;intaddr_len;intlen;structsockaddr_indest;//charbuffer[MAXBUF];charaddr[16];strcpy(addr,ipAddress.toAscii());//createasocketforudpif((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0) //attention{perror("socketcreationfailure");exit(errno);}if(isBroad){intbroad=1;setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&broad,sizeof(broad));strcpy(addr,"55");}//initializesockaddr_inbzero(&dest,sizeof(dest));dest.sin_family=AF_INET;dest.sin_port=htons(port);if(inet_aton(addr,(structin_addr*)&dest.sin_addr)==0){perror("ipaddressformatiserror");exit(errno);}//sendmsgtoserveraddr_len=sizeof(dest);//bzero(buffer,MAXBUF);len=sendto(sockfd,msg.toLocal8Bit(),msg.toLocal8Bit().length(),0,(sockaddr*)&dest,addr_len);if(len<0){printf("\n\rsenderror.\n\r");exit(errno);}//closeconnection::close(sockfd);}llk.cpp#include"llk.h"#include<iostream>#include"judge.h"llk::llk(){isFirstClick=true;llk::createBtnRerank();size=6;llk::createCurrentProgressBar(size);timer=newQTimer();currentTime=0;QObject::connect(timer,SIGNAL(timeout()),this,SLOT(timeProcess()));}voidllk::xxx(intx){clear(x);//std::cout<<x<<std::endl;//mybutton[x]->setVisible(false);//Widget::arrayInit(6);//progressBar[1]->setValue(20);}voidllk::addPic(QStringpath,inti){labelPic[i]=newQLabel(this);labelPic[i]->setGeometry(i*100+5,30,100,120);QPixmappixmap(path);labelPic[i]->setPixmap(path);labelPic[i]->setVisible(false);progressBar[i]=newQProgressBar();progressBar[i]->setGeometry(i*100+10,120,100,20);progressBar[i]->setParent(this);progressBar[i]->setValue(10);}voidllk::Create(intsize){createTimeProcessBar(size*size);timer->start(1000);charss[26][20]={"begin","./icon/icon1.png","./icon/icon2.png","./icon/icon3.png","./icon/icon4.png","./icon/icon5.png","./icon/icon6.png","./icon/icon7.png","./icon/icon8.png","./icon/icon9.png","./icon/icon10.png","./icon/icon11.gif","./icon/icon12.gif","./icon/icon13.gif","./icon/icon14.gif","./icon/icon15.gif","./icon/icon16.gif","./icon/icon17.gif","./icon/icon18.gif","./icon/icon19.gif","./icon/icon20.gif","./icon/icon21.gif","./icon/icon22.gif","./icon/icon23.gif","./icon/icon24.gif","./icon/icon25.gif"};createCurrentProgressBar(size);currentIndex=size*size;progressBarCurrent->setValue(0);for(unsignedinti=0;i<size*size;i++){mybutton[i]=newMyButton(i,this);mybutton[i]->setGeometry(20+i%size*60,150+i/size*60,60,60);intx,y;x=i/size+1;if((i+1)%size){y=(i+1)%size;}elsey=size;intm=array[x][y];//std::cout<<x<<","<<y<<std::endl;mybutton[i]->setIcon(QIcon(ss[m]));mybutton[i]->setIconSize(QSize(50,50));QObject::connect(mybutton[i],SIGNAL(myClicked(int)),this,SLOT(xxx(int)));//mybutton[i]->setIcon(QIcon(s));}}voidllk::arrayInit(intsize){array[size+1][0]=0;array[size+1][size+1]=0;array[0][size+1]=0;array[0][0]=0;for(inti=1;i<=size;i++){array[0][i]=0;array[size+1][i]=0;array[i][0]=0;array[i][size+1]=0;for(intj=1;j<=size;j++){array[i][j]=((i-1)*size+j-1)/4+1;}}for(inti=1;i<=size;i++){for(intj=1;j<=size;j++){intx1,x2,y1,y2,tmp1;//srand(unsigned(time(NULL)));x1=rand()%size+1;x2=rand()%size+1;y1=rand()%size+1;y2=rand()%size+1;tmp1=array[x1][y1];array[x1][y1]=array[x2][y2];array[x2][y2]=tmp1;}}for(inti=0;i<=size+1;i++){for(intj=0;j<=size+1;j++){std::cout<<array[i][j]<<"";}std::cout<<std::endl;}}voidllk::clear(intindex){if(isFirstClick){firstIndex=index;isFirstClick=false;std::cout<<firstIndex<<",";}else{std::cout<<index<<std::endl;intx1,y1,x2,y2;x1=firstIndex/size+1;x2=index/size+1;if((firstIndex+1)%size){y1=(firstIndex+1)%size;}elsey1=size;if((index+1)%size){y2=(index+1)%size;}elsey2=size;std::cout<<x1<<","<<y1<<std::endl;std::cout<<x2<<","<<y2<<std::endl;std::cout<<"**************"<<std::endl;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論