1、俄罗斯方块.NET俄羅斯方塊設計一、概述俄羅斯方塊是一款風靡全球的電視遊戲機和掌上游戲機遊戲,它曾經造成的轟動與造成的經濟價值可以說是遊戲史上的一件大事。這款遊戲最初是由蘇聯的遊戲製作人Alex Pajitnov製作的,它看似簡單但卻變化無窮,令人上癮。相信大多數用戶都還記得為它癡迷得茶不思飯不想的那個俄羅斯方塊時代。究其歷史,俄羅斯方塊最早還是出現在PC機上,而我國的用戶都是通過紅白機瞭解、喜歡上它的。現在又重新掀起這股讓人沉迷的俄羅斯方塊風潮,它的規則簡單,容易上手,且遊戲過程變化無窮,使用戶既能感受到遊戲中的樂趣,也給用戶提供了一個展現自己高超技藝的場所。俄羅斯方塊是個老幼皆宜的小遊戲,
2、在遊戲設計界就好比高深武功的入門起手式。無數人進入遊戲編程的世界都是從編寫俄羅斯方塊遊戲開始的,因為這既是一個檢驗RAD開發工具的好方法,也是檢驗一個人對開發語言、環境和基本數據結構知識熟練程度的便捷途徑。這次練習的是在.NET平臺上生成俄羅斯方塊遊戲。當完成時,覺得自己在不知不覺中已跨入了它的大門。使用.NET幾乎可以做出一切東西來,從即時戰略到三維RPG遊戲。當然還有各種應用軟體了。如果要開發出更複雜的遊戲,就還需要學習更多的東西,為了提高顯示速度,需要使用DirectX,為了製作3D圖像,又要使用Direct3D。由於遊戲的流程和內部原理很複雜,所以需要學習數據結構、圖形學、操作系統 學
3、習這麼多專業知識需要很大的努力,不過我心中有一個夢想,那麼再難的目標也能實現。“千里之行,始於足下”,尤其是在邁出了俄羅斯方塊的第一步之後,實際上,已經走進了軟體開發,尤其是遊戲開發的大門,前面的世界是美麗多彩而又充滿挑戰的。1.1 技術背景 隨著電腦應用的不斷深入和擴展,電腦技術也在急速發展。為了適應開發各種不同用途軟體的需要,在過去的幾十年中,人們已經構建了1000多種程式設計語言,程式設計思想、軟體開發工具都發生了巨大的變革。 C#是微軟公司在2000年7月發佈的一種全新的簡單、安全、面向對象的程式設計語言,它充分吸收了過去幾十年電腦科學發展的經驗教訓,從C#的身上可以受到很多C+、Vi
4、sual Basic、Delphi、Java等語言的優點,其目標是將Visual Basic的高效率同C+原有的強大功能充分地結合在一起,為未來幾十年的程式設計提供一個優良的利器。可以預見,C#在對語言作出了革命性的更新後,依託.NET框架的支撐,必將成為未來幾十年中應用程式開發的首選工具。而俄羅斯方塊這款小遊戲,誕生至今已有20餘年的歷史。遊戲操作簡單、可玩性強是它之所以在20餘年中經久不衰的秘訣。在其誕生的20餘年中,不斷有人通過各種組合語言對其進行完善,它的身影出現在所有的遊戲平臺上。但其根本遊戲方式至今未變。而在國內,其對戰網路版早已風靡全國,足可見其魅力之大。本課題將利用C#編寫俄羅
5、斯方塊小遊戲,盡可能的利用簡單的代碼編寫出一款簡單耐玩的小遊戲。當今社會是一個多元化的資訊化社會,人們在享受物質上所帶來的便利的同時,也要承受巨大的工作、生活壓力。所以,人們想出了各式各樣的方法來減輕自己的壓力,因此,PC小遊戲才得以發展壯大。而這其中,俄羅斯方塊更是所有小遊戲中的經典之作,利用C#的優勢,重新編寫俄羅斯方塊,完善它的功能同時,也可以提高自己的編程水準。二、程式設計2.1 程式設計思想 遊戲是用來給大家娛樂的,所以要能在使用的過程中給大家帶來快樂,消除大家的疲勞,所以我們在遊戲的設置中添加了改變色彩的功能。從遊戲的基本玩法出發,主要就是俄羅斯方塊的形狀和旋轉,我們在設計中在一個
6、圖片框中構造了俄羅斯方塊遊戲中的方塊,每個方塊可以通過旋轉而變化出2到4種形狀,通過圖片的變換來實現方塊的變形,所以遊戲中一共製作了7張圖片。利用隨機函數在一個欲覽窗體中提前展示形狀供用戶參考,然後將展示的形狀複製到遊戲窗體中進行擺放,在遊戲窗體中用戶就可以使用鍵盤的方向鍵來控制方塊的運動,然後利用遞歸語句對每一行進行判斷,如果有某行的方塊是滿的,則消除這行的方塊,並且使上面的方塊自由下落,其中,方塊向下的速度是有時鐘控件控制的,在遊戲中,用戶也可以使用空格鍵加快下落速度,定義一個變數,對消除的函數進行記錄。但遊戲只是用來緩解大家學習工作的疲勞,為了避免上癮,本遊戲並未設置積分計算和遊戲排名。
7、由於水準有限,本俄羅斯方塊遊戲設計的主要步驟為以下6個方面: (1)遊戲介面的設計。 (2)俄羅斯方塊的造型。 (3)俄羅斯方塊的旋轉。 (4)俄羅斯方塊的運動情況(包括向左,向右和向下)。 (5)俄羅斯方塊的自動消行功能。(6)遊戲菜單選項的設計及功能實現。2.2. 運用的控件和主要對象 在設計過程中主要用到的控件有:command控件,image控件,picture控件,label控件,timer控件,text控件,DirectX控件等等。 2.3 主要實現的功能 在開發的俄羅斯方塊遊戲,主要實現了以下幾種功能: 1.可以靈活控制方塊在圖形框中運動。 2.遊戲過程中方塊可以自由旋轉。 3.
8、當某一行的方塊排列滿時,將自動將這一行方塊消除,然後將上面所有方塊向下移動,可以支持連續消行。2.4系統性能需求操作簡單:本遊戲操作十分簡單,且易上手。整個遊戲過程中只需要5個功能鍵,即向上、向下、向左、向右以及空格鍵即可。技術先進:產品的系統設計和開發應緊跟著整個電腦發展潮流,採用當時最先進的設計思想,利用最新的開發技術和開發工具。使系統能夠無論在功能設計上,還是在技術實現上,都處於同行業的領先地位。安裝使用簡便:考慮到本遊戲的休閒性質,其具有無需安裝,無需修改註冊表,體積小等特點。適應性:應該能廣泛應用於任何裝有Framwork的操作系統,且本遊戲在不同的硬體環境下都能得以應用。 代碼可讀
9、性好:文中的代碼將盡可能簡潔,易懂。2.5遊戲介面模組設計介紹遊戲介面模組,即本程式的主窗體。遊戲的進行在此窗體內實現。主要由主窗體、副窗體和功能區構成。主窗體為遊戲實現區,遊戲在此窗體內進行;副窗體為方塊預覽,顯示下一個即將出現的方塊;功能區則顯示遊戲進行時用戶所得分數、遊戲即時等級以及玩家所消行數。另外,該模組還負責遊戲的功能控制等。三、總結由於時間倉促,而且個人水準有限,沒有製作出俄羅斯方塊的沒有積分系統,沒有難易程度的設置等等。而且本俄羅斯方塊還有許多瑕疵,沒有沒檢查出來。本程式借鑒於網路上的關於製作俄羅斯方塊的視頻。故有很多還不完善和不懂得地方。但希望通過此次程式設計,能提高自我的編
10、程能力。四、參考文獻參考視頻網址:附、俄羅斯方塊的部分根源程式1、從xml檔讀取有關磚塊的資訊public void LoadFromXmlFile() /从xml读取信息 XmlTextReader reader; if (File.Exists(BlockSet.xml) /优先读取外部BlockSet.xml文件并把信息写入blockInfo内 reader = new XmlTextReader(BlockSet.xml); else /如果BlockSet.xml文件不存在,则从嵌入资源内读取BlockSet.xml Assembly asm = Assembly.GetExecut
11、ingAssembly(); Stream sm = asm.GetManifestResourceStream(Tetris.BlockSet.xml); reader = new XmlTextReader(sm); string key = ; try #region try的内容 while (reader.Read() if (reader.NodeType = XmlNodeType.Element) if (reader.Name = ID) key = reader.ReadElementString().Trim(); info.Add(key, ); else if (re
12、ader.Name = Color) infokey = reader.ReadElementString().Trim(); else if (reader.Name = DownKey) _downKey = (Keys)Convert.ToInt32(reader.ReadElementString().Trim(); else if (reader.Name = DropKey) _dropKey = (Keys)Convert.ToInt32(reader.ReadElementString().Trim(); else if (reader.Name = MoveLeftKey)
13、_moveLeftKey = (Keys)Convert.ToInt32(reader.ReadElementString().Trim(); else if (reader.Name = MoveRightKey) _moveRightKey = (Keys)Convert.ToInt32(reader.ReadElementString().Trim(); else if (reader.Name = DeasilRotateKey) _deasilRotateKey = (Keys)Convert.ToInt32(reader.ReadElementString().Trim(); el
14、se if (reader.Name = ContraRotateKey) _contraRotateKey = (Keys)Convert.ToInt32(reader.ReadElementString().Trim(); else if (reader.Name = CoorWidth) _coorWidth = Convert.ToInt32(reader.ReadElementString().Trim(); else if (reader.Name = CoorHeight) _coorHeight = Convert.ToInt32(reader.ReadElementStrin
15、g().Trim(); else if (reader.Name = RectPix) _rectPix = Convert.ToInt32(reader.ReadElementString().Trim(); else if (reader.Name = BackColor) _backColor = Color.FromArgb(Convert.ToInt32(reader.ReadElementString().Trim(); #endregion catch (Exception ex) MessageBox.Show(ex.ToString(); finally if (reader
16、 != null) reader.Close(); 2 遊戲開始運行的程式public void Start() bGroup = new BlockGroup();/新建磚塊生產 runBlock = bGroup.GetABlock();/取一個磚塊 runBlock.XPos = _width / 2;/水準位置 int y = 0;/垂直位置 for (int i = 0; i y) y = runBlocki.Y; runBlock.YPos = y; gpPalette.Clear(disapperColor);/清空畫板 runBlock.Paint(gpPalette);/畫運
17、行磚塊 Thread.Sleep(20); readyBlock = bGroup.GetABlock();/取另一個磚塊給readyBlock readyBlock.XPos = 2;/5*5的中心為2 readyBlock.YPos = 2; gpReady.Clear(disapperColor);/清空畫板 readyBlock.Paint(gpReady); timerBlock = new System.Timers.Timer(timeSpan); timerBlock.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);/委託 timerBlock.AutoReset = true; timerBlock.Start();