版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、.課 程 設 計 報 告 課程名稱:面向對象程序設計C+ 設計題目: 連連看游戲 專 業(yè):計算機科學與技術 姓 名: 學 號: 指導教師:李 曉 虹2015 年 1 月 10 日一、實驗目的:為了更加形象的描述地圖路徑查找的過程,本實例以連連游戲為例,實現(xiàn)地圖路徑通路的查找。 二、實驗環(huán)境:Windows xp, VC 6.0 Win 32 Application三、問題描述:使用鼠標操作游戲,第一次點擊一個圖案,則此圖案被提起,這時此圖案被選定,此時如果再次點擊此圖案則取消選定,如果不重復點擊該圖案,而是找到另一個與此圖案完全相同的圖案并點擊,并且兩個圖案之間的連接線轉彎在不超過2次的情況下
2、,則這對圖案連接成功,并消失。 四、基本要求1要連接的兩點上的圖形是相同的。 2兩點間存在一條沒有“障礙”的并且折點不超過兩個的路線。 3、能成四對的產(chǎn)生動物,既要求動物產(chǎn)生時能兩兩配對;且要求每次產(chǎn)生的動物都不一樣。 4、連通時能提示聲音。 四、算法思想:分析一下可以看到,一般分為三種情況 【圖例說明】 假設以一個2維數(shù)組來表示一張連連看的地圖,數(shù)組中元素值為0的代表游戲界面中的空格子,值大于0的代表游戲中的各種連接對象(1代表星星、2代表企鵝之類) 情況一:要連接的兩點在同一條直線上 0 0 0 0 0 0 0 2 0 0 0 2 * - * 0 0 0 0 0 0 情況二:經(jīng)過一個折點相
3、連(+號代表折點) 0 0 0 0 0 0 0 2 0 0 0 + * - + 0 + 0 0 0 2 + - * (兩條路都可連通) 情況三:經(jīng)過兩個折點相連(針對企鵝來說,即數(shù)字2) 0 + 0 0 0 + 0 0 0 0 0 0 0 2 0 1 0 2 0 2 0 1 0 2 0 0 0 0 0 0 或者 0 + 0 0 0 + 由于有1這個障礙,所以需要兩個折點才能連通 二、任意兩點能否連通 尋路算法是整個游戲的核心算法,思路如下: 1 一條直線上兩點能否相連是好判斷的(一個簡單的循環(huán)判斷即可) 2 對于上面圖例的情況二,折點的坐標是固定的,即折點要么是 連點1的坐標x,連點2的坐標y
4、要么是連點1的坐標y,連點2的坐標x,所以,我們只需判斷連點1到折點能否連通,連點2到折點能否連通即可得知連點1和連點2能否連通。并且由于折點與兩個連點分別是在同一條直線上,所以可以由第一步輕松判斷得出結論。 3 將情況三轉化為情況二,(這一步是該算法中最影響性能和需要改進的地方) 0 + 0 0 0 + 0 2 0 1 0 2 0 0 0 0 0 0 (情況三) 將和其中一個連點在同一條直線上的折點當作該連點,那么情況三就轉化為了情況二 0 2 0 0 0 + 0 * 0 1 0 2 (星號為原先的連點) 0 0 0 0 0 0 (轉化后的情況三,最左上的折點已經(jīng)被替換) 現(xiàn)在兩個連接對象2
5、之間的情形,已經(jīng)變?yōu)榍闆r二了。 4 由上可知,尋找這個被替換的折點就成了關鍵。因為其坐標不固定所以只好遞歸一個一個尋找了。 假設A、B兩點是同一個圖形,來思考一下下面的路線 0 0 0 0 0 0 0 0 1 0 B 0 0 0 0 0 0 0 0 A AA 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 如果我們的算法從向右開始尋找,順時針方向旋轉,那么A點先向右移動1格 到達AA的位置,這時測試AA與B是否能連通(按情況二處理),結果不能,因 為折點出都有“障礙”(兩個1),然后A點在移動,到達AAA處 0 0 0 0 0 0 0 0 1 0 B 0 0 0 0 0 0 0 0
6、 A AA AAA 1 0 0 0 0 0 0 0 0 0 0 0 0 0 在AAA處,再次與B點測試連通的時候(按情況二處理),結果是可以,所以A點可以與B點連通, 如果再增加一個障礙 0 0 0 0 0 0 0 0 1 1 B 0 0 0 0 0 0 0 0 A AA AAA 1 0 0 0 0 0 0 0 0 0 0 0 0 0 這次,當尋找到AAA位置時,結果為不能連通。在向右,由于有障礙,所以向右這條路,宣告失敗,換一個方向從A點向下在開始判斷 0 0 0 0 0 0 0 0 1 1 B 0 0 0 0 0 0 0 0 A 0 0 1 0 0 AA 0 0 0 0 0 AAA 0 0
7、 0 0 (向下仍不能連通) 向左,一樣。最后向上 0 0 0 0 0 0 0 0 1 1 B 0 0 AA 0 0 0 0 0 A 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 (AA點與B點符合情況二,可以連通) 最壞的情況,以11*19 的大小來計算, 共需移動28次,情況2共 循環(huán)不超過500次 五、模塊劃分:1.全局定義:HBITMAP hbmp;HBITMAP fullmap;HBITMAP animal;HDC mdc;int map84;int x,y;int row=7,col=12;int begin=0;2.void change(int num )函數(shù)
8、,用于重新隨機排列數(shù)組num 中的數(shù)值void change(int num)int i,temp,p;for(i=0;i<21;i+) p=rand()%21; temp=numi; numi=nump; nump=temp;3. void StartGame(HDC hdc)函數(shù),用于繪制界面void StartGame(HDC hdc) int i,j,k=0,num21,n=0; HDC buff; buff=CreateCompatibleDC(hdc); fullmap=CreateCompatibleBitmap(hdc,480,350); SelectObject(mdc
9、,fullmap); hbmp=(HBITMAP)LoadImage(NULL,"3DFrames.bmp",IMAGE_BITMAP,46,392,LR_LOADFROMFILE); SelectObject(buff,hbmp); for( i=0;i<12;i+) for(j=0;j<7;j+) BitBlt(mdc,i*40,j*50,46,56,buff,0,56,SRCCOPY); BitBlt(hdc,0,0,480,350,mdc,0,0,SRCCOPY); animal=(HBITMAP)LoadImage(NULL,"animal.
10、bmp",IMAGE_BITMAP,78,1638,LR_LOADFROMFILE); SelectObject(mdc,animal); if(begin=0) for(i=0;i<21;i+) numi=rand()%42; for(i=0;i<84;i+) mapi=-1; for(i=0;i<7;i+) for(j=0;j<12;j+) if(k=21) change(num); k=0; mapn=numk; n+; k+; k=0; for(i=0;i<7;i+) for(j=0;j<12;j+) BitBlt(hdc,j*40,i*5
11、0+5,39,39,mdc,39,mapk*39,SRCAND);BitBlt(hdc,j*40,i*50+5,39,39,mdc,0,mapk*39,SRCPAINT);k+; 4. int judement (int oldx,int oldy,int newx,int newy),用于判斷鼠標點擊的的兩點是否符合路徑要求int X1_Link_X2(int oldx,int oldy,int newy)int temp,i;if(oldy>newy)/數(shù)據(jù)交換temp=oldy;oldy=newy;newy=temp;/直通for(i=oldy+1;i<=newy;i+)if
12、(i=newy)return 1;if(mapi*col+oldx!=-1)break;return 0;/橫著 y相同x方向相連int Y1_Link_Y2(int oldx,int oldy,int newx)int temp;int i;if(oldx>newx)temp=oldx;oldx=newx;newx=temp;/直通for(i=oldx+1;i<=newx;i+)if(i=newx)return 1;if(mapoldy*col+i!=-1)break;return 0;int OneCornerLink(int oldx,int oldy,int newx,in
13、t newy) int x1,y1,x2,y2;x1=newx;y1=oldy;x2=oldx;y2=newy;if(mapy1*col+x1=-1)/判斷轉彎的地方是不是-1if(X1_Link_X2(x1,y1,newy)&&Y1_Link_Y2(oldx,oldy,x1)return 1;if(mapy2*col+x2=-1)/判斷轉彎的地方是不是-1if(X1_Link_X2(oldx,oldy,y2)&&Y1_Link_Y2(x2,y2,newx)return 1;return 0;int TwoCornerLink(int oldx,int oldy
14、,int newx,int newy)/右 for(int x=oldx+1;x<col;x+)if(mapoldy*col+x!=-1)break;if(OneCornerLink(x,oldy,newx,newy)return 1;/左for(x=oldx-1;x>-1;x-)if(mapoldy*col+x!=-1)break;if(OneCornerLink(x,oldy,newx,newy)return 0;/上for(int y=oldy-1;y>-1;y-)if(mapy*col+oldx!=-1)break;if(OneCornerLink(oldx,y,ne
15、wx,newy)return 1;/下for(y=oldy+1;y<row;y+)if(mapy*col+oldx!=-1)break;if(OneCornerLink(oldx,y,newx,newy)return 1;return 0;int Boundary(int oldx,int oldy,int newx,int newy)/向右int i,j;int tag1=0,tag2=0;if(oldx=col-1)tag1=1;elsefor(i=oldx+1;i<col;i+)if(mapoldy*col+i!=-1)break;if(i=col)tag1=1;i=0;j=
16、0;/初始化下if(newx=col-1)tag2=1;elsefor(i=newx+1;i<col;i+)if(mapnewy*col+i!=-1)break;if(i=col)tag2=1;if(tag1&&tag2)return 1;tag1=0;tag2=0;i=0;j=0;/初始化/向左if(oldx=0)tag1=1;elsefor(i=oldx-1;i>=0;i-)if(mapoldy*col+i!=-1)break;if(i=-1)tag1=1;i=0;j=0;if(newx=0)tag2=1;elsefor(i=newx-1;i>=0;i-)
17、if(mapnewy*col+i!=-1)break;if(i=-1)tag2=1;if(tag1&&tag2)return 1;tag1=0;tag2=0;i=0;j=0;/向下if(oldy=row-1)tag1=1;elsefor(i=oldy+1;i<row;i+)if(mapi*col+oldx!=-1)break;if(i=row)tag1=1;i=0;j=0;/初始化下if(newy=row-1)tag2=1;elsefor(i=newy+1;i<row;i+)if(mapi*col+newx!=-1)break;if(i=row)tag2=1;if(
18、tag1&&tag2)return 1;tag1=0;tag2=0;i=0;j=0;/初始化 /向上 if(oldy=0)tag1=1;elsefor(i=oldy-1;i>=0;i-)if(mapi*col+oldx!=-1)break;if(i=-1)tag1=1;i=0;j=0;if(newy=0)tag2=1;elsefor(i=newy-1;i>=0;i-)if(mapi*col+oldx!=-1)break;if(i=-1)tag2=1;if(tag1&&tag2)return 1;return 0;int judement (int o
19、ldx,int oldy,int newx,int newy)/x直連方式 豎著if(oldx=newx)if(X1_Link_X2(oldx,oldy,newy)return 1;/y直連方式 橫著else if(oldy=newy)if(Y1_Link_Y2(oldx,oldy,newx)return 1;/一個轉彎直角的聯(lián)通方式if(OneCornerLink(oldx,oldy,newx,newy)return 1;else if(TwoCornerLink(oldx,oldy,newx,newy)return 1;else if(Boundary(oldx,oldy,newx,new
20、y)return 1;return 0;5. void OnLButtonDown(HDC hdc,int x,int y),根據(jù)鼠標點擊信息處理界面圖片,這是主函數(shù)int x1=-1,y1=-1;void OnLButtonDown(HDC hdc,int x,int y)HPEN hPen;hPen=CreatePen(PS_SOLID,1,RGB(255,0,0);/計算鼠標點擊方塊的位置int x0=x/40;int y0=y/50;/在游戲區(qū)域內并且該區(qū)域不是空的區(qū)域if(x0<col && y0<row && mapy0*col+x0!=
21、-1)/假設尚未記錄第一個方塊if(x1=-1)/記錄第一個方塊的位置x1=x0;y1=y0;/將選中的方框四周畫上紅色的線SelectObject(hdc,hPen); MoveToEx(hdc,x0*40,y0*50,NULL);LineTo(hdc,x0*40+40,y0*50);LineTo(hdc,x0*40+40,y0*50+50);LineTo(hdc,x0*40,y0*50+50);LineTo(hdc,x0*40,y0*50);else/不等于自己,且另個位置動物一樣if(x1!=x0|y1!=y0)&&mapy1*col+x1=mapy0*col+x0)/檢驗是否可消除if(!(x1=x0 &&y1=y0)if(judement(x1,y1,x0,y0)/數(shù)據(jù)清理mapy1*col+x1=-1;mapy0*col+x0=-1; PlaySound("sel.wav",NULL,SND_FILENAME|SND_ASYNC);x1=-1;y1=-1;begin=1; Start
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 含子女撫養(yǎng)的離婚協(xié)議書模板
- 企業(yè)運營管理咨詢協(xié)議樣本
- 2024工程挖掘機租賃合同標準范文
- 新住宅按揭貸款合同樣本
- 2024錄制合同模板
- 2024廣告刊登協(xié)議范本
- 動物醫(yī)院聘用合同2024年
- 省級代理合作協(xié)議書的注意事項
- 我國自學考試網(wǎng)上輔導協(xié)議書樣本大全
- 2023年高考地理第一次模擬考試卷-(河北A卷)(全解全析)
- 空調安裝施工方案及空調安裝現(xiàn)場管理辦法
- 甘肅省黃金礦產(chǎn)資源概況
- 診所消防安全應急方案
- 譯林版一年級上冊英語全冊課件
- 中小學德育工作指南考核試題及答案
- 凈現(xiàn)值NPV分析和總結
- 國網(wǎng)基建各專業(yè)考試題庫大全-質量專業(yè)-中(多選題匯總)
- LTC流程介紹完整版
- 飼料加工系統(tǒng)粉塵防爆安全規(guī)程
- 一年級上冊美術課件-第11課-花兒寄深情-▏人教新課標
- 植物的象征意義
評論
0/150
提交評論