畢業(yè)論文 網(wǎng)絡(luò)小游戲.doc_第1頁(yè)
畢業(yè)論文 網(wǎng)絡(luò)小游戲.doc_第2頁(yè)
畢業(yè)論文 網(wǎng)絡(luò)小游戲.doc_第3頁(yè)
畢業(yè)論文 網(wǎng)絡(luò)小游戲.doc_第4頁(yè)
畢業(yè)論文 網(wǎng)絡(luò)小游戲.doc_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

網(wǎng)絡(luò)小游戲-連連看 摘要 因特網(wǎng)的發(fā)展使人類進(jìn)入了一個(gè)全新的世界,人與人之間可以遠(yuǎn)隔萬(wàn)里為了同一興趣愛好而交流,做到了網(wǎng)絡(luò)無(wú)國(guó)界,信息無(wú)國(guó)界。隨著因特網(wǎng)的不斷發(fā)展,網(wǎng)絡(luò)游戲作為一個(gè)新的名詞融入到了人們的日常生活當(dāng)中。網(wǎng)絡(luò)游戲來(lái)源于“onlinegame”,更直接的翻譯是“在線游戲”,亦即必須在大家聯(lián)網(wǎng)而且都在線的時(shí)候,才能夠團(tuán)隊(duì)互動(dòng),否則就屬于單機(jī)游戲了。 網(wǎng)絡(luò)游戲產(chǎn)業(yè)作為現(xiàn)代電腦電子技術(shù)的產(chǎn)物,正在以其獨(dú)特的魅力在全世界的娛樂領(lǐng)域占據(jù)主流位置,我們?cè)诔姓J(rèn)廣大娛樂網(wǎng)民的選擇空間狹小的同時(shí),也必須明確的一點(diǎn)就是網(wǎng)絡(luò)游戲本身所具有的強(qiáng)大的吸引力。網(wǎng)絡(luò)游戲的吸引力主要在于,它在讓玩家打發(fā)時(shí)間的同時(shí),可以讓人實(shí)現(xiàn)在顯示生活中不能實(shí)現(xiàn)的理想,得到在顯示中不能得到的東西。而且網(wǎng)游產(chǎn)業(yè)促動(dòng)高科技技術(shù)不斷升級(jí),作為經(jīng)濟(jì)增長(zhǎng)的一大支撐點(diǎn),已經(jīng)成為經(jīng)濟(jì)騰飛的“第四產(chǎn)業(yè)”。近年來(lái),世界網(wǎng)絡(luò)游戲市場(chǎng)高速發(fā)展。根據(jù)統(tǒng)計(jì),全球網(wǎng)絡(luò)玩家所占互聯(lián)網(wǎng)人群的比例已經(jīng)超過(guò)30%。網(wǎng)絡(luò)游戲憑借其信息雙向交流,速度快,不受空間限制等互聯(lián)網(wǎng)有時(shí),具有誘人的互動(dòng)性、仿真性和競(jìng)技性,已經(jīng)成為網(wǎng)絡(luò)業(yè)盈利優(yōu)厚的三大領(lǐng)域之一。網(wǎng)絡(luò)平臺(tái)的發(fā)展,為網(wǎng)絡(luò)游戲奠定了堅(jiān)實(shí)的“物質(zhì)”基礎(chǔ)。寬帶的迅猛發(fā)展為網(wǎng)絡(luò)游戲提供了“高速公路”,而專用游戲服務(wù)器則為網(wǎng)絡(luò)游戲提供了容量巨大的“加油站”。前不久,網(wǎng)絡(luò)游戲還被視為一個(gè)“高風(fēng)險(xiǎn)”的行業(yè),但隨著人們對(duì)網(wǎng)絡(luò)游戲的重新認(rèn)識(shí),網(wǎng)絡(luò)游戲正在恢復(fù)其應(yīng)有的地位。 關(guān)鍵字 連連看、網(wǎng)絡(luò)游戲、網(wǎng)絡(luò)對(duì)戰(zhàn)。 目錄 1 選題背景1 1.1 課題來(lái)源1 1.2 目的1 1.3 意義1 1.4 主要問(wèn)題1 1.5 技術(shù)要求2 1.6 發(fā)展概況2 1.7 指導(dǎo)思想2 2 方案論證2 2.1設(shè)計(jì)原理2 2.2 方案選擇3 2.3 數(shù)據(jù)流圖3 3系統(tǒng)設(shè)計(jì)4 3.1 基本思路4 3.1.1 解決游戲區(qū)域問(wèn)題4 3.1.2 獲取圖片位置的思路4 3.1.3 網(wǎng)絡(luò)通信協(xié)議的思路5 3.1.4 其它功能的思路5 3.2 界面的設(shè)計(jì)和圖片的隨機(jī)生成5 3.2.1 界面的設(shè)計(jì)5 3.2.3 單機(jī)控件的事件觸發(fā)7 3.2.4 其它控件與功能9 3.3 圖片是否可消除的判斷10 3.3.1 兩張圖片是否相同10 3.3.2 圖片路徑的判斷12 3.4網(wǎng)絡(luò)通信與對(duì)戰(zhàn)13 3.4.1 概要13 3.4.2 讀取對(duì)家發(fā)送的數(shù)據(jù)13 3.4.3 網(wǎng)絡(luò)通信控件事件觸發(fā)16 4結(jié)果分析18 4.1 數(shù)據(jù)分析18 4.2 運(yùn)行結(jié)果分析19 4.2.1 游戲同時(shí)開始問(wèn)題19 4.2.2 游戲結(jié)束時(shí)的判斷19 5總結(jié)20 謝辭20 參考文獻(xiàn)20 1 選題背景 1.1 課題來(lái)源 網(wǎng)絡(luò)游戲起源早期電子游戲中的RPG游戲(角色扮演游戲)。RPG游戲是電子游戲中歷史最為悠久的一種,也是數(shù)量最為龐大的一種,因?yàn)镽PG游戲相對(duì)于其他類型的游戲,技術(shù)要求最低,電腦配置要求也最低,因此開發(fā)起來(lái)相對(duì)容易很多。在電子游戲發(fā)展史中,也留下了許許多多的經(jīng)典作品,像家用電視游戲機(jī)上的最終幻想系列,PC機(jī)上魔法門系列,還有中文電腦RPG游戲的經(jīng)典仙劍奇?zhèn)b傳。正是因?yàn)镽PG游戲的競(jìng)爭(zhēng)十分激烈,許多廠商開始力圖在RPG游中引入一些新鮮的因素。1997年,暴雪公司發(fā)布了DIABLO(暗黑破壞神),這其實(shí)是一款全新的游戲類型,嚴(yán)格意義上來(lái)說(shuō)這并不是一款傳統(tǒng)的RPG游戲,它更像是即時(shí)戰(zhàn)略游戲與傳統(tǒng)RPG的結(jié)合,但它又確實(shí)包含了許多傳RPG的因素在里面,最為關(guān)鍵的就是完整包括了角色的升級(jí)系統(tǒng),所以業(yè)界給這種游戲定義為ARPG(動(dòng)作角色扮演游戲)。DIABLO對(duì)游戲界的貢獻(xiàn)還不只于此,這款游戲還首創(chuàng)了戰(zhàn)網(wǎng)游戲系統(tǒng),所有正版游戲用戶都可以得到一個(gè)CDKEY,用這個(gè)CDKEY可以上到暴雪為用戶免費(fèi)開發(fā)的服務(wù)器上進(jìn)行多人游戲,這雖然有別于現(xiàn)在的網(wǎng)絡(luò)游戲,但無(wú)疑為后來(lái)的網(wǎng)絡(luò)游戲開發(fā)商提供了一個(gè)很好的思路。 隨著電腦軟硬件技術(shù)和互聯(lián)網(wǎng)的飛速發(fā)展,電腦游戲也突飛猛進(jìn),成功游戲不斷涌現(xiàn)。比較成熟的項(xiàng)目主要有:反恐精英(CS)、星際爭(zhēng)霸、魔獸爭(zhēng)霸2、FIFA2003、帝國(guó)時(shí)代、FIFA2004等等。這時(shí)也出現(xiàn)了越來(lái)越多的網(wǎng)絡(luò)小游戲,休閑類項(xiàng)目包括網(wǎng)絡(luò)圍棋、中國(guó)象棋、四國(guó)軍棋、橋牌、麻將、拱豬、斗地主、拖拉機(jī)、連連看等。 1.2 目的 網(wǎng)絡(luò)小游戲制作的目的是滿足了人們休閑的需要,在緊張工作之余休閑類的小游戲能夠給人帶來(lái)最大程度的放松,也可以增進(jìn)人們之間的交流,溝通,通過(guò)游戲還可以認(rèn)識(shí)更多的朋友,也可以到達(dá)跨省、跨市,甚至跨國(guó)間人們互相娛樂的目的。 另外也通過(guò)本程序?qū)⑷陙?lái)所學(xué)的專業(yè)知識(shí)和其他方面的知識(shí)融入到實(shí)際應(yīng)用中。 1.3 意義 通過(guò)此次課題的設(shè)計(jì),掌握如何制作一個(gè)游戲軟件,以及制作游戲軟件的整個(gè)流程,制作游戲軟件的步驟,為以后的就業(yè)工作打下基礎(chǔ)。 1.4 主要問(wèn)題 開始制作游戲時(shí),主要要解決的問(wèn)題有以下幾個(gè)方面:如何設(shè)置整個(gè)游戲的界面;如何控制連連看游戲中隨機(jī)圖片的生成且每種圖片必須為偶數(shù)個(gè);游戲開始后,判斷鼠標(biāo)兩次點(diǎn)擊的圖片能否消去,即圖片是否相同且圖片之間路徑的判斷;如何連接網(wǎng)絡(luò)上的兩臺(tái)計(jì)算機(jī)實(shí)現(xiàn)網(wǎng)絡(luò)對(duì)戰(zhàn),互發(fā)消息,如何判斷游戲是否結(jié)束以及輸贏問(wèn)題等。 1.5 技術(shù)要求 網(wǎng)絡(luò)中任意計(jì)算機(jī)當(dāng)運(yùn)行該游戲軟件是,能自己決定是當(dāng)客戶機(jī)還是服務(wù)器,如果要當(dāng)服務(wù)器,則等待客戶機(jī)的連接請(qǐng)求;如果要當(dāng)客戶機(jī),則要主動(dòng)去連接服務(wù)器。游戲中能正確判斷鼠標(biāo)兩次點(diǎn)下的圖片是否可以消去、能正確判斷游戲是否已經(jīng)結(jié)束和哪一方玩家勝出。還可順利發(fā)消息給對(duì)方和接收對(duì)方發(fā)來(lái)的消息。 1.6 發(fā)展概況 網(wǎng)絡(luò)游戲正處于加速發(fā)展周期中,中國(guó)網(wǎng)絡(luò)游戲市場(chǎng)迅速擴(kuò)大,近三年的年均增長(zhǎng)率超過(guò)100%。網(wǎng)絡(luò)游戲的告訴發(fā)展,逐漸引起了我國(guó)政府的高度重視,信息產(chǎn)業(yè)部、文化部、新聞出版總屬等相關(guān)部門都在積極推動(dòng)各項(xiàng)市場(chǎng)監(jiān)管和鼓勵(lì)網(wǎng)絡(luò)游戲產(chǎn)業(yè)發(fā)展的政策措施的出臺(tái),2003年網(wǎng)絡(luò)游戲首次被正式納入國(guó)家863計(jì)劃,標(biāo)志著我國(guó)網(wǎng)絡(luò)游戲產(chǎn)業(yè)已經(jīng)的到政府的充分重視。除外,在網(wǎng)絡(luò)游戲產(chǎn)業(yè)發(fā)展的同時(shí),有力帶動(dòng)了相關(guān)行業(yè)的發(fā)展,如軟件、計(jì)算機(jī)、通信、電信運(yùn)營(yíng)、互聯(lián)網(wǎng)等,根據(jù)統(tǒng)計(jì),網(wǎng)絡(luò)游戲能夠帶動(dòng)10倍于自身產(chǎn)值的相關(guān)行業(yè)的發(fā)展。預(yù)計(jì)未來(lái)三年,中國(guó)游戲時(shí)常規(guī)模仍將保持60%以上的告訴增長(zhǎng),至2006年市場(chǎng)規(guī)模將接近100億元,而多樣的資本運(yùn)作模式將成為網(wǎng)絡(luò)游戲產(chǎn)業(yè)發(fā)展的重要推動(dòng)力。同時(shí),手機(jī)游戲、家用游戲機(jī)、游戲傳媒、電子競(jìng)技等游戲周邊行業(yè)也將快速發(fā)展起來(lái)。 1.7 指導(dǎo)思想 按照軟件開發(fā)的總過(guò)程進(jìn)行設(shè)計(jì),經(jīng)歷定義和計(jì)劃、需求分析、軟件設(shè)計(jì)、軟件編碼、軟件測(cè)試等過(guò)程。 2 方案論證 2.1設(shè)計(jì)原理 本設(shè)計(jì)采用客戶機(jī)服務(wù)器模式,網(wǎng)絡(luò)上兩臺(tái)計(jì)算機(jī)自主決定是否當(dāng)服務(wù)器或是客戶機(jī),若一方為客戶機(jī),則另一方為服務(wù)器,當(dāng)連接上是則分別點(diǎn)擊準(zhǔn)備以待游戲的開始,游戲開始時(shí)間以后當(dāng)對(duì)戰(zhàn)雙方都準(zhǔn)備后程序自動(dòng)判定游戲開始。游戲開始后,雙方都有自己的游戲區(qū)域,互不干擾,當(dāng)一方消完全部的圖片則向?qū)Ψ桨l(fā)送游戲結(jié)束信息,并在雙方顯示相關(guān)提示信息,游戲過(guò)程中,雙方都會(huì)顯示對(duì)家和自己還剩下未消去的圖片數(shù)。 游戲規(guī)則是模仿網(wǎng)絡(luò)上普通的連連看游戲,主要是鼠標(biāo)兩次點(diǎn)擊的圖片能否消去的問(wèn)題。當(dāng)前,前提是點(diǎn)擊兩張相同的圖片,若點(diǎn)擊的是同一張圖片或者兩張不同的圖片,則不予處理。在兩張想同圖片所能連通的所有路徑中,如果存在一條轉(zhuǎn)彎點(diǎn)不多于兩個(gè)的路徑,就可以消去;如果沒有,則不予處理。 游戲過(guò)程,任意一家(假設(shè)為A方)消去圖片后必須同時(shí)向?qū)野l(fā)送已消去兩張圖片的信息。這樣對(duì)方(假設(shè)為B方)在獲取信息后即顯示A方剩余的圖片數(shù),當(dāng)A方剩余圖片數(shù)為0,而B方剩余圖片數(shù)大于0,則提示A方勝利。B方失敗的信息。 考慮到游戲娛樂性以及網(wǎng)絡(luò)游戲的交互特性。加入聊天功能,這樣交戰(zhàn)雙方可以在游戲之后或者過(guò)程中發(fā)表自己的看法與經(jīng)驗(yàn)(這也是參考了當(dāng)前網(wǎng)絡(luò)游戲的潮流來(lái)設(shè)計(jì)的)。 2.2 方案選擇 在概要設(shè)計(jì)階段,只要有兩中方案可供選擇: 一、雙方都有自己的游戲區(qū)域,互不干擾,誰(shuí)先消完全部的圖片方塊則就為勝出的一方,同時(shí)不管另一方是否已經(jīng)消完全部的圖片方塊,游戲仍然結(jié)束。 二、雙方的游戲區(qū)域相同,即共用一個(gè)游戲區(qū)域,當(dāng)一方消去兩塊圖片,則其總共消去的方塊數(shù)加2,并且對(duì)方的游戲區(qū)域中也少掉那兩塊圖片。當(dāng)所有的圖片方塊都消去后,則游戲結(jié)束,統(tǒng)計(jì)消去的圖片塊數(shù)多的一方為勝者。 在第二種方案中,雙方共用一個(gè)游戲區(qū)域,任何一放的消去方塊的動(dòng)作都要在另一方中實(shí)時(shí)的反應(yīng)出來(lái),這容易產(chǎn)生一些問(wèn)題,就比如甲方點(diǎn)下圖片下標(biāo)值為1的圖片(姑且用甲),乙方點(diǎn)下另一張圖片下標(biāo)值也為1的圖片,當(dāng)乙方想再次點(diǎn)下另一張下標(biāo)值為1的圖片時(shí),甲方已經(jīng)先于乙方點(diǎn)下那張圖片,則按規(guī)則就已經(jīng)消去了,反應(yīng)在乙方這邊的好象是乙方做了一次空操作,如此反復(fù)的話,可能會(huì)引起玩家的厭煩心在網(wǎng)絡(luò)上流行的連連看游戲或者其他的游戲都是以第一種方案為設(shè)計(jì)思想,對(duì)第二種方案設(shè)計(jì)的游戲的規(guī)則可能會(huì)不太習(xí)慣,玩起來(lái)就不能達(dá)到娛樂的目的了。所以我們放棄第二種方案的設(shè)計(jì)思想,參考網(wǎng)絡(luò)上流行的連連看的游戲規(guī)則,設(shè)計(jì)出第一種方案。 2.3 數(shù)據(jù)流圖 由于游戲包含網(wǎng)絡(luò)功能,所以將程序分為服務(wù)端程序和客戶端程序。兩種程序既有自身模塊之間數(shù)據(jù)傳送,也有與對(duì)方程序之間的數(shù)據(jù)傳送,所以就有了下面的這個(gè)數(shù)據(jù)流圖:3系統(tǒng)設(shè)計(jì) 針對(duì)上面的需求分析,我們把整個(gè)軟件分成三個(gè)模塊:1、整體界面的設(shè)計(jì)和圖片的隨機(jī)生成;2、圖片路徑判斷函數(shù);3、網(wǎng)絡(luò)通信與對(duì)戰(zhàn)。 以下就是系統(tǒng)結(jié)構(gòu)圖:(略)3.1 基本思路 3.1.1 解決游戲區(qū)域問(wèn)題 這個(gè)問(wèn)題最簡(jiǎn)單,但是卻是最花時(shí)間的。正所謂:萬(wàn)事開頭難。剛開始想了好多控件來(lái)實(shí)現(xiàn)。比如Label,Panel等等,后來(lái)在參考文獻(xiàn)中發(fā)現(xiàn)一個(gè)掃雷游戲可以通過(guò)image控件來(lái)畫圖。因此在幾天之后才解決這個(gè)最早的最簡(jiǎn)單的也是最頭疼的問(wèn)題。 3.1.2 獲取圖片位置的思路 首先,最基本的就是關(guān)于程序圖片的位置怎么獲取,以及如何控制。這里采用最常用的方法數(shù)組??紤]到圖片是多行多列的格式。所以采用二維數(shù)組(數(shù)組名為flag)的方式來(lái)控制比較直觀,并且為了程序容易解讀,統(tǒng)一在不同過(guò)程中用名為i和j的變量來(lái)分別表示行列。程序開始時(shí)給數(shù)組中的各個(gè)元素賦初值為0,即表示沒有圖片。 然后數(shù)組控制整個(gè)游戲區(qū)域,游戲區(qū)域最外圍為空白區(qū)域,即相關(guān)元素的值為0。這樣就可以保證游戲剛開始后,第二層顯示的圖片之間的相連路徑處理時(shí)就沒有阻礙了。 現(xiàn)在介紹flag數(shù)組具體控制圖片的過(guò)程,首先,由于每張圖片顯示的寬度高度為3947,所以整個(gè)控件設(shè)置為468376(包括外圍空白的兩行兩列)。而每張圖片可以用flagi,j來(lái)表示,它在image內(nèi)部的位置為x=i*39到(i+1)*39,y=j*47到(j+1)*47這樣image控件內(nèi)的一點(diǎn)M(x,y)所對(duì)應(yīng)的圖片就可以轉(zhuǎn)化為數(shù)組flagi,j的值來(lái)判斷。這個(gè)思路的具體算法可以后面的3.2.2的第二個(gè)步驟中得以體現(xiàn)。 3.1.3 網(wǎng)絡(luò)通信協(xié)議的思路 這里有一點(diǎn)非常需要解決,那就是對(duì)戰(zhàn)雙方發(fā)送的游戲狀態(tài)信息、聊天信息、用戶準(zhǔn)備信息全部是同一個(gè)方法來(lái)發(fā)送出去的,這進(jìn)接收方將無(wú)法判斷收到的信息是哪個(gè)類型的,這時(shí)通過(guò)定義發(fā)送信息的協(xié)議來(lái)完成。即在每次發(fā)送不同信息前加入一個(gè)四字符長(zhǎng)的字符串來(lái)說(shuō)明是哪種類型,接收方通過(guò)提取接收到信息前四個(gè)字符來(lái)判斷是哪種類型,然后進(jìn)行進(jìn)行相關(guān)的處理。詳細(xì)處理過(guò)程見3.4.2的內(nèi)容。 3.1.4 其它功能的思路 其它功能的思路基本上沒有什么難度也沒花多少時(shí)間去解決,因此將在后面的具體各個(gè)部分的設(shè)計(jì)過(guò)程當(dāng)中分別進(jìn)行介紹。 3.2 界面的設(shè)計(jì)和圖片的隨機(jī)生成 由于這個(gè)程序的界面并不是很復(fù)雜,所以用到的控件也不多,主要核心內(nèi)容還是后臺(tái)的代碼設(shè)計(jì)。圖片的隨機(jī)生成主要是用到一個(gè)random()函數(shù)將隨機(jī)數(shù)賦值給flag數(shù)組中的每個(gè)元素,然后根據(jù)數(shù)組元素值,來(lái)顯示圖片。(這個(gè)在3.1.2的思路中有詳細(xì)的介紹) 3.2.1 界面的設(shè)計(jì) 將整體界面分為三個(gè)大的部分,左上部分為游戲圖片顯示區(qū)域,即主區(qū)域,用IMAGE控件;右上角為命令按鈕、聊天信息框,雙方游戲狀態(tài)顯示(用到了按鈕、MEMO、EDIT、Label等控件)。下面部分則是狀態(tài)欄,顯示相關(guān)提示信息(如圖3-1)。 圖3-1 程序主體界面3.2.2 圖片的隨機(jī)生成 實(shí)現(xiàn)這個(gè)功能要分很多個(gè)步驟: 1. 程序運(yùn)行時(shí)即載入游戲需要的六張圖片。通過(guò)一個(gè)循環(huán),將命名為1-6.bmp的位圖載入到數(shù)組的各個(gè)元素。這個(gè)數(shù)組的下標(biāo)也是相應(yīng)的從標(biāo)志為1-6.這樣后面通過(guò)將flag標(biāo)志的值置為1-6判斷,該載入哪張圖片。具體載入圖片的代碼如下: for i:=1 to 6 do begin fki:=TBitmap.Create;/生成一個(gè)數(shù)組分別存放六張圖片 fki.loadfromfile(pic+inttostr(i)+.bmp); end; 2. 當(dāng)確認(rèn)游戲開始時(shí),通過(guò)畫圖過(guò)程完成圖片生成,畫圖的過(guò)程代碼如下 procedure TForm1.drawmap(); var i,j,k:integer; begin image1.Canvas.Rectangle(0,0,468,376); /初始化設(shè)置畫出一片空白區(qū)域 for i:=1 to 6 do/將給二組數(shù)組相關(guān)元素賦1-6的值,以方便畫出相應(yīng)圖 for j:=1 to 10 do begin randomize(); repeat k:=random(6)+1; /將生成隨機(jī)數(shù)加1(為了防止0生成) flagi,j:=k; /控制每個(gè)元素顯示圖片的名稱,六張圖片文件名為1-6,均是.bmp格式 samek:=samek+1; until samek1 then /ready變量是BYTE型用來(lái)判斷雙方是否已經(jīng)同時(shí)準(zhǔn)備,默認(rèn)為0,任意一家準(zhǔn)備都加1。 begin label4.Caption:=60;/游戲開始設(shè)置對(duì)家剩余圖片數(shù)為60(默認(rèn)) label5.Caption:=60;/ 游戲開始設(shè)置自己剩余圖片數(shù)為60(默認(rèn)) image1.Enabled:=true;/激活I(lǐng)MAGE控件 drawmap();/調(diào)用畫圖過(guò)程 end else statusbar.SimpleText:=正在準(zhǔn)備對(duì)家開始;/如果只有一家準(zhǔn)備,顯示提示信息。 end; 開始按鈕的過(guò)程事件的設(shè)計(jì)過(guò)程分為三個(gè)階段: 1. 游戲開始設(shè)計(jì)時(shí),這時(shí)功能最簡(jiǎn)單,只需要激活image控件與調(diào)用畫圖過(guò)程即可 2. 加入網(wǎng)絡(luò)游戲后,為了讓對(duì)家雙方明確清楚誰(shuí)贏了,加入要求用戶開始游戲之前輸入玩家名字的功能。 3. 網(wǎng)絡(luò)游戲要求雙方全都準(zhǔn)備好了才開始游戲,所以加入ready變量來(lái)判斷雙方是否已經(jīng)全部準(zhǔn)備,并向?qū)野l(fā)送已經(jīng)準(zhǔn)備的消息。(從這個(gè)功能開始,因?yàn)樾枰驅(qū)Ψ桨l(fā)送信息,且由于服務(wù)器端與客戶端發(fā)送消息的方法不同,所以遇到發(fā)送消息功能時(shí)全部通過(guò)一個(gè)新加入的類型為布爾型的變量 isserver判斷) 發(fā)送按鈕過(guò)程代碼: procedure TForm1.sendClick(Sender: TObject); var strchat:string; begin strchat:=chatedit.Text;/將輸入框的內(nèi)容存入字符串變量當(dāng)中 chatshow.Lines.Add(strchat); /聊天記錄框顯示當(dāng)前發(fā)送信息 if IsServer then/判斷當(dāng)前電腦是服務(wù)器端時(shí)發(fā)送聊天信息的方式 ServerSocket.Socket.Connections0.SendText(chat+strchat) Else/當(dāng)為客戶端時(shí)發(fā)送聊天信息的方式。 ClientSocket.Socket.SendText(chat+strchat); chatedit.Text:=;/發(fā)送完信息,清空聊天輸入框 end; 3.2.4 其它控件與功能 Label控件,用來(lái)顯示雙方對(duì)戰(zhàn)過(guò)程剩余圖片數(shù)。狀態(tài)欄控件,用來(lái)顯示游戲過(guò)程相關(guān)的提示信息。包括單機(jī)和網(wǎng)絡(luò)兩方面的提示信息 用戶幫助功能,當(dāng)用戶點(diǎn)擊幫助按鈕后,打開說(shuō)明書文件,代碼如下: ShellExecute(Handle, open, 說(shuō)明書.htm, nil, nil, SW_SHOW); 上面的代碼就是執(zhí)行Shell指令,打開名為“說(shuō)明書.htm”的文件。這里由于考慮到并不是所有的電腦都安裝有Office辦公應(yīng)用軟件,不適應(yīng)用word文檔作說(shuō)明書,且又需要說(shuō)明書界面不至于太單調(diào),所以將其保存為web頁(yè)面(幾乎能運(yùn)行本程序的所有電腦都能打開web頁(yè)面),這樣就能保證所有用戶都能正常閱讀到幫助文件。 不過(guò)使用這個(gè)函數(shù)之前,要先加ShellAPI,即在源代碼中的implementation下一行加入一行:uses shellapi; 3.3 圖片是否可消除的判斷 本模塊包括兩部分:一是判斷兩張圖片是否相同;二是路徑判斷問(wèn)題。 3.3.1 兩張圖片是否相同 這個(gè)部分功能只與一個(gè)事件相關(guān),就是image控件按下的事件。 這個(gè)事件算法,其中很重要的一點(diǎn)就是在鼠標(biāo)按下后要獲取圖片值,這個(gè)思路在前面的3.1.1有詳細(xì)介紹,另外本過(guò)程還有一個(gè)解決問(wèn)題就是,要判斷前后兩次選中的圖片是否相同,及其相應(yīng)位置(路徑判斷時(shí)需要用到)。所以用兩個(gè)變量tempi和tempj來(lái)分別存儲(chǔ)前次選中圖片的行列位置。下面是實(shí)現(xiàn)的算法代碼: procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var i,j:integer; strtemp:string; begin i:=(y div 47); j:=(x div 39); if temp=0 then begin temp:=flagi,j; tempi:=i; tempj:=j; end else begin if (temp=flagi,j) and (path(i,j,tempi,tempj) then /這里就調(diào)用了path函數(shù)來(lái)判斷,兩張相同的圖片,是否符合路徑上的要求。 begin if (i=tempi)and (j=tempj) then/if2 temp:=0 else/else2 begin temp:=0; flagi,j:=0; flagtempi,tempj:=0; gamevalue:=gamevalue-2; strtemp:=inttostr(gamevalue); label5.Caption:=inttostr(gamevalue); image1.Canvas.Rectangle(j*39,i*47,(j+1)*39,(i+1)*47); image1.Canvas.Rectangle(tempj*39,tempi*47,(tempj+1)*39,(tempi+1)*47); if IsServer then /if3 begin if gamevalue0 then ServerSocket.Socket.Connections0.SendText(picn+strtemp) else ServerSocket.Socket.Connections0.SendText(over) end else /else3 begin if gamevalue0 then ClientSocket.Socket.SendText(picn+strtemp) else ClientSocket.Socket.SendText(over); end; end; /end2 end /end1 else temp:=0;/else1 end; tempi:=tempi; tempj:=tempj; 測(cè)試變量值開始賦值 strtemp:=temp:+inttostr(temp)+chr(13); strtemp:=strtemp+flag+inttostr(i)+,+inttostr(j)+:; strtemp:=strtemp+inttostr(flagi,j)+chr(13); strtemp:=strtemp+flag+inttostr(tempi)+,+inttostr(tempj)+:; strtemp:=strtemp+inttostr(flagtempi,tempj)+chr(13); strtemp:=strtemp+x+inttostr(x)+chr(13)+y+inttostr(y); 測(cè)試變量值賦值結(jié)束 上面的內(nèi)容是在單機(jī)測(cè)試時(shí)為了觀察每次鼠標(biāo)點(diǎn)擊后相關(guān)位置圖片的值是否判斷正確,以方便調(diào)試程序用的,跟程序正常運(yùn)行并沒有直接關(guān)系。 if gamevalue0 then gameover:=false else gameover:=true; if gameover then begin /start.Enabled:=true; start.Caption:=準(zhǔn) 備; winner:=player; image1.Canvas.Rectangle(0,0,468,376); messagedlg(winner+已經(jīng)勝利,游戲結(jié)束!,mtwarning,mbyes,mbno,0); chatshow.Lines.Add(恭喜,你已經(jīng)勝利了); end; Label1.Caption:=strtemp+chr(13)+inttostr(gamevalue);/測(cè)試各個(gè)變量值 end; 3.3.2 圖片路徑的判斷 這方面的主要內(nèi)容是path函數(shù)來(lái)完成的,其返回值為布爾型,當(dāng)每次在IMAGE控件上點(diǎn)擊時(shí)判斷前后兩個(gè)圖片是否相同且路徑是否符合要求時(shí)調(diào)用,由于這第二個(gè)功能(即path函數(shù))全部是由這個(gè)游戲的合作的同學(xué)在我設(shè)計(jì)網(wǎng)絡(luò)通信模塊的同時(shí)來(lái)完成的。所以這里就不做詳細(xì)介紹了。 3.4網(wǎng)絡(luò)通信與對(duì)戰(zhàn) 3.4.1 概要 本模塊的功能比較復(fù)雜也分散。主要包括以下幾個(gè)方面:主機(jī)監(jiān)聽、客戶機(jī)連接、聊天信息發(fā)送、準(zhǔn)備信息收集、游戲結(jié)束判斷、對(duì)戰(zhàn)雙方游戲狀態(tài)信息收集。其中后面四個(gè)功能是服務(wù)器端和客戶端同時(shí)具備的功能。 3.4.2 讀取對(duì)家發(fā)送的數(shù)據(jù) 首先,服務(wù)器端ServerSocket控件使用到以下四個(gè)事件:ServerSocketAccept、ServerSocketClientConnect、ServerSocketClientConnect、ServerSocketClientRead。由于前面三個(gè)事件都是在狀態(tài)中給出相關(guān)的提示,并沒有復(fù)雜的功能。過(guò)程代碼這里就不做詳細(xì)介紹。至于服務(wù)器端的ServerSocketClientRead事件與客戶端的ClientSocketRead事件二者處理過(guò)程基本上相同,這里就以服務(wù)器端讀取信息事件來(lái)介紹。 ServerSocketClientRead過(guò)程代碼(讀取客戶端發(fā)送信息時(shí)觸發(fā)): procedure TForm1.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); var cmd:byte;/定義命令(即協(xié)議變量為BYTE型) begin cmd:=0;/初始化為0,表示沒有收到任何信息 strread:=Socket.ReceiveText;/獲取從套接字讀取的數(shù)據(jù)存入字符串變量strread strcmd:=copy(strread,0,4); -*說(shuō)明*- 由于對(duì)家每個(gè)發(fā)送的信息中的前四個(gè)字符是定義發(fā)送信息的類型(即協(xié)議)故提取將其提取出來(lái)進(jìn)行判斷。 由于不同協(xié)議通過(guò)不同的處理方式可以if條件語(yǔ)句與case語(yǔ)句兩種進(jìn)行不同的判斷,但是Case語(yǔ)句更直觀,但是Case語(yǔ)句必須是順序的數(shù)值型。故先用if語(yǔ)句將不同協(xié)議轉(zhuǎn)換為順序的數(shù)值來(lái)判斷。 -*說(shuō)明*- if strcmd=chat then cmd:=1;/聊天信息 if strcmd=over then cmd:=2;/游戲結(jié)束 if strcmd=prep then cmd:=3;/游戲預(yù)備 if strcmd=picn then cmd:=4;/游戲狀態(tài) case cmd of /通過(guò)不同case語(yǔ)句來(lái)進(jìn)行處理不同協(xié)議的內(nèi)容。 1:chatshow.Lines.Add(copy(strread,5,96); 2:/游戲結(jié)束后,顯示相關(guān)提示信息(如圖3-5) begin label4.Caption:=0; chatshow.Lines.Add(很遺憾,對(duì)家贏了!游戲結(jié)束!+chr(13); /這個(gè)提示信息可以參考圖3-5 image1.Canvas.Rectangle(0,0,468,376); -*說(shuō)明*- 由于游戲結(jié)束了,不能再對(duì)游戲進(jìn)行任何操作,所以通過(guò)調(diào)用image控件的畫矩形框程序的方法,將所有的圖片消去。 -*說(shuō)明*- messagedlg(很遺憾,對(duì)家贏了!游戲結(jié)束!,mtwarning,mbyes,mbno,0); /這個(gè)提示信息可以參考圖3-5 end; 3:/游戲開始(運(yùn)行界面如圖3-4) begin ready:=ready+1; /收到對(duì)家的游戲準(zhǔn)備請(qǐng)求,將ready值加1,當(dāng)超過(guò)2時(shí),表示雙方已經(jīng)都準(zhǔn)備好了。 if ready1 then begin label4.Caption:=60;/游戲開始后,對(duì)家的剩余圖片數(shù)默認(rèn)顯示為60 label5.Caption:=60;/游戲開始后,自己的剩余圖片數(shù)默認(rèn)顯示為60 image1.Enabled:=true;/激活image控件 drawmap();/調(diào)用畫圖程序,雙方均隨機(jī)生成開始畫面,如圖3-4 end; end; 圖3-4游戲運(yùn)行界面 4: begin /游戲過(guò)程,將收集到的對(duì)家剩余圖片數(shù)顯示出來(lái)(如圖3-4) label4.Caption:=copy(strread,5,2); -*注釋開始*- 由于前面四個(gè)字符是定義的通信協(xié)議,所以不顯示出來(lái),只提取第5個(gè)字符及后面的字符。其中的COPY的函數(shù)是整個(gè)通信協(xié)議進(jìn)行判斷的重要內(nèi)容。從以上幾個(gè)代碼就可以看出其作用的重要性。 -*注釋結(jié)束*- end; end; end; 圖3-5游戲結(jié)束3.4.3 網(wǎng)絡(luò)通信控件事件觸發(fā) 這個(gè)部分的控件有三個(gè):監(jiān)聽、連接、斷開。下面分別列出三個(gè)控件的觸發(fā)事件過(guò)程。 監(jiān)聽:這個(gè)控件要實(shí)現(xiàn)的功能就是當(dāng)一臺(tái)機(jī)器充當(dāng)服務(wù)器角色時(shí),點(diǎn)擊這個(gè)按鈕(默認(rèn)是還未當(dāng)服務(wù)器,且點(diǎn)擊后才監(jiān)聽)后就開始監(jiān)聽。如果當(dāng)前已經(jīng)處于監(jiān)聽狀態(tài),就顯示為“停止監(jiān)聽”,且按下按鈕后將停止監(jiān)聽,即斷開了客戶機(jī)連接請(qǐng)求。兩個(gè)功能的實(shí)現(xiàn)詳見下面的代碼,且相關(guān)代碼均有詳細(xì)的介紹。 procedure TForm1.listenClick(Sender: TObject); begin if listen.Caption=監(jiān) 聽 then/如果還未監(jiān)聽時(shí)處理下面事件 begin connect.Enabled:=false;/當(dāng)監(jiān)聽后就當(dāng)服務(wù)器,不用連接到別的機(jī)子,所以連接按鈕的Enabled屬性則設(shè)為false。 listen.Caption:=停止監(jiān)聽;/按鈕顯示為“停止監(jiān)聽” ServerSocket.Active := True;/激活服務(wù)器端socket控件 ClientSocket.Active := False;/ 關(guān)閉客戶端socket控件。默認(rèn)也是關(guān)閉的 statusbar.SimpleText:=當(dāng)前狀態(tài):監(jiān)聽客戶端.; isserver:=true;/變量是用來(lái)判斷當(dāng)前是否為服務(wù)器端。整個(gè)程序當(dāng)處理服務(wù)器端與客戶端不同情況都通過(guò)這個(gè)變量來(lái)判斷 end else /當(dāng)處于監(jiān)聽狀態(tài)中,按鈕顯示為“停止監(jiān)聽”,點(diǎn)擊后即停止監(jiān)聽,下面是實(shí)現(xiàn)這個(gè)功能的代碼 begin listen.Caption:=監(jiān) 聽; if ServerSocket.Active then ServerSocket.Active := False; statusbar.SimpleText:=當(dāng)前狀態(tài):停止監(jiān)聽.; end; end; 連接(運(yùn)行情況如圖3-3 連接到服務(wù)器端):這個(gè)按鈕的功能就是實(shí)現(xiàn)將當(dāng)前機(jī)器設(shè)為客戶機(jī),且向已有的服務(wù)器發(fā)送連接請(qǐng)求,同時(shí)這里用到了一個(gè)輸入框函數(shù)。獲取用戶要連接的服務(wù)器IP地址。 procedure TForm1.connectClick(Sender: TObject); begin if InputQuery(準(zhǔn)備連接到,服務(wù)器:,Server) then/彈出對(duì)話框,讓用戶輸入要連接的服務(wù)器端的IP地址 if Length(Server) 0 then begin disconnect.Enabled:=true; form1.Caption:=連連看客戶端; with ClientSocket do/通過(guò)with來(lái)設(shè)置客戶端socket控件屬性,減少代碼冗余度 begin Host := Server; Active := True; Listen.Enabled := False;/當(dāng)為客戶端時(shí)監(jiān)聽按鈕則不能用 isserver:=false;/標(biāo)志為客戶端 end; start.Enabled:=true;/連接成功后才讓準(zhǔn)備按鈕可用,防止未鏈接到服務(wù)器端就點(diǎn)擊準(zhǔn)備按鈕。 statusbar.SimpleText:=當(dāng)前狀態(tài):正在鏈接到主機(jī) +server; end; end; 斷開連接:這個(gè)按鈕事件功能算是最簡(jiǎn)單的了,當(dāng)觸發(fā)事件后,關(guān)閉與服務(wù)器端的鏈接。 procedure TForm1.disconnectClick(Sender: TObject); begin ClientSocket.Close; StatusBar.SimpleText:=客戶套接字連接已經(jīng)關(guān)閉.; end; 4結(jié)果分析 4.1 數(shù)據(jù)分析 在游戲編寫過(guò)程中,發(fā)現(xiàn)部分變量是重復(fù)用到且在不同的過(guò)程中需要共享存儲(chǔ)的數(shù)據(jù)。所以最后將這些變量(局部)轉(zhuǎn)為全局變量。下面介紹這些變量 v flag數(shù)組變量,這是一個(gè)二維數(shù)組用來(lái)存放顯示60張圖片的變量 v gameover布爾型變量,這是用來(lái)判斷游戲是否結(jié)束的變量。 v gamevalue整型變量,這是用來(lái)存放當(dāng)前剩余圖片數(shù)的變量。 v server字符串型變量,這是用來(lái)存放服務(wù)器IP地址的變量。 v isserver布爾型變量,這是用來(lái)判斷當(dāng)前機(jī)子是不是服務(wù)器,默認(rèn)值為false,當(dāng)電腦獲取客戶機(jī)的連接請(qǐng)求時(shí),設(shè)為真值。 v player字符串型變量,這是用來(lái)存放玩家名字的變量。當(dāng)游戲結(jié)束后可以將這個(gè)變量的數(shù)據(jù)一起傳送出去,告訴對(duì)方名為player的玩家獲得勝利。 v winner字符串型變量,這是用來(lái)存放勝利的玩家名字的變量。 v strcmd:BYTE型變

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論