C#實(shí)現(xiàn)簡(jiǎn)單俄羅斯方塊
最近在看《.NET游戲編程入門(mén)經(jīng)典 C#篇》 第一章介紹了如何制作俄羅斯方塊,自己試了試按照書(shū)上的步驟,可算是完成了。
于是寫(xiě)下這篇文章留作紀(jì)念。
1.類(lèi)的設(shè)計(jì)
在充分分析游戲的特點(diǎn)后,游戲大概可以分為3個(gè)類(lèi):Square 小正方形,Block 由4個(gè)小正方形組合成的一個(gè)圖形, GameField 游戲的驅(qū)動(dòng)引擎
2.代碼的編寫(xiě)
按照從小到大,從簡(jiǎn)單到復(fù)雜的順序,先完成Square類(lèi),Square很簡(jiǎn)單,只需要提供Show,Hide方法以及Size,Location屬性。
接下來(lái)是Block,Block相對(duì)比較復(fù)雜,分為以下幾種:
它應(yīng)該有4個(gè)Square 編號(hào)可以按照個(gè)人習(xí)慣,當(dāng)然之后計(jì)算坐標(biāo)的時(shí)候也要根據(jù)個(gè)人的編號(hào)來(lái)進(jìn)行。
Block應(yīng)該有Hide,Show,Left,Right,Rotate一些方法,屬性的話為了計(jì)算坐標(biāo) 應(yīng)該有Square的大小,還有Color
要注意的是Rotate方法將Block順時(shí)針旋轉(zhuǎn)90°,圖上已經(jīng)標(biāo)出旋轉(zhuǎn)的中心。
最后剩下的就是GameField了,他應(yīng)該有一個(gè)數(shù)組,保存背景中所有的Square,以及哪些位置有Square的 位標(biāo)志數(shù)組,對(duì)每一行的檢查(是否消去得分)以及消去所有方塊下移操作。
這些類(lèi)完成后就可以簡(jiǎn)單的寫(xiě)游戲邏輯了,因?yàn)樘?jiǎn)單就不說(shuō)了,簡(jiǎn)單的貼一下代碼
private Block currentBlock; private Block nextBlock; private int score; private bool blockFalling; private void button1_Click(object sender, EventArgs e) { pictureBox1.Refresh(); currentBlock = new Block(new Point(GameField.Width / 2 * GameField.SquareSize, 0), Block.BlockTypes.Undefined); currentBlock.Show(GameField.WinHandle); nextBlock = new Block(new Point(15, 15), Block.BlockTypes.Undefined); nextBlock.Show(pictureBox2.Handle); timer1.Enabled = true; button1.Enabled = false; Focus(); score = 0; } private void Form1_Load(object sender, EventArgs e) { GameField.WinHandle = pictureBox1.Handle; GameField.BackColor = pictureBox1.BackColor; } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (currentBlock == null) { return; } switch (e.KeyCode) { case Keys.W: currentBlock.Rotate(); break; case Keys.S: currentBlock.Down(); break; case Keys.A: currentBlock.Left(); break; case Keys.D: currentBlock.Right(); break; } } private void timer1_Tick(object sender, EventArgs e) { if (!currentBlock.Down()) { blockFalling = false; //塞滿了 游戲結(jié)束 0 0 if (currentBlock.Top() == 0) { timer1.Enabled = false; button1.Enabled = true; GameField.Reset(); MessageBox.Show("恭喜你跪了"); return; } } else { blockFalling = true; } if (!blockFalling) { //檢查得分 int earseCount = GameField.CheckLines(); if (earseCount > 0) { score += earseCount * 20; label1.Text = score.ToString(); //使圖片框重繪 清楚Block pictureBox1.Invalidate(); Application.DoEvents(); GameField.Redraw(); } pictureBox2.Invalidate(); Application.DoEvents(); currentBlock = new Block(new Point(GameField.Width / 2 * GameField.SquareSize, 0), nextBlock.BlockType); currentBlock.Show(GameField.WinHandle); nextBlock = new Block(new Point(15, 15), Block.BlockTypes.Undefined); nextBlock.Show(pictureBox2.Handle); blockFalling = true; } } private void Form1_Activated(object sender, EventArgs e) { GameField.Redraw(); if (nextBlock !=null)nextBlock.Show(pictureBox2.Handle); }
3.總結(jié)
這個(gè)簡(jiǎn)單的游戲,可謂是剛好適合新手。可以學(xué)到?jīng)_突檢測(cè)(CheckLines),游戲中基本元素與游戲驅(qū)動(dòng)的理解。
更多俄羅斯方塊精彩文章請(qǐng)點(diǎn)擊專(zhuān)題:俄羅斯方塊游戲集合 進(jìn)行學(xué)習(xí)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#采用HttpWebRequest實(shí)現(xiàn)保持會(huì)話上傳文件到HTTP的方法
這篇文章主要介紹了C#采用HttpWebRequest實(shí)現(xiàn)保持會(huì)話上傳文件到HTTP的方法,很實(shí)用的功能,需要的朋友可以參考下2014-08-08通過(guò)?C#/VB.NET?代碼將?Excel?工作表拆分為單獨(dú)的文件
這篇文章主要介紹了通過(guò)C#/VB.NET代碼將Excel工作表拆分為單獨(dú)的文件,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09C#計(jì)算輸入漢字GBK編碼后十六進(jìn)制數(shù)輸出的方法
這篇文章主要介紹了C#計(jì)算輸入漢字GBK編碼后十六進(jìn)制數(shù)輸出的方法,涉及C#編碼操作相關(guān)技巧,需要的朋友可以參考下2015-04-04詳解C#中HttpClient的用法及相關(guān)問(wèn)題的解決方法
相信大家在使用 HttpClient 的時(shí)候遇到過(guò) 遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接 的錯(cuò)誤。本文就來(lái)說(shuō)說(shuō)它的解決方法以及HttpClient的正確用法,需要的可以參考一下2022-11-11