




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、南京曉莊學院2011屆本科畢業論文(設計)分類號:學校代碼:11460學 號:06202806 南京曉莊學院本科生畢業論文 基于c#的連連看設計design of link-up based on c #所在院:行知學院學生姓名:張智煒指導教師:禹沈清研究起止日期:二一年十月至二一一年六月二一一年六月學位論文獨創性聲明本人鄭重聲明:1. 堅持以“求實、創新”的科學精神從事研究工作。2. 本論文是我個人在導師指導下進行的研究工作和取得的研究成果。3. 本論文中除引文外,所有的實驗、數據和有關材料均是真實的。4. 本論文中除引文和致謝的內容外,不包含其他人或或其它機構已經發表或撰寫過的
2、研究成果。5. 其它同志對本研究所做過的貢獻均以在論文中作了聲明并表示了謝意。 作者簽名:張智煒 日 期:2011年6月目錄1 引言-41.1 游戲規則-4 1.2 設計目的-42 研究現狀-43 設計思路-5 3.1 游戲畫面-5 3.2 獲取圖片位置-5 3.3 路徑判斷-5 3.4 連連看系統結構-54 算法分析和設計-5 4.1 連連看游戲地圖數據設計-6 4.2 加載資源圖過程-75 圖片的消除判斷-86 游戲功能事件-107 測試結果-187 總結-18·參考文獻-19·致謝-19·附錄-191. 主界面的設計-192. 主要代碼-21 ·摘
3、要:本文使用c#設計并實現簡單的連連看游戲的基本功能,玩家可以在游戲界面內通過鼠標控制選取相同的兩個圖片,根據特定的消除規則對它們進行消除的操作,當游戲界面內的所有圖片在規定時間內都被消除后玩家即為勝利。本文對游戲的規則,算法,圖片的消除和界面的設計進行詳細的介紹。實現起來較為簡單,也比較實用。關鍵詞: 連連看 游戲 c#·abstractthis article uses c # design and implementation of simple basic functions link-up game, players can control the mouse within
4、 the game interface, select the same two pictures, according to specific rules on the elimination of the operation to eliminate them, when all the pictures within the game interface within the specified time players have been eliminated is the victory. in this paper, the rules of the game, algorithm
5、s, images and interface design to eliminate detail. relatively simple to implement, but also more practical.keywords:link-up games c #1.引言1.1游戲規則a:可以使用鼠標點擊2張相同圖片,2張圖片就可以消除,但是連接線的折點不能多于2個。b:在規定時間內,將游戲界面內的圖片全部消除即為勝利,否則即為失敗。如果在規定的時間內消除所有的圖片即為勝利,但并不會進入下一關,需要自己選擇難度在挑戰。主要是考慮了設計性,所以在功能上并沒有設計的很完美。1.2設計目的 設計
6、單機休閑小游戲的目的是為了休閑的需要,在緊張的工作,學習之余玩下小游戲能夠帶來一些放松,減輕一些壓力。通過本程序將四年來所學的專業知識和其他方面的知識融入到實際應用中。2.研究現狀連連看游戲是源自臺灣的一種桌面益智小游戲。因其廣受歡迎和喜愛,許多程序員編寫了各種版本,從flsash版本的連連看到社交網絡的連連看,目前仍有很多用戶深深喜愛這款小游戲,所以如何編寫更好版本的連連看,也就意味著更好的市場前景。休閑益智簡單的游戲設計的目的是滿足了人們休閑的需要,在緊張工作之余休閑類的小游戲能夠給人帶來最大程度的放松?,F在桌面小游戲、在線網頁游戲、社交游戲越來越受網民歡迎,除了玩的方法簡單外,很多游戲不
7、乏經典。連連看游戲就是一個典型。不管走到哪個網頁游戲網站,哪個社交游戲平臺,連連看游戲總是排在玩家歡迎排名的前5位,休閑、趣味、益智是連連看玩不厭的精華,且不分男女老少、工薪白領,是一款適合大眾的經典網絡休閑小游戲。3設計思路3.1游戲畫面 精致美觀的畫面能夠吸引更多的玩家娛樂,本文畫面雖不精致,也整體得當。3.2獲取圖片位置 通過數組從圖片庫隨即獲取規定的偶數張圖片,使其隨機分布在游戲界面里。3.3路徑判斷 連連看的要求:1:兩張圖片是相同的2:兩張圖片之間連線的折點不超過兩個。(連接線由x軸和y軸的平行線組成)則兩張圖片的連接情況可以分為三種:a:直線相連b:一個折點c:兩個折點;通過分析
8、可知,每一個折點必定有且至少有一個坐標(x或者y)和兩張圖片中的任意一張圖片是相同的,即折點必定在兩張圖片所在的x方向或y方向的直線上。因此路徑的判斷是:假設兩張圖片p1,p2,如果有兩個折點分別在z1,z2 那么1:如果驗證p1,p2直線連線,則連接成立2:搜索以p1,p2的x,y方向四條直線(可能某兩條直線會重合)上的有限點,每次取兩點作為z1,z2,驗證p1到z1/z1到z2/z2到p2是否都能直線相連,是則路徑連接成立否則連接不成立。3.4連連看系統結構(如圖1)附圖: 圖1(連連看系統結構圖)4.算法分析和設計分析算法前,應先抽象出游戲基本結構,對于連連看游戲來說,核心的部分應該是整
9、個游戲界面內的地圖數據。下面分析游戲特性,然后設計出標識地圖的數據結構。4.1連連看游戲地圖數據設計在游戲界面內,圖片隨機分布在地圖的不同位置,并且每張圖片都有與之相應的一個方塊位置,如圖2附圖: 圖2(游戲地圖數據設計分布圖)有圖2可知,整個游戲界面被抽象成一個有坐標位置屬性的平面,平面上隨機分布著n張圖片方塊,并且圖片方塊是成對的。由前面的描述和分析,可以把游戲界面地圖用一個數組gmap來表示。gmap是把地圖設計成一個動態分配 的int整形一維數組./地圖位置相關屬性組int*gmap; /動態地圖數據頭指針intmapheight;/地圖的行數(虛擬)intmapwidth; /地圖的
10、列數(虛擬)上面的成員變量中定義了一個整形指針標量gmap,用于記錄動態分配出來的一維數組地圖空間的首地址。對于地圖區域內的某張圖片的類型,可以用一個整形的id來進行識別。這里為標識地圖的行列位置分別添加mapheight和mapwidth變量?,F在,地圖的數據結構已經設計好。下面對游戲進行初始化。由于圖片需要成對,因此在做地圖的初始化時,不僅僅是對圖片種類做簡單的隨機取數,而是需要成對地相同圖案圖片進行成對選取,也就是地圖中的圖片必須是偶數個。前面說過,把地圖數組設置成動態分配方式,目的是讓其數據空間可以根據行列數的需求動態地獲取,而對于實際不同大小比例的地圖可以預先定義幾組關于行列數的宏來
11、實現。當需要創建時,根據宏值的不同分配不同大小的地圖空間即可。4.2加載資源圖過程: private void initebmp(int maxnum) g_g = this.creategraphics(); for (int i = 0; i < mapwidth; i+) for (int j = 0; j < mapheight; j+) gmapi, j = 0; initerandommap(ref gmap, maxnum); ai = new myclass(ref gmap); for (int i = 0; i < maxnum; i+) resource
12、manager rm = new resourcemanager("gamellk.myres", assembly.getexecutingassembly(); imgi = (image)rm.getobject( i.tostring() + ".bmp"); 分配好的空間中選擇適當的圖案的圖片,對數據進行初始化。即需要對地圖空間內的數據進行成對性的隨機分布,通過initerandommap 函數可以實現代碼如下: /隨機載入圖塊 private void initerandommap(ref int, map, int num) random
13、r = new random(); while (num > 0) for (int i = 0; i < multipic; i+) int xrandom = r.next(19); int yrandom = r.next(11); if (mapxrandom, yrandom = 0) mapxrandom, yrandom = num; else i-; num-; 5.圖片的消除判斷得分于銷毀背景/畫線銷毀和得分 private void processcorner(point p1, point p2) point corner = new point3; corn
14、er = ai.getpoints(); pen pen = new pen(new solidbrush(color.red), 2);/線畫筆 pen bkpen = new pen(new solidbrush(this.backcolor), 2);/擦去畫筆 switch (corner2.x) case 1: score += 2;/一個拐點加20; g_g.drawline(pen, new point(p1.x * 31 + 15, p1.y * 34 + 17), new point(corner0.x * 31 + 15, corner0.y * 34 + 17); g_g
15、.drawline(pen, new point(p2.x * 31 + 15, p2.y * 34 + 17), new point(corner0.x * 31 + 15, corner0.y * 34 + 17); thread.sleep(200); eraseblock(g_g, p1, p2); g_g.drawline(bkpen, new point(p1.x * 31 + 15, p1.y * 34 + 17), new point(corner0.x * 31 + 15, corner0.y * 34 + 17); g_g.drawline(bkpen, new point
16、(p2.x * 31 + 15, p2.y * 34 + 17), new point(corner0.x * 31 + 15, corner0.y * 34 + 17); break; case 2: score += 4;/兩個拐點加40 point ps = new point(p1.x * 31 + 15, p1.y * 34 + 17), new point(corner1.x * 31 + 15, corner1.y * 34 + 17), new point(corner0.x * 31 + 15, corner0.y * 34 + 17), new point(p2.x * 3
17、1 + 15, p2.y * 34 + 17) ; g_g.drawlines(pen, ps); thread.sleep(200); eraseblock(g_g, p1, p2); g_g.drawlines(bkpen, ps); break; case 0: score += 1;/直連加10 g_g.drawline(pen, new point(p1.x * 31 + 15, p1.y * 34 + 17), new point(p2.x * 31 + 15, p2.y * 34 + 17); thread.sleep(200); eraseblock(g_g, p1, p2);
18、 g_g.drawline(bkpen, new point(p1.x * 31 + 15, p1.y * 34 + 17), new point(p2.x * 31 + 15, p2.y * 34 + 17); break; default: break; label1.text = "得分:" + score.tostring(); /銷毀背景 private void eraseblock(graphics g, point p1, point p2) g.fillrectangle(new solidbrush(this.backcolor), new rectan
19、gle(p1.x * 31, p1.y * 34, 31, 34); g.fillrectangle(new solidbrush(this.backcolor), new rectangle(p2.x * 31, p2.y * 34, 31, 34); gmapp1.x, p1.y = 0; gmapp2.x, p2.y = 0; ai.givemapvalue(p1.x, p1.y, 0); ai.givemapvalue(p2.x, p2.y, 0); 6 游戲功能事件6.1開始游戲 private void toolstripbutton1_click(object sender, e
20、ventargs e) initebmp(picnum); /加載資源圖 bstart = true; /開始為真 bpause = false; /暫停為假 decint = timeint; /初始記時變量 this.invalidate(); toolstripbutton2.enabled = true; toolstripbutton1.enabled = false; toolstripcombobox1.enabled = false; timer1.enabled = true; /記時開始 label3.text = "游戲中" 6.2結束游戲 priva
21、te void toolstripbutton2_click(object sender, eventargs e) bstart = false; /開始為假 this.invalidate(); toolstripbutton2.enabled = false; toolstripbutton1.enabled = true; toolstripcombobox1.enabled = true; picturebox1.visible = false; /控件顯示或者不顯示等。 timer1.enabled = false; /記時結束 label2.text = "剩余->
22、; " + timeint.tostring() + " 秒結束" label1.text = "得分:0" label3.text = "空閑" 6.3計時器過程 private void timer1_tick(object sender, eventargs e) decint = decint - 1; /倒記時變量 label2.text = "剩余-> " + decint.tostring() + " 秒結束" if (decint <= 10) /如果小于1
23、0秒就報警 alarmplayer.play(); /報警音 if (decint = 0) timer1.enabled = false; /關閉記時器 messagebox.show("對不起,游戲時間已到,您未能闖關");/彈窗口警告 toolstripbutton2_click(null, null);/停止 6.4組合框事件(工具欄事件) private void toolstripcombobox1_dropdownclosed(object sender, eventargs e) switch (toolstripcombobox1.selectedinde
24、x) case 0: picnum = 10; /圖片數量 multipic = 2; /重復 timeint = 60; /1分鐘 /時間數 break; case 1: picnum = 12; multipic = 4; timeint = 120;/2分鐘 break; case 2: picnum = 14; multipic = 6; timeint = 180;/3分鐘 break; case 3: picnum = 16; multipic = 8; timeint = 300;/5分鐘 break; case 4: picnum = 18; multipic = 10; ti
25、meint = 600;/10分鐘 break; default: break; decint = timeint; toolstriplabel2.text = convert.tostring(picnum) + ":" + convert.tostring(multipic); label2.text = "剩余-> " + timeint.tostring() + " 秒結束" 6.5全局熱鍵實現過程 /裝載鉤子 (此代碼放在程序加載過程中) keyboardhook.keydown += new keyeventhan
26、dler(keyboardhook_keydown); keyboardhook.start(); /卸載鉤子 (此代碼放在程序退出過程前formclosing) keyboardhook.stop(); /獲取鍵盤按下時的全局響應事件 void keyboardhook_keydown(object sender, keyeventargs e) switch (e.keycode.tostring() case "f1":/start 截取按鍵f1 if (bpause = false) initebmp(picnum); /加載資源圖 bstart = true; /
27、開始為真 bpause = false; /暫停為假 decint = timeint; /記時器倒記時初始化 this.invalidate(); toolstripbutton2.enabled = true; toolstripbutton1.enabled = false; toolstripcombobox1.enabled = false; /控件可用或者不可用 timer1.enabled = true; /記時開始 label3.text = "游戲中" /標題 break; case "f2": /pause截取按鍵f2 if (bst
28、art = true) if (bpause = false) timer1.enabled = false; label3.text = "暫停中" bpause = true; picturebox1.visible = true; else bpause = false; timer1.enabled = true; label3.text = "繼續了" picturebox1.visible = false; break; case "f3": /stop截取按鍵f3 if (bstart = true) bstart =
29、false; bpause = false; picturebox1.visible = false; this.invalidate(); toolstripbutton2.enabled = false; toolstripbutton1.enabled = true; toolstripcombobox1.enabled = true; timer1.enabled = false; label2.text = "剩余-> " + timeint.tostring() + " 秒結束" label1.text = "得分:0&quo
30、t; label3.text = "空閑" break; default: break; 6.6過關設置時間 /* /鼠標事件捕捉,按下 /* private void frmmain_mousedown(object sender, mouseeventargs e) int curx = e.x / 31; int cury = e.y / 34; if (curx > 18 | cury > 10) return; if (gmapcurx, cury != 0) selectplayer.play(); pen pen = new pen(new sol
31、idbrush(this.backcolor); g_g.drawrectangle(pen, new rectangle(curx * 31, cury * 34 , 31, 34); two+; switch (two) case 1: fpoint = new point(curx, cury); break; case 2: if (ai.islink(fpoint.x, fpoint.y, curx, cury) two = 0; eraseplayer.play(); /獲得拐點數目和位置,做畫線處理 processcorner(fpoint, new point(curx, cu
32、ry); if (checkwin(ref gmap) timer1.enabled = false; switch (toolstripcombobox1.selectedindex) case 0: messagebox.show("您已經入門,請選擇更高級別"); break; case 1: messagebox.show("真的不敢相信這是真的"); break; case 2: messagebox.show("本年度的連連看冠軍!是你,太厲害了"); break; case 3: messagebox.show(&quo
33、t;恭喜你完成挑戰,請挑戰瘋狂的最后一關"); break; case 4: messagebox.show("通關。謝謝!"); break; default: break; toolstripbutton2_click(null, null); else two = 1; fpoint = new point(curx, cury); break; default: break; 7測試結果在多次運行時出現了一些問題:1圖片的比例不協調,只好重新設計圖片并且加入資源文件。2倒計時時間到負數不停止游戲。我就對倒計時為0時加入判斷過程,為0就結束,并且提示闖關失敗
34、。3熱鍵出現假死現象,程序崩潰。我就在程序退出時卸載熱鍵鉤子函數。雖然我舉例說了3個問題,但是在我多次的運行和調試時出現的問題其實還是很多的。一個沒有錯誤的程序總是要經過多次的運行和調試才能設計出來,雖然我設計的能夠正常無誤的運行,但是還是有一些不足,設計的不夠完美。8總結 本文是通過c#編寫的設計性論文,由于能力有限,經驗不足,一開始對c#不是很了解,所以專門去看了一些c#的書。通過導師的指導,同學們的幫助和自己的努力,終于能夠設計出本文。隨著網絡的完善,各種程序的開發也應運而生。連連看小游戲雖然很早就被開發應用在各個平臺上。但是學習如何編寫連連看小游戲,其實也是對自身能力的提升和證明。為以
35、后能夠編寫更有價值更有潛力更有市場的程序奠定基礎。參考文獻【1】劉浩,陳曙東:c#編程實例與技巧,清華大學出版社,2002.2【2】周存杰,c#網絡核心編程,清華大學出版社,2002.11【3】梁立新,c#核心技術應用開發,電子工業出版社,2010.9【4】鄭阿奇,:visualc#應用案例教程,電子工業出版社2010.7【5】譚浩強,c程序設計(第三版),清華大學出版社 2005.7【6】(美)內格爾,c#高級編程(第六版),清華大學出版社 2008.9【7】金旭亮,編程的奧秘- .net軟件技術學習與實踐,電子工業出版社,2007.2 【8】(美)christian nagel,c#入門經
36、典(第五版),清華大學出版社,2010.12·致謝在半年的忙碌實習和學習中,本次畢業設計已經接近尾聲,作為一名即將畢業的本科生,由于經驗的匱乏,能力的有限,無法避免會有許多考慮不周全的地方。如果沒有導師的督促指導,以及同學們的幫助,完成一個設計是很難的。 在這里首先要感謝我的導師禹沈清老師。禹老師平日里工作繁多,但在我做畢業設計的每個階段,從查閱資料,到設計草案的確定和修改,中期檢查,后期詳細設計等整個過程中都給予了我悉心的指導。除了敬佩禹老師的專業水平外,她的治學嚴謹和科學研究的精神也是我永遠學習的榜樣,并將積極影響我今后的學習和工作。 最后感謝我的母校南京曉莊學院這四年來對我的大力栽培。·附錄1主界面的設計1.1界面的設計由于此程序的界面可以說是很簡單,所以用到的控件不多,主要的內容就是代碼設計。圖片的隨機生成要用到一個random()函數將隨機數賦值給map 數組中的每個元素,然后根據數組元素值,來顯示圖片。以下是我設計的界面(如圖3)附圖: 圖3(游戲界面)1.2圖片的隨即生成實現此功能需要分步進行1程序運行時就會載入游戲需要圖片,默認情況下圖片種類是10,重復數是2(重
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司組織垂釣活動方案
- 公司清明節策劃方案
- 公司每周活動策劃方案
- 公司端午節策劃活動方案
- 公司涉外年會活動方案
- 2025年職業素養與道德考試試卷及答案
- 2025年無線通信與網絡技術考試卷及答案
- 2025年體育營養與健康指導考生能力測試卷及答案
- 2025年生鮮電商管理師資格考試試卷及答案
- 2025年汽車工程與設計基礎知識考試試卷及答案
- 計算機技術前沿總結課件
- 輸電線路風偏計算基本方法
- 馬鞍山市潔源環保有限公司馬鞍山市一般工業固廢填埋場項目重新報批環境影響報告書
- 通信線路投標文件
- 集結號觀后感 集結號觀后感500字(最全)
- (完整版)全國各省份城市明細表
- 《“將軍飲馬”問題》說課稿
- GB/T 6109.20-2008漆包圓繞組線第20部分:200級聚酰胺酰亞胺復合聚酯或聚酯亞胺漆包銅圓線
- 食品營養與健康-18中國居民平衡膳食寶塔
- 《社會主義核心價值觀》優秀課件
- 初中生物會考模擬試題
評論
0/150
提交評論