連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)資料僅供參考文件編號(hào):2022年4月連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)版本號(hào):A修改號(hào):1頁次:1.0審核:批準(zhǔn):發(fā)布日期: 連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)學(xué)生姓名:蔡艷芳指導(dǎo)老師:鄧廣慧摘要本文用VisualC++來設(shè)計(jì)與實(shí)現(xiàn)簡(jiǎn)單的連連看游戲的基本功能,玩家可以在游戲區(qū)域中通過鍵盤控制來選取相同的兩個(gè)物件,采用特定的消除規(guī)則對(duì)它們進(jìn)行消除的操作,當(dāng)游戲區(qū)域中的所有方塊對(duì)都被消除后玩家即可勝利。本次課程設(shè)計(jì)對(duì)該游戲的算法以及游戲圖案的繪制進(jìn)行詳細(xì)的介紹。運(yùn)用連線相消的方法完成了連連看游戲。關(guān)鍵詞:VisualC++;連連看;游戲;3D繪圖 1引言連連看游戲介紹游戲“連連看”顧名思義就是找出相關(guān)聯(lián)的東西,它來源于街機(jī)游戲《四川麻將》和《中國龍》,是給一堆圖案中的相同圖案進(jìn)行配對(duì)的簡(jiǎn)單游戲,在2003年,一個(gè)叫做朱俊的網(wǎng)友將這種形式搬到了PC上,立刻成為辦公一族的新寵,并迅速傳遍了世界各地。飽受工作壓力的人們沒有太多的時(shí)間進(jìn)行復(fù)雜的游戲,而對(duì)于這種動(dòng)動(dòng)鼠標(biāo)就能過關(guān)的游戲情有獨(dú)鐘。之后村子的連連看風(fēng)靡版,阿達(dá)的連連看奧運(yùn)版,連連看反恐版,還有敏敏連連看,水晶連連看等遍地開花,造就了一個(gè)連連看的新世界。連連看游戲有多種地圖樣式和道具系統(tǒng)、大大加強(qiáng)了游戲的可玩性,是一款老少皆宜的休閑佳品。課程設(shè)計(jì)的目的網(wǎng)絡(luò)小游戲制作的目的是滿足了人們休閑的需要,在緊張工作之余休閑類的小游戲能夠給人帶來最大程度的放松,也可以增進(jìn)人們之間的交流,溝通,通過游戲還可以認(rèn)識(shí)更多的朋友,也可以到達(dá)跨省、跨市,甚至跨國間人們互相娛樂的目的。另外也想通過本次課程設(shè)計(jì)將三年來所學(xué)的專業(yè)知識(shí)和其他方面的知識(shí)融入到實(shí)際應(yīng)用中。主要問題 開始制作游戲時(shí),主要要解決的問題有以下幾個(gè)方面:如何設(shè)置整個(gè)游戲的界面;如何控制連連看游戲中隨機(jī)圖片的生成且每種圖片必須為偶數(shù)個(gè);游戲開始后,判斷鼠標(biāo)兩次點(diǎn)擊的圖片能否消去,即圖片是否相同且圖片之間路徑的判斷。課題實(shí)現(xiàn)技術(shù)的簡(jiǎn)要說明VisualC++是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工具,VisualC++不僅是一個(gè)C++編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrateddevelopmentenvironment,IDE)。VisualC++由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lassWizard等開發(fā)工具。這些組件通過一個(gè)名為DeveloperStudio的組件集成為和諧的開發(fā)環(huán)境。VisualC++一直被認(rèn)為是目前最好的軟件開發(fā)工具之一,其在界面開發(fā)、執(zhí)行速度、代碼的移植性方面都有很強(qiáng)的優(yōu)勢(shì)。所以,實(shí)現(xiàn)本系統(tǒng),VC++是一個(gè)相對(duì)較好的選擇。2系統(tǒng)需求分析整個(gè)游戲程序包括了進(jìn)入記錄,圖片消去和過關(guān)結(jié)果三個(gè)階段,在處理鼠標(biāo)響應(yīng)事件中伴隨著3D繪圖。程序通過調(diào)試運(yùn)行,實(shí)現(xiàn)了設(shè)計(jì)目標(biāo),能夠滿足連連看游戲玩家的需要。可行性分析(1)技術(shù)可行性分析技術(shù)上的可行性分析主要分析現(xiàn)有技術(shù)條件能否順利完成開發(fā)工作,硬件、軟件配置能否滿足開發(fā)者的需要,各類技術(shù)人員的數(shù)量,水平,來源等。連連看系統(tǒng)的工作主要是在開發(fā)者和玩家之間架起一座橋梁,能相互溝通信息和處理信息。這一特點(diǎn)非常適合計(jì)算機(jī)特點(diǎn),通過網(wǎng)絡(luò)Internet技術(shù),發(fā)揮計(jì)算機(jī)的信息傳輸速度快、準(zhǔn)確度高的優(yōu)勢(shì)。計(jì)算機(jī)硬件和軟件技術(shù)的飛速發(fā)展,為系統(tǒng)的建設(shè)提供了技術(shù)條件。(2)社會(huì)可行性分析社會(huì)可行性有時(shí)也稱為操作可行性,主要論證新系統(tǒng)在玩家在游戲過程中的感受與反饋信息。在當(dāng)前信息技術(shù)飛速發(fā)展的大環(huán)境下,計(jì)算機(jī)技術(shù)和軟件技術(shù)的更新使得游戲更加的易掌握。功能需求分析關(guān)于連連看的功能描述如下:運(yùn)行游戲并進(jìn)行初始化工作,將整個(gè)游戲區(qū)域分成縱向和橫向擴(kuò)展的若干個(gè)小方塊,并且這些小方塊是由多種動(dòng)物圖案成對(duì)地分布于游戲區(qū)域的不同位置。玩家可以通過選取相同的兩個(gè)物件來對(duì)它們進(jìn)行消除的操作,直到將游戲區(qū)域中的所有方塊對(duì)都被消除后為勝利。性能需求分析(1)硬件環(huán)境處理器:InterCR300或是更高。內(nèi)存:128MB(建議196MB)。硬盤空間:20MB。(2)軟件環(huán)境操作系統(tǒng):Windows98或是Windows2000/WindowsNTServer。 3系統(tǒng)設(shè)計(jì)系統(tǒng)功能設(shè)計(jì)連連看系統(tǒng)的設(shè)計(jì)流程圖如圖所示。游戲框架的搭建游戲框架的搭建菜單的制作連線相消算法的設(shè)計(jì)與實(shí)現(xiàn)繪圖界面的設(shè)計(jì)連連看系統(tǒng)圖連連看游戲的設(shè)計(jì)流程圖系統(tǒng)功能模塊總設(shè)計(jì)這個(gè)游戲的主要類是游戲模式類,類名為CLinkToLinkDlg。這個(gè)類主要對(duì)包括圖案方塊的銷毀判斷,游戲勝利判斷以及整個(gè)游戲用戶交換功能的實(shí)現(xiàn)。它的圖如圖所示。CLinkToLinkDlgm_mem3DBkDC:CDCm_mem3DBkBmp:Cbitmapm_memAnimalDC:CDC m_memAnimalBmp:Cbitmapm_MemDC:CDC m_memBitmap:Cbitmapm_map:intm_nRow: int m_nCol:int m_nX1:int m_nY1:int GameDraw(CDC*pDC):voidStartNewGame():voidIsLink(intx1,inty1,intx2,inty2):BOOLIsWin(void):BOOLX1_Link_X2(intx,inty1,inty2):BOOLY1_Link_Y2(intx1,intx2,inty):BOOLOneCornerLink(intx1,inty1,intx2,inty2):BOOLTwoCornerLink(intx1,inty1,intx2,inty2):BOOLYthrough(intx,inty,BOOLbAdd):BOOLXthrough(intx,inty,BOOLbAdd):BOOLLineX(intx,inty1,inty2):BOOLLineY(intx1,intx2,inty):BOOL圖游戲模式類圖4系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)游戲地圖設(shè)計(jì)對(duì)于整個(gè)游戲區(qū)域,可以把它看作一個(gè)是由若干個(gè)小方塊構(gòu)成的地圖,而且每一個(gè)小方塊放置著不同的動(dòng)物圖案,可將其稱之為圖案小方塊。這些圖案小方塊零散地分布在地圖的不同位置區(qū)域,并且每一個(gè)圖案小方塊都有與其對(duì)應(yīng)的完全一樣的另外一個(gè)小方塊,如圖所示。圖游戲地圖設(shè)計(jì)圖如圖所示,整個(gè)游戲游戲區(qū)域被抽象成一個(gè)有坐標(biāo)位置屬性的平面,平面上零散地分布著若干個(gè)小方塊,并且這些小方塊的物種起碼是成對(duì)出現(xiàn)的。經(jīng)過前面的描述和分析后,可以把游戲區(qū)域地圖用一個(gè)數(shù)組m_map來表示。m_map是把地圖設(shè)計(jì)成一個(gè)動(dòng)態(tài)分配的int整形一維數(shù)組,對(duì)地圖中的行列數(shù)的表達(dá),用一個(gè)轉(zhuǎn)換法則即可??梢栽贚inkToLinkDlg類對(duì)象定義中添加地圖核心數(shù)據(jù)的成員變量,具體如下:=1\*GB3①直接連接方式在直接連接方式中,必須要求所選定的兩個(gè)方塊在同一水平直線上(可以為x方向或y方向),并且兩個(gè)方塊之間沒有任何其他圖案方塊。=2\*GB3②一個(gè)這點(diǎn)連接方式所選定的兩個(gè)方塊如果通過折點(diǎn)的方式連接,那么對(duì)于折點(diǎn)來說,每個(gè)折點(diǎn)必定有且至少有一個(gè)坐標(biāo)(x或y)是和其中一個(gè)目標(biāo)點(diǎn)相同的,即折點(diǎn)必定在兩個(gè)目標(biāo)點(diǎn)所在的x方向或y方向的直線上。此外,對(duì)于一個(gè)折點(diǎn)連接的情況,折點(diǎn)應(yīng)該為第一個(gè)選中方塊的橫向線或縱向線與第二個(gè)選中方塊的縱向線和橫向線相交而得出。=3\*GB3③兩個(gè)折點(diǎn)的連接方式這種方式的兩個(gè)折點(diǎn)所連成的直線與兩物件的直接連線可以構(gòu)成平行線,因此可以根據(jù)這個(gè)規(guī)律,將這條水平線在游戲區(qū)域允許的條件上下移動(dòng),然后通過判斷整條帶垂直折線點(diǎn)的曲線之間有無障礙物方式來確定是否可以連同。這種情況可以分為兩種情況:1)選中的兩圖案方塊在同一直線,兩折點(diǎn)間的直連線可在其這兩個(gè)方塊之間的空間位置作移動(dòng),其約束是不超過游戲邊界區(qū)域。2)選中的兩圖案方塊不在同一直線,兩折點(diǎn)間的直連線可在兩個(gè)方塊之間的空間位置作移動(dòng),其約束是兩方塊之間的區(qū)域。經(jīng)過上面詳細(xì)的分析后,可以對(duì)選定的兩方塊是否可以作抵消操作可以這樣設(shè)計(jì)下去。首先,對(duì)簡(jiǎn)單的直接連情況進(jìn)行判斷,看其是否符合條件,假如不能,再加深一個(gè)級(jí)別的復(fù)雜度,對(duì)一個(gè)折點(diǎn)的情況進(jìn)行判斷,依次類推,如下圖所示。圖連線規(guī)則圖連線流程圖如圖所示。圖連線流程圖根據(jù)如圖所示的流程圖,可以對(duì)選定的兩個(gè)方塊(分別在(x1,y1)以及(x2,y2)兩個(gè)區(qū)域位置,其中x,y分別代表行與列的概念)是否可以抵消作以下實(shí)現(xiàn)。把該功能封裝在IsLink()函數(shù)里面,其代碼如下所示:計(jì)算鼠標(biāo)點(diǎn)擊方塊的的位置 intx=FRONTWIDTH+%FRONTWIDTH1:0)-1; inty=FRONTHEIGHT+%FRONTHEIGHT1:0)-1; 在游戲區(qū)域內(nèi)并且該區(qū)域還有該區(qū)域不是空的區(qū)域 if(x<m_nCol&&y<m_nRow&&m_map[y*m_nCol+x]!=BLANK_STATE) { 假設(shè)尚未記錄第一個(gè)方塊 if(m_nX1==BLANK_STATE) { 判斷是否點(diǎn)擊的方塊非本身,是否點(diǎn)擊同一種動(dòng)物 if((m_nX1!=x||m_nY1!=y)&& m_map[m_nY1*m_nCol+m_nX1]==m_map[y*m_nCol+x] ) { 檢測(cè)是否可以消除 if(IsLink(m_nX1,m_nY1,x,y)) { 數(shù)據(jù)清理 m_map[m_nY1*m_nCol+m_nX1]=BLANK_STATE; m_map[y*m_nCol+x]=BLANK_STATE; } }清空記錄方塊的值 m_nX1=BLANK_STATE; m_nY1=BLANK_STATE; 示的描述方案,可以在內(nèi)存創(chuàng)建兩個(gè)內(nèi)存位圖,并對(duì)它們的圖像進(jìn)行載入。在需要使用的時(shí)候,則可以從這些內(nèi)存位圖中直接去拷貝,并繪制到游戲區(qū)域內(nèi)存位圖中去,接下來添加關(guān)于繪圖的成員變量,如下所示。Theframeworkdoesthisautomatically 鄧VisualC++實(shí)用教程.清華大學(xué)出版社,2004[2]唐俊明.VisualC++編程實(shí)例與技巧.高等教育出版,2002[3]潘錦平.軟件系統(tǒng)開發(fā)技術(shù).西安電子科技大學(xué)出版社,1997[4]張海藩.軟件工程導(dǎo)論.清華大學(xué)出版社.2008附件."menuitemtosystemmenu. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { CStringstrAboutMenu; (IDS_ABOUTBOX); if(!()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } Theframeworkdoesthisautomatically ForMFCapplicationsusingthedocument/viewmodel,voidCLinkToLinkDlg::StartNewGame(){ HCURSORCLinkToLinkDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}voidCLinkToLinkDlg::OnLButtonDown(UINTnFlags,CPointpoint){ 算鼠標(biāo)點(diǎn)擊方塊的的位置 intx=FRONTWIDTH+%FRONTWIDTH1:0)-1; inty=FRONTHEIGHT+%FRONTHEIGHT1:0)-1; 游戲區(qū)域內(nèi)并且該區(qū)域還有該區(qū)域不是空的區(qū)域 if(x<m_nCol&&y<m_nRow&&m_map[y*m_nCol+x]!=BLANK_STATE) { 設(shè)尚未記錄第一個(gè)方塊 if(m_nX1==BLANK_STATE) { 錄第一個(gè)方塊的位置 m_nX1=x; m_nY1=y; 斷是否點(diǎn)擊的方塊非本身,是否點(diǎn)擊同一種動(dòng)物 if((m_nX1!=x||m_nY1!=y)&& m_map[m_nY1*m_nCol+m_nX1]==m_map[y*m_nCol+x] ) { 測(cè)是否可以消除 if(IsLink(m_nX1,m_nY1,x,y)) { 據(jù)清理 m_map[m_nY1*m_nCol+m_nX1]=BLANK_STATE; m_map[y*m_nCol+x]=BLANK_STATE; } } 空記錄方塊的值 m_nX1=BLANK_STATE; m_nY1=BLANK_STATE; //通知重繪 Invalidate(FALSE); } } //察看是否已經(jīng)勝利 if(IsWin()) { MessageBox("恭喜您勝利闖關(guān),即將開始新局"); StartNewGame(); }}BOOLCLinkToLinkDlg::X1_Link_X2(intx,inty1,inty2){ //保證y1的值小于y2 if(y1>y2) { //數(shù)據(jù)交換 intn=y1; y1=y2; y2=n; } //直通 for(inti=y1+1;i<=y2;i++) { if(i==y2) returnTRUE; if(m_map[i*m_nCol+x]!=BLANK_STATE) break; } //左通 if(XThrough(x-1,y1,FALSE)&&XThrough(x-1,y2,FALSE)) returnTRUE; //右通 if(XThrough(x+1,y1,TRUE)&&XThrough(x+1,y2,TRUE)) returnTRUE; returnFALSE;}////Y直接連通//BOOLCLinkToLinkDlg::Y1_Link_Y2(intx1,intx2,inty){ if(x1>x2) { intx=x1; x1=x2; x2=x; } //直通 for(inti=x1+1;i<=x2;i++) { if(i==x2) returnTRUE; if(m_map[y*m_nCol+i]!=BLANK_STATE) break; } //上通 if(YThrough(x1,y-1,FALSE)&&YThrough(x2,y-1,FALSE)) returnTRUE; //下通 if(YThrough(x1,y+1,TRUE)&&YThrough(x2,y+1,TRUE)) returnTRUE; returnFALSE;}////是否同一直線通//BOOLCLinkToLinkDlg::LineX(intx,inty1,inty2){ if(y1>y2) { inty=y1; y1=y2; y2=y; } for(inty=y1;y<=y2;y++) { if(m_map[y*m_nCol+x]!=BLANK_STATE) returnFALSE; if(y==y2) returnTRUE; } returnFALSE;}////是否同一直線通//BOOLCLinkToLinkDlg::LineY(intx1,intx2,inty){ if(x1>x2) { intx=x1; x1=x2; x2=x; } for(intx=x1;x<=x2;x++) { if(m_map[y*m_nCol+x]!=BLANK_STATE) returnFALSE; if(x==x2) returnTRUE; } returnFALSE;}////1直角接口連通//BOOLCLinkToLinkDlg::OneCornerLink(intx1,inty1,intx2,inty2){ if(x1>x2) { intn=x1; x1=x2; x2=n; n=y1; y1=y2; y2=n; } if(y2<y1) { if(LineY(x1+1,x2,y1)&&LineX(x2,y1,y2+1)) returnTRUE; if(LineY(x2-1,x1,y2)&&LineX(x1,y2,y1-1)) returnTRUE; returnFALSE; } else { if(LineY(x1+1,x2,y1)&&LineX(x2,y1,y2-1)) returnTRUE; if(LineY(x2-1,x1,y2)&&LineX(x1,y2,y1+1)) returnTRUE; returnFALSE; } returnFALSE;}////2直角接口連通//BOOLCLinkToLinkDlg::TwoCornerLink(intx1,inty1,intx2,inty2){ if(x1>x2) { intn=x1; x1=x2; x2=n; n=y1; y1=y2; y2=n; } //右通 if(XThrough(x1+1,y1,TRUE)&&XThrough(x2+1,y2,TRUE)) returnTRUE; //左通 if(XThrough(x1-1,y1,FALSE)&&XThrough(x2-1,y2,FALSE)) returnTRUE; //上通 if(YThrough(x1,y1-1,FALSE)&&YThrough(x2,y2-1,FALSE)) returnTRUE; //下通 if(YThrough(x1,y1+1,TRUE)&&YThrough(x2,y2+1,TRUE)) returnTRUE; //右 for(intx=x1+1;x<m_nCol;x++) { if(m_map[y1*m_nCol+x]>-1) break; if(OneCornerLink(x,y1,x2,y2)) returnTRUE; } //左 for(x=x1-1;x>-1;x--) { if(m_map[y1*m_nCol+x]!=BLANK_STATE) break; if(OneCornerLink(x,y1,x2,y2)) returnTRUE; } //上 for(inty=y1-1;y>-1;y--) { if(m_map[y*m_nCol+x1]!=BLANK_STATE) break; if(OneCornerLink(x1,y,x2,y2)) returnTRUE; } //下 for(y=y1+1;y<m_nRow;y++) { if(m_map[y*m_nCol+x1]!=BLANK_STATE) break; if(OneCornerLink(x1,y,x2,y2)) returnTRUE; } returnFALSE;}BOOLCLinkToLinkDlg::XThrough(intx,inty,BOOLbAdd){ if(bAdd) { for(inti=x;i<m_nCol;i++) if(m_map[y*m_nCol+i]!=BLANK_STATE) returnFALSE; } else { for(inti=0;i<=x;i++) if(m_map[y*m_nCol+i]!=BLANK_STATE) returnFALSE; } returnTRUE;}BOOLCLinkToLinkDlg::YThrough(intx,inty,BOOLbAdd){ if(bAdd) { for(inti=y;i<m_nR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論