版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、. . . . HUNANUNIVERSITY畢業(yè)設(shè)計(論文)設(shè)計論文題目:基于.Net的俄羅斯方塊游戲設(shè)計與實現(xiàn)學(xué)生:學(xué)生學(xué)號:專業(yè)班級:學(xué)院名稱:指導(dǎo)老師:學(xué)院院長:2008年5月29日34 / 40基于.Net的俄羅斯方塊游戲設(shè)計與實現(xiàn)摘 要俄羅斯方塊游戲,從俄羅斯人阿萊克斯·帕伊特諾夫在八十年代末制作成功以來,以其規(guī)則簡單,容易上手,游戲過程變化無窮,且能在娛樂中益智等特點,它已經(jīng)成為一個家喻戶曉老少皆宜的大眾游戲。我設(shè)計的這款俄羅斯方塊游戲,具有豐富的游戲操作功能,用戶可以根據(jù)自己的操作水平和喜好進行相應(yīng)的游戲操作設(shè)置,從而不僅使游戲初學(xué)者也能從中享受到成功的快樂,既便高水
2、平的玩家也能品嘗到挑戰(zhàn)的刺激。游戲還可以保存前十名高分信息,讓用戶有不斷挑戰(zhàn)新高度的樂趣。該游戲在Visual Studio2005環(huán)境中使用C#開發(fā)實現(xiàn)。C#是基于面對象的開發(fā)設(shè)計的編程語言,面向?qū)ο蟮拈_發(fā)在近年已廣為普與,成為軟件開發(fā)最基本的方法。Visual Studio2005作為當前功能最為強大的可視化集成開發(fā)環(huán)境,它不僅支持傳統(tǒng)的軟件開發(fā)方法,更重要的是它能支持可視化的開發(fā)風格。同時它還提供了相當優(yōu)秀的代碼編輯、調(diào)試、向?qū)?、編譯和可視化資源編輯等功能,這些強大的功能使它成為當今世界最好的系統(tǒng)開發(fā)工具之一。關(guān)鍵字:俄羅斯方塊,面向?qū)ο蟮拈_發(fā),集成開發(fā)環(huán)境The Design and
3、Implement of Tetris Based on .netAbstractIn the 1980s, a Russian named Alex Pajitnov designed and developed the Tetris game. After that the Tetris game has become a well-known and all ages game because of its simple roles, easy controlling and changeable gaming process.The Tetris game that I designe
4、d allows you to play the game in your own way. Players can change the configuration of controller by themselves, so not only beginners can enjoy the game, but some high level players also can challenge themselves. Besides all above, the game can save the top ten scores, and this function can inspire
5、 players to reach higher peak.The game is developed in C# with Microsoft Visual Studio 2005.C# is a programming language based on OOP. The OOP has been well-known to all these years and it has been a basic software programming method now. As the strongest IDE, the Microsoft Visual Studio 2005 suppor
6、ts classic developing method and visual developing as well. As the same time, it supplies many functions such as outstanding code editor, debugger, Wizard, compiler, visual resource editor and so on. All these strong function make this tool the best one in the world.Key words:Tetris,OOP,IDE目 錄1 緒論11
7、.1 課題背景與目的11.2 國外研究狀況11.3 課題研究方法21.4 論文構(gòu)成與研究容22 技術(shù)原理32.1 編程語言32.2 面向?qū)ο?2.3 GDI+62.4 .net Framework 2.072.5 DirectSound組件82.6 配置文件92.7 XML語言92.8 多線程103 系統(tǒng)設(shè)計123.1 系統(tǒng)設(shè)計思想123.2 運用的控件和主要對象133.3 主要實現(xiàn)的功能134 系統(tǒng)實現(xiàn)144.1 屏幕信息初始化144.2 方塊的實現(xiàn)154.3 鍵盤輸入事件處理154.4 方塊的移動184.5 方塊的變換204.6 游戲速度與自動下降214.7 滿行判斷與消行234.8 聲音
8、播放254.9 游戲結(jié)束判斷與處理254.10 游戲設(shè)置254.11 分數(shù)保存26小結(jié)27致28參考文獻29附錄A31附錄B321 緒論1.1 課題背景與目的俄羅斯方塊是一款風靡全球的電視游戲機和掌上游戲機游戲,它曾經(jīng)造成的轟動與經(jīng)濟價值可以說是游戲史上的一件大事。這款游戲最初是由聯(lián)的游戲制作人Alex Pajitnov制作的,它看似簡單但卻變化無窮,令人著迷。相信大多數(shù)人都還記得為它的規(guī)則簡單,容易上手,且游戲過程變化無窮。而在“聯(lián)眾俄羅斯方塊”中,游戲人既能感受到游戲中的樂趣,也能提供一個展現(xiàn)自己高超技藝的場所。究其歷史,俄羅斯方塊最早還是出現(xiàn)在PC機上。無數(shù)人進入游戲編程的世界都是從編寫
9、俄羅斯方塊游戲開始的,因為這是檢驗一個人對開發(fā)語言、環(huán)境和基本數(shù)據(jù)結(jié)構(gòu)知識熟練程度的便捷途徑。Microsoft Visual Studio提供了開發(fā)Window應(yīng)用程序的最迅速,最簡捷的方法。不論是Windows 應(yīng)用程序的資深專業(yè)開發(fā)人員還是初學(xué)者,Microsoft Visual Studio都為他們提供了整套的工具,以方便開發(fā)應(yīng)用程序1。本課題的目的是在實現(xiàn)俄羅斯方塊基本游戲的前提下,優(yōu)化其算法與數(shù)據(jù)結(jié)構(gòu),并增加一些傳統(tǒng)游戲中沒有的新特點,最終實現(xiàn)一款小巧精致的益智俄羅斯方塊游戲。本課題要求在.net平臺下采用C#實現(xiàn),圖形使用GDI,并增添一些傳統(tǒng)游戲未有的新特點,如在變換部件塊的方
10、位時同時改變其顏色,在游戲中可動態(tài)調(diào)整游戲的速度,在削去單行與多行時提供不同的音樂提示等。通過對本課題設(shè)計的實現(xiàn),能提高對數(shù)據(jù)結(jié)構(gòu)與算法的認識,熟悉.net開發(fā)環(huán)境的使用,并且能提高對一些組件比如winmm與DirectSound中的接口的了解。1.2 國外研究狀況俄羅斯方塊紅遍世界的各個角落,一個本來是吃大鍋飯的人在消極怠工的時候發(fā)明的娛樂工具成了造福全人類的寶貝,它的價值遠遠超越了開發(fā)時候的預(yù)想。這是一個算法實現(xiàn)比較簡單,但又樂趣無窮的游戲。課題用C#實現(xiàn),這是一種基于面向?qū)ο箝_發(fā)方法的編程語言。面向?qū)ο蟮姆绞艿饺澜缭絹碓綇娏业年P(guān)注和高度重視,針對日趨復(fù)雜的軟件需求,業(yè)界也越來越崇尚利用
11、面向?qū)ο蟮姆椒ê退枷脒M行軟件開發(fā)2。1.3 課題研究方法俄羅斯方塊誕生到現(xiàn)在已經(jīng)超過20年,無數(shù)人都曾設(shè)計并實現(xiàn)過自己的俄羅斯方塊。本課題完全按照課題要現(xiàn),在保持原有俄羅斯方塊規(guī)則不變的前提下,盡可能的提高游戲的樂趣。比如可調(diào)節(jié)的速度,可變化的顏色,多種不同的音效提示,可保存分數(shù)等等。本設(shè)計在.net平臺下采用C#實現(xiàn),圖形使用GDI。游戲區(qū)域所選擇的控件為PictureBox,而當選擇Panel或者其他控件時,重畫會有明顯的拖慢。游戲的音效與音樂用兩種不同的方式實現(xiàn),音效使用DirectSound,音樂則使用到winmm這個組件,因為在嘗試使用同一種方式同時播放兩種聲音時,出現(xiàn)了不能同時播放
12、的問題,因此用這個辦法來解決。在游戲存儲方面,對于游戲分數(shù)的記錄使用了XML文檔進行存儲,而對于用戶配置的存儲,使用到了配置文件。1.4 論文構(gòu)成與研究容第二章介紹了該設(shè)計實現(xiàn)過程中所使用到的技術(shù)原理,這些是此課題實現(xiàn)的基本理論。第三章粗略的描述了課題的設(shè)計,這其中描述了課題的功能以與對這些功能的分析等。第四章詳細描述了課題各個功能的具體設(shè)計思想與具體實現(xiàn)的過程。2 技術(shù)原理2.1 編程語言C#是一種編程語言,它是為生成在 .NET Framework 上運行的多種應(yīng)用程序而設(shè)計的。C# 簡單、功能強大、類型安全,而且是面向?qū)ο蟮?。C# 憑借它的許多創(chuàng)新,在保持 C 樣式語言的表示形式和優(yōu)美
13、的同時,實現(xiàn)了應(yīng)用程序的快速開發(fā)。Visual Studio 支持C#,這是通過功能齊全的代碼編輯器、項目模板、設(shè)計器、代碼向?qū)?、功能強大且易于使用的調(diào)試器以與其他工具實現(xiàn)的。通過 .NET Framework 類庫,可以訪問多種操作系統(tǒng)服務(wù)和其他有用的精心設(shè)計的類,這些類可顯著加快開發(fā)速度與減少開發(fā)周期4。2.2 面向?qū)ο竺嫦驅(qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計和軟件開發(fā),擴展到很寬的圍。如數(shù)據(jù)庫系統(tǒng)、交互式界面、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺、分布式系統(tǒng)、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD技術(shù)、人工智能等領(lǐng)域5。面向?qū)ο蟮幕靖拍睿?. 對象。對象是人們要進行研究的任何事物,從最簡單的整數(shù)到復(fù)雜的飛機等均可看作對象,它
14、不僅能表示具體的事物,還能表示抽象的規(guī)則、計劃或事件。2. 對象的狀態(tài)和行為。對象具有狀態(tài),一個對象用數(shù)據(jù)值來描述它的狀態(tài)。對象還有操作,用于改變對象的狀態(tài),對象與其操作就是對象的行為。對象實現(xiàn)了數(shù)據(jù)和操作的結(jié)合,使數(shù)據(jù)和操作封裝于對象的統(tǒng)一體中3. 類。具有一樣或相似性質(zhì)的對象的抽象就是類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象6。類具有屬性,它是對象的狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性。類具有操作,它是對象的行為的抽象,用操作名和實現(xiàn)該操作的方法來描述。4. 類的結(jié)構(gòu)。在客觀世界中有若干類,這些類之間有一定的結(jié)構(gòu)關(guān)系。通常有兩種主要的結(jié)構(gòu)關(guān)系,即一般-具體結(jié)構(gòu)關(guān)
15、系,整體-部分結(jié)構(gòu)關(guān)系。(1) 一般具體結(jié)構(gòu)稱為分類結(jié)構(gòu),也可以說是“或”關(guān)系,或者是“is a”關(guān)系。(2) 整體部分結(jié)構(gòu)稱為組裝結(jié)構(gòu),它們之間的關(guān)系是一種“與”關(guān)系,或者是“has a”關(guān)系。5. 消息和方法。對象之間進行通信的結(jié)構(gòu)叫做消息。在對象的操作中,當一個消息發(fā)送給某個對象時,消息包含接收對象去執(zhí)行某種操作的信息。發(fā)送一條消息至少要包括說明接受消息的對象名、發(fā)送給該對象的消息名(即對象名、方法名)。一般還要對參數(shù)加以說明,參數(shù)可以是認識該消息的對象所知道的變量名,或者是所有對象都知道的全局變量名。面向?qū)ο蟮奶卣鳎?. 對象唯一性。每個對象都有自身唯一的標識,通過這種標識,可找到相應(yīng)
16、的對象。在對象的整個生命期中,它的標識都不改變,不同的對象不能有一樣的標識。2. 分類性。分類性是指將具有一致的數(shù)據(jù)結(jié)構(gòu)(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應(yīng)用有關(guān)的重要性質(zhì),而忽略其他一些無關(guān)容。任何類的劃分都是主觀的,但必須與具體的應(yīng)用有關(guān)。3. 繼承性。繼承性是子類自動共享父類數(shù)據(jù)結(jié)構(gòu)和方法的機制,這是類之間的一種關(guān)系。在定義和實現(xiàn)一個類的時候,可以在一個已經(jīng)存在的類的基礎(chǔ)之上來進行,把這個已經(jīng)存在的類所定義的容作為自己的容,并加入若干新的容。繼承性是面向?qū)ο蟪绦蛟O(shè)計語言不同于其它語言的最重要的特點,是其他語言所沒有的。在類層次中,子類只繼承一個父類的
17、數(shù)據(jù)結(jié)構(gòu)和方法,則稱為單重繼承。在類層次中,子類繼承了多個父類的數(shù)據(jù)結(jié)構(gòu)和方法,則稱為多重繼承。在軟件開發(fā)中,類的繼承性使所建立的軟件具有開放性、可擴充性,這是信息組織與分類的行之有效的方法,它簡化了對象、類的創(chuàng)建工作量,增加了代碼的可重性。采用繼承性,提供了類的規(guī)的等級結(jié)構(gòu)。通過類的繼承關(guān)系,使公共的特性能夠共享,提高了軟件的重用性。4. 多態(tài)性(多形性)多態(tài)性使指一樣的操作或函數(shù)、過程可作用于多種類型的對象上并獲得不同的結(jié)果。不同的對象,收到同一消息可以產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱為多態(tài)性。多態(tài)性允許每個對象以適合自身的方式去響應(yīng)共同的消息7。多態(tài)性增強了軟件的靈活性和重用性。面向?qū)ο蟮囊?/p>
18、:1. 抽象。抽象是指強調(diào)實體的本質(zhì)、在的屬性。在系統(tǒng)開發(fā)中,抽象指的是在決定如何實現(xiàn)對象之前的對象的意義和行為。使用抽象可以盡可能避免過早考慮一些細節(jié)。類實現(xiàn)了對象的數(shù)據(jù)(即狀態(tài))和行為的抽象。2. 封裝性(信息隱藏)。封裝性是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ)。面向?qū)ο蟮念愂欠庋b良好的模塊,類定義將其說明(用戶可見的外部接口)與實現(xiàn)(用戶不可見的部實現(xiàn))顯式地分開,其部實現(xiàn)按其具體定義的作用域提供保護。對象是封裝的最基本單位。封裝防止了程序相互依賴性而帶來的變動影響。面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、更為有力。3. 共享性面向?qū)ο蠹夹g(shù)在不同級別上促進了共享同一類中的共享。同一類中的對
19、象有著一樣數(shù)據(jù)結(jié)構(gòu)。這些對象之間是結(jié)構(gòu)、行為特征的共享關(guān)系。在同一應(yīng)用中共享。在同一應(yīng)用的類層次結(jié)構(gòu)中,存在繼承關(guān)系的各相似子類中,存在數(shù)據(jù)結(jié)構(gòu)和行為的繼承,使各相似子類共享共同的結(jié)構(gòu)和行為。使用繼承來實現(xiàn)代碼的共享,這也是面向?qū)ο蟮闹饕獌?yōu)點之一。在不同應(yīng)用中共享。面向?qū)ο蟛粌H允許在同一應(yīng)用中共享信息,而且為未來目標的可重用設(shè)計準備了條件。通過類庫這種機制和結(jié)構(gòu)來實現(xiàn)不同應(yīng)用中的信息共享8。4. 強調(diào)對象結(jié)構(gòu)而不是程序結(jié)構(gòu)2.3 GDI+色彩鮮艷漂亮的高品質(zhì)圖像,一個個形象生動的Windows圖標,高速運動、活靈活現(xiàn)的三維動畫,這些無一不顯示出程序設(shè)計者的藝術(shù)才華。在程序設(shè)計中,圖像處理已經(jīng)成
20、為每個程序員的必修課9。在VC中編程顯示一幅位圖,下列步驟是不可缺少的: 裝入位圖、獲得位圖的大小信息、啟用設(shè)備環(huán)境、位傳輸?shù)?,所需的程序代碼一般比較冗長而且復(fù)雜。如果想將裝入的位圖另存為其他格式的圖像文件,代碼就更長了。這一切都是因為GDI本身的局限性造成的。GDI+技術(shù)使程序員不必了解每種圖像格式的具體含義,照樣可以寫出多格式圖像瀏覽或轉(zhuǎn)換程序。和傳統(tǒng)的GDI不同,GDI+中引入了對COM(組件對象模型)技術(shù)的支持,通過COM技術(shù),GDI+簡化了對圖像文件的訪問(打開、保存)。它是通過調(diào)用COM組件來實現(xiàn)的,GDI+扮演的只是指揮者,而非操作員。對于圖像文件,GDI+所關(guān)心的不是
21、圖像文件的文件頭信息,不論要打開的文件格式是什么類型,GDI+首先要做的是在注冊表中查看該圖像格式的編碼(或解碼)信息是否已經(jīng)注冊(HKEY_CLASSES_ROOTMIMEDatabaseContent Type)。如果已經(jīng)注冊,就通過該編碼信息調(diào)用COM組件,就這么簡單。有了GDI+之后,只需簡單地創(chuàng)建一個圖形對象(Graphics object),然后直接調(diào)用該對象的方法(methods)進行繪圖即可。圖形對象是GDI+中的核心,正如DC之于GDI那樣。圖形對象和DC有許多相似的地方,在使用上遵循著一樣的使用規(guī)則,但是兩者在本質(zhì)上已經(jīng)有很大的區(qū)別10。一個是基于句柄的
22、GDI,一個是基于組件對象模型的GDI+。使用GDI+的SDK編程,必須按照下面的規(guī)來進行:使用GDI+的命名空間(namespace Gdiplus),在使用GDI+函數(shù)時必須進行GDI+的初始化,使用完畢要銷毀GDI+。2.4 .net Framework 2.0.net Framework是一個可以用來快速開發(fā)、部署服務(wù)與應(yīng)用程序的開發(fā)平臺。這個架構(gòu)是兩個項目的結(jié)果:第一個項目的目的是用來改善Windows 作業(yè)平臺上的程序開發(fā),特別是改善COM(Component Object Model,組件對象模塊。一種微軟所制定的軟件技術(shù);讓對象的功能可以被其它軟件所叫用,可以讓組件重
23、復(fù)使用、容易更新與維護);第二個項目則是制作一個以發(fā)展服務(wù)(Service)軟件為目標的開發(fā)平臺。這兩個項目團隊三年多前就已經(jīng)在一起工作,他們希望可以發(fā)展出一種可以快速開發(fā)出以因特網(wǎng)為基礎(chǔ),而且易學(xué)易用的開發(fā)平臺。.netFramework 具有兩個主要組件:公共語言運行庫和.net Framework 類庫11。公共語言運行庫是.net Framework 的基礎(chǔ)。您可以將公共語言運行庫看作一個在執(zhí)行時管理代碼的代理,它提供存管理、線程管理和遠程處理等核心服務(wù),并且還強制實施嚴格的類型安全以與可提高安全性和可靠性的其他形式的代碼準確性。這類似于Java的虛擬機。事實上,代碼管理的概念是公共語
24、言運行庫的基本原則。以公共語言運行庫為目標的代碼稱為托管代碼,而不以公共語言運行庫為目標的代碼稱為非托管代碼。.net Framework 的另一個主要組件是類庫,它是一個綜合性的面向?qū)ο蟮目芍赜妙愋图?,您可以使用它開發(fā)多種應(yīng)用程序,這些應(yīng)用程序包括傳統(tǒng)的命令行或圖形用戶界面 (GUI) 應(yīng)用程序,也包括基于 ASP.net 所提供的最新創(chuàng)新的應(yīng)用程序(如 Web 窗體和 XML Web services)12。.net Framework 旨在實現(xiàn)下列目標:提供一個一致的面向?qū)ο蟮木幊汰h(huán)境,而無論對象代碼是在本地存儲和執(zhí)行,還是在本地執(zhí)行但在 Internet 上分布,或者是在遠程執(zhí)行的。
25、提供一個將軟件部署和版本控制沖突最小化的代碼執(zhí)行環(huán)境。提供一個可提高代碼(包括由未知的或不完全受信任的第三方創(chuàng)建的代碼)執(zhí)行安全性的代碼執(zhí)行環(huán)境。提供一個可消除腳本環(huán)境或解釋環(huán)境的性能問題的代碼執(zhí)行環(huán)境。使開發(fā)人員的經(jīng)驗在面對類型大不一樣的應(yīng)用程序(如基于 Windows 的應(yīng)用程序和基于 Web 的應(yīng)用程序)時保持一致。按照工業(yè)標準生成所有通信,以確?;?net Framework 的代碼可與任何其他代碼集成。2.5 DirectSound組件DirectSound是DirectX API的音頻組件之一,它可以提供快速的混音、硬件加速功能,并且可以直接訪問相關(guān)設(shè)備,當然,最主要的是它提供的
26、功能與現(xiàn)有的設(shè)備驅(qū)動程序保持兼容性13。DirectSound允許進行波型聲音的捕獲、重放,也可以通過控制硬件和相應(yīng)的驅(qū)動來獲得更多的服務(wù)。DirectSound的優(yōu)勢當然和DirectX的其它組件一樣速度,它允許你最大效率的使用硬件,并擁有良好的兼容性。使用DirectSound可以做到什么呢?1、很方便的了解硬件能力,并且根據(jù)當前計算機硬件配置硬件來決定最好的解決問題的方法。2、彌補驅(qū)動程序的不足通過屬性設(shè)置以便硬件能力可以完全發(fā)揮,即便是驅(qū)動程序沒有很好的支持該功能。3、短傳輸延遲時間的混音為了快速的響應(yīng)流。4、3-D聲音5、聲音的捕獲DirectSound播放音頻文件開發(fā)的基本流程:第
27、一步,創(chuàng)建一個設(shè)備對象,設(shè)置設(shè)備對象的協(xié)作度。 第二步,創(chuàng)建一個輔助Buffer,也叫后備緩沖區(qū)。第三步,獲取PCM類型的數(shù)據(jù)。第四步,將數(shù)據(jù)讀取到緩沖區(qū)。第五步,播放緩沖區(qū)中的數(shù)據(jù)。2.6 配置文件在應(yīng)用系統(tǒng)開發(fā)時,管理配置是必不可少的。例如數(shù)據(jù)庫服務(wù)器的配置、安裝和更新配置等等14。傳統(tǒng)的配置文件ini已有被xml文件逐步代替的趨勢,但對于簡單的配置,ini文件還是有用武之地的。ini文件其實就是一個文本文件,它有固定的格式,節(jié)Section的名字用括起來,然后換行說明key的值:sectionkey=value2.7 XML語言擴展標記語言XML是一種簡單的數(shù)據(jù)存儲語言,使用一系列簡單的
28、標記描述數(shù)據(jù),而這些標記可以用方便的方式建立,雖然XML占用的空間比二進制數(shù)據(jù)要占用更多的空間,但XML極其簡單易于掌握和使用15。XML與Access,Oracle和SQL Server等數(shù)據(jù)庫不同,數(shù)據(jù)庫提供了更強有力的數(shù)據(jù)存儲和分析能力,例如:數(shù)據(jù)索引、排序、查找、相關(guān)一致性等,XML僅僅是展示數(shù)據(jù)。事實上XML與其他數(shù)據(jù)表現(xiàn)形式最大的不同是:他極其簡單。這是一個看上去有點瑣細的優(yōu)點,但正是這點使XML與眾不同。 XML的簡單使其易于在任何應(yīng)用程序中讀寫數(shù)據(jù),這使XML很快成為數(shù)據(jù)交換的唯一公共語言,雖然不同的應(yīng)用軟件也支持其它的數(shù)據(jù)交換格式,但不久之后他們都將支持XML,那就意味著程序
29、可以更容易的與Windows、Mac OS, Linux以與其他平臺下產(chǎn)生的信息結(jié)合,然后可以很容易加載XML數(shù)據(jù)到程序中并分析他,并以XML格式輸出結(jié)果。XML(可擴展標記語言)是從稱為SGML(標準通用標記語言)的更加古老的語言派生出來的。SGML的主要目的是定義使用標簽來表示數(shù)據(jù)的標記語言的語法。標簽由包圍在一個小于號(<)和一個大于號(>)之間的文本組成,例如<tag>。起始標簽(start tag)表示一個特定區(qū)域的開始,例如<start>;結(jié)束標簽(end tag)定義了一個區(qū)域的結(jié)束,除了在小于號之后緊跟著一個斜線(/)外,和起始標簽基本一樣,
30、例如</end>。SGML還定義了標簽的特性(attribute),它們是定義在小于號和大于號之間的值,例如<img src="picture.jpg">中的src特性。如果你覺得它看起來很熟悉的話,應(yīng)該知道,基于SGML的語言的最著名實現(xiàn)就是原始的HTML。在XML中,采用了如下的語法:1. 任何的起始標簽都必須有一個結(jié)束標簽。2. 可以采用另一種簡化語法,可以在一個標簽中同時表示起始和結(jié)束標簽。這種語法是在大于符號之前緊跟一個斜線(/),例如<tag />。XML解析器會將其翻譯成<tag></tag>。3.
31、標簽必須按合適的順序進行嵌套,所以結(jié)束標簽必須按鏡像順序匹配起始標簽,例如<b>this is a <i>sample</i> string</b>。這好比是將起始和結(jié)束標簽看作是數(shù)學(xué)中的左右括號:在沒有關(guān)閉所有的部括號之前,是不能關(guān)閉外面的括號的。4. 所有的特性都必須有值。5. 所有的特性都必須在值的周圍加上雙引號。如今,XML已經(jīng)是世界上發(fā)展最快的技術(shù)之一。它的主要目的是使用文本以結(jié)構(gòu)化的方式來表示數(shù)據(jù)。在某些方面,XML文件也類似于數(shù)據(jù)庫,提供數(shù)據(jù)的結(jié)構(gòu)化視圖16。2.8 多線程每個正在系統(tǒng)上運行的程序都是一個進程。每個進程包含一到多個線
32、程。進程也可能是整個程序或者是部分程序的動態(tài)執(zhí)行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執(zhí)行17。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負責多個線程的調(diào)度和執(zhí)行。多線程是為了使得多個線程并行的工作以完成多項任務(wù),以提高系統(tǒng)的效率。線程是在同一時間需要完成多項任務(wù)的時候被實現(xiàn)的。多線程是這樣一種機制,它允許在程序中并發(fā)執(zhí)行多個指令流,每個指令流都稱為一個線程,彼此間互相獨立18。線程又稱為輕量級進程,它和進程一樣擁有獨立的執(zhí)行控制,由操作系統(tǒng)負責調(diào)度,區(qū)別在于線程沒有獨立的存儲空間,而是和所屬進程中的其它
33、線程共享一個存儲空間,這使得線程間的通信遠較進程簡單。多個線程的執(zhí)行是并發(fā)的,也就是在邏輯上“同時”,而不管是否是物理上的“同時”19。如果系統(tǒng)只有一個CPU,那么真正的“同時”是不可能的,但是由于CPU的速度非???,用戶感覺不到其中的區(qū)別,因此我們也不用關(guān)心它,只需要設(shè)想各個線程是同時執(zhí)行即可。多線程和傳統(tǒng)的單線程在程序設(shè)計上最大的區(qū)別在于,由于各個線程的控制流彼此獨立,使得各個線程之間的代碼是亂序執(zhí)行的,由此將帶來的線程調(diào)度,同步等問題20。使用線程的好處有以下幾點:使用線程可以把占據(jù)長時間的程序中的任務(wù)放到后臺去處理。用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發(fā)某些事件的處理
34、,可以彈出一個進度條來顯示處理的進度。程序的運行速度可能加快。在一些等待的任務(wù)實現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下我們可以釋放一些珍貴的資源如存占用等等。3 系統(tǒng)設(shè)計3.1 系統(tǒng)設(shè)計思想游戲是用來給大家娛樂的,所以要能在使用的過程中給大家?guī)砜鞓?,消除大家的疲勞,所以在游戲中添加了漂亮的場景和動聽的音樂,設(shè)置了過關(guān)升級的功能,激發(fā)大家的娛樂激情。 從游戲的基本玩法出發(fā),主要就是俄羅斯方塊的形狀和旋轉(zhuǎn),在設(shè)計中在一個圖片框中構(gòu)造了一個30*30(像素)的小塊,由這些小塊組合成新的形狀,每四個小塊連接在一起就可以構(gòu)造出一種造型,總共設(shè)計了7中造型,每種造型又可
35、以通過旋轉(zhuǎn)而變化出2到4種形狀,在游戲窗體中用戶就可以使用鍵盤的方向鍵來控制方塊的運動,然后對每一行進行判斷,如果有某行的方塊是滿的,則消除這行的方塊,并且使上面的方塊自由下落,其中,方塊向下的速度是有時鐘控件控制的,在游戲中,用戶也可以使用向下鍵加快下落速度,定義一個變量,對消除的函數(shù)進行記錄,最后就可以得出用戶的分數(shù),用if 語句對分數(shù)判斷,達到一定的積分就可以升級到下一個檔次。 俄羅斯方塊游戲設(shè)計主要包括以下10個方面:1. 游戲界面的設(shè)計。2. 俄羅斯方塊的實現(xiàn)。3. 鍵盤輸入信息的獲取。4. 俄羅斯方塊的移動(向左,向右和向下)。5. 俄羅斯方塊的變換。6. 方塊自動下落與速度的選擇
36、。7. 慢行的判斷與消行。 8. 游戲得分的計算。 9. 游戲結(jié)束判斷。10. 背景音樂與音效。 11. 用戶配置保存。12. 得分保存。3.2 運用的控件和主要對象在設(shè)計過程中主要用到的控件有:PictureBox控件,MenuStrip控件,Button控件,Label控件,Timer控件,winmm組件,DirectSound等等。 3.3 主要實現(xiàn)的功能我們開發(fā)的俄羅斯方塊游戲,主要實現(xiàn)了以下幾種功能: 1. 可以靈活控制方塊在圖形框中運動。2. 游戲過程中方塊可以自由旋轉(zhuǎn)。3. 旋轉(zhuǎn)方塊同時變化方塊顏色。4.在游戲過程中可以自由調(diào)整游戲速度。5. 當某一行的方塊排列滿時,將自動將這一
37、行方塊消除,然后將上面所有方塊向下移動,可以同時消多行。 6. 游戲的得分支持積分,并且按照公式:得分 = 5+ 10 * (同時消除的行數(shù)-1) 這樣,你同一時間消除的行數(shù)越多,你的得分也就越高,當游戲積分到了一定時可以自動升級,這個升級指速度升級。7. 游戲中提供了動聽的音樂。8.不同的用戶對于鍵位有不同的要求,所以提供了配置保存的功能。這樣就不需要每次游戲都重新配置。9.保存前十高的分數(shù)。4 系統(tǒng)實現(xiàn)4.1 屏幕信息初始化用來顯示狀態(tài)信息的框private System.Windows.Forms.GroupBox statusBox;開始按鈕private System.Windows
38、.Forms.Button btnStart;顯示“下一塊”的標簽private System.Windows.Forms.Label label3;顯示“分數(shù)”的標簽private System.Windows.Forms.Label label2;顯示“等級”的標簽private System.Windows.Forms.Label label1;用來畫下一塊方塊的區(qū)域private System.Windows.Forms.PictureBox panel1;游戲區(qū)域private System.Windows.Forms.PictureBox gameArea;菜單與許多菜單項的實現(xiàn)不
39、一一列舉,最終的的效果如下圖:圖 4.14.2 方塊的實現(xiàn)在程序中每一個方塊都是一個Block類的實例。Block包括的參數(shù)有方塊的寬度,高度,最左端橫坐標,最上端縱坐標,方塊的數(shù)組表示。其中一共有7中形狀的方塊,以數(shù)組表示為: 11 11 1 11 010 10 01 01 10 1 11 111 11 11 01 10 1 01 10 1方塊的7種形狀分別以數(shù)字0-6來代表,在構(gòu)造函數(shù)中,隨機生成0-6中數(shù)字,以此來隨機生成方塊的形狀。用來在界面上顯示方塊的貼圖也以0-6的數(shù)字來代表,同樣以隨機數(shù)的形式來隨機的現(xiàn)實方塊的顏色。4.3 鍵盤輸入事件處理因為在界面上有一個按鈕,并且只有一個按鈕
40、,所以該按鈕在通常情況下都是默認為焦點。在這種情況下按下某些鍵,比如空格,就會產(chǎn)生出發(fā)按鈕事件的情況。因此必須重載整個WinForm的ProcessCmdKey來避免這樣的問題。當按向左,向右與旋轉(zhuǎn)按鈕時,只要相應(yīng)的處理方塊的位置或者形狀即可,但是當按向下或者立即下落時,怎需要不同的處理。向下移動時,如果移動到最底部但還未固定,則需要重新設(shè)置計時器間隔時間,從而使自動下落時,底部未固定的方塊到固定的時間一樣。如果方塊在最底部而未固定的時候,向下移動,則立即固定。這兩種情況,當方塊固定后,都需要判斷是否消行,并且重新處理分數(shù)和游戲等級與其顯示,如果方塊固定后導(dǎo)致游戲結(jié)束,則需要判斷當前游戲分數(shù)是
41、否進入排名,如果進入排名則需要進入系那個應(yīng)的游戲分數(shù)記錄處理。立即下落時,首先需要判斷是否消行,然后重新處理分數(shù)與登記與其現(xiàn)實。如果該方塊立即下落后導(dǎo)致游戲結(jié)束,則需要判斷當前游戲分數(shù)是否進入排名,如果進入排名則需要進入相應(yīng)的游戲分數(shù)記錄處理。具體實現(xiàn)如下:protected override bool ProcessCmdKey(ref Message msg, Keys keyData) if (游戲正在運行) if (游戲設(shè)置的向左按鈕等于鍵盤按下的按鍵) if (音效打開)播放聲音;方塊向左移動;重畫游戲區(qū)域; else if (游戲設(shè)置的向右按鈕等于鍵盤按下的按鍵) if (音效打開
42、)播放聲音;方塊向右移動;重畫游戲區(qū)域; else if(游戲設(shè)置的向下按鈕等于鍵盤按下的按鍵) if (音效打開)播放聲音;停止自動下落的計時器; if (方塊向下移動后固定) 重新設(shè)置自動下落計時器的時間間隔;重新顯示分數(shù)與等級; else if (方塊可以繼續(xù)下移,表示方塊在底部卻未固定)設(shè)置計時器間隔為當前間隔; else 設(shè)置計時器間隔為400毫秒; 重畫游戲區(qū)域;重畫顯示下一塊圖形的區(qū)域; if (游戲結(jié)束) 判斷是否進排名并保存; 游戲結(jié)束處理; else 啟動自動下落計時器; else if(游戲設(shè)置的旋轉(zhuǎn)按鈕等于鍵盤按下的按鍵) if (音效打開)播放聲音;處理旋轉(zhuǎn)方塊;重畫
43、游戲區(qū)域; else if (游戲設(shè)置的立即落下按鈕等于鍵盤按下的按鍵) if (音效打開)播放聲音;停止自動下落計時器;處理立即落下方塊;重新設(shè)置自動下落計時器間隔時間;重新顯示分數(shù);重畫游戲區(qū)域;重畫顯示下一塊圖形的區(qū)域; if (游戲結(jié)束) 判斷是否進排名并保存; 游戲結(jié)束處理; else 啟動自動下落計時器; return true; 4.4 方塊的移動游戲中方塊的移動分為向左移動,向右移動,向下移動和立即落下。向左移動:bool MoveLeft() bool touchLeft = false; if (方塊最左端的位置在游戲區(qū)域最左) touchLeft = true; else
44、 if(方塊中任意一小塊的左邊在游戲區(qū)域中相應(yīng)位置中存在固定的方塊) touchLeft = true; if(可以向左移動)設(shè)置方塊的位置向左移動; return touchLeft; 向右移動:bool MoveRight() bool touchRight = false; if (方塊最左端的位置在游戲區(qū)域最右減圖形的寬) touchRight = true; else if(方塊中任意一小塊的右邊邊在游戲區(qū)域中相應(yīng)位置中存在固定的方塊) touchRight = true; if(可以向右移動)設(shè)置方塊的位置向右移動; return touchRight; 向下移動:MoveDown
45、() bool touchButtom = false; if (當前方塊不為) if (可以下落) touchButtom = false; else touchButtom = true; if (已經(jīng)到底)設(shè)置當前方塊為固定;判斷是否消行;判斷游戲結(jié)束; if (游戲未結(jié)束)構(gòu)造當前方塊與下一塊方塊; else釋放方塊 else方塊下移; return touchButtom; 立即下落:void SuddenMoveDown() /循環(huán)調(diào)用下移處理,直至無法下移 while (MoveDown() != true); 4.5 方塊的變換方塊的變化主要在于如何判斷當前方塊周圍的環(huán)境是否允
46、許該方塊旋轉(zhuǎn)。在這個程序中,我是用的方法如下:首先無論該方塊是否能旋轉(zhuǎn),先將旋轉(zhuǎn)后的方塊保存在一個臨時的數(shù)組中,在結(jié)合旋轉(zhuǎn)后方塊的屬性,比如寬度,高度,與旋轉(zhuǎn)后方塊周圍環(huán)境進行比較,如果旋轉(zhuǎn)后方塊的每一小塊,都與環(huán)境中固定的方塊沒有沖突,即不重疊,則認定該方塊可以旋轉(zhuǎn)。在程序中具體實現(xiàn)如下:void RotateBlock() bool canRotate = true; if (旋轉(zhuǎn)后會超出游戲區(qū)域) canRotate = false; if (canRotate = true) 定義并存放旋轉(zhuǎn)后方塊的數(shù)組; for (int i = 0; i < this.currentBlock
47、.BlockWidth; i+) for (int j = 0; j < this.currentBlock.BlockHeight; j+) if(與游戲區(qū)域的固定方塊有沖突)canRotate =false; if(canRotate = true )處理方塊旋轉(zhuǎn); 4.6 游戲速度與自動下降游戲速度與方塊自動下降的計時器有關(guān),計時器的間隔越小則游戲速度越快,間隔越大則游戲速度越慢。在游戲中,游戲等級對應(yīng)著游戲速度,等級越高游戲速度就越快。在程序中,間隔時間和游戲等級有著如下的關(guān)系:interval = basicInterval - 65 * (gameLevel - 1),其中i
48、nterval為當前間隔時間,basicInterval為標準間隔時間,即游戲等級為1時的間隔時間,為750毫秒,gameLevel為游戲等級。游戲等級隨著游戲分數(shù)的增長而增長,程序中以每200分增加一級游戲等級,10級為滿級,即游戲等級到了10級后無法再增長。并且游戲等級在開始游戲時甚至在游戲中都可以隨時進行調(diào)節(jié)來滿足不同的需要。對于自動下降,要使用另外一個線程來控制,否則在處理自動下降的同時,一切鍵盤對于游戲的輸入將無法與時處理。這邊使用到了Timers來實現(xiàn)。在主線程中必須先執(zhí)行tmrTimer.Elapsed += new ElapsedEventHandler(OnTimer),來聲明自動執(zhí)行所調(diào)用的方法自動下降的具體實現(xiàn)如下:private void OnTimer(object sender, ElapsedEventArgs e) if (游戲正在進行中) 停止計時;設(shè)置間隔時間; if (方塊下移后固定) 設(shè)置間隔時間;/線
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度北京信托資金借款合同范本與信托風險預(yù)警機制2篇
- 2025年魯教版必修1地理下冊月考試卷
- 2024幼兒園教職工派遣與保育員服務(wù)合同3篇
- 2025年華師大版必修1英語下冊階段測試試卷
- 小學(xué)生綜合素質(zhì)評價中動植物知識掌握情況的調(diào)查分析
- 小學(xué)創(chuàng)新教育實踐從理論到實踐的完整課程設(shè)計
- 二零二五年度特色餐飲廚師勞務(wù)輸出合同3篇
- 2025年度紗窗定制設(shè)計與生產(chǎn)售后服務(wù)合同3篇
- 家居智能系統(tǒng)對商業(yè)領(lǐng)域的影響分析
- 2024版供方環(huán)境保護協(xié)議書正規(guī)范本
- 2019北師大版高中英語選擇性必修三單詞表
- 森林撫育投標方案
- 電工作業(yè)崗位風險告知卡
- 腫瘤科工作制度
- GB/T 4795-2023船用艙底水處理裝置
- 特種設(shè)備作業(yè)人員考核申請表(樣表)
- 融合心理健康教育的教學(xué)設(shè)計(八年級數(shù)學(xué)下冊蘇科版教案)
- 企業(yè)實際控制人的協(xié)議書
- 七年級英語完形填空、閱讀理解題庫100題含參考答案
- 2022年貴州省貴陽市新區(qū)第一實驗中學(xué)高一地理上學(xué)期期末試卷含解析
- 集團企業(yè)有效管控子公司的方法與手段
評論
0/150
提交評論