韋立梅 張淑榮
(廣東白云學(xué)院,廣東 廣州 510450)
用C#實(shí)現(xiàn)單機(jī)版俄羅斯方塊
韋立梅 張淑榮
(廣東白云學(xué)院,廣東 廣州 510450)
俄羅斯方塊是一款非常受歡迎的益智游戲。本文介紹了利用C#來實(shí)現(xiàn)此游戲的分析設(shè)計(jì)、主要類及其代碼等知識(shí)。
俄羅斯方塊;C#;類
C#是微軟公司發(fā)布的一種面向?qū)ο蟮摹⑦\(yùn)行于.NET Framework之上的高級(jí)程序設(shè)計(jì)語言,它是由C和C++衍生出來的,具有安全、簡(jiǎn)單、執(zhí)行效率高等特點(diǎn)。Microsoft Visual Studio(簡(jiǎn)稱VS)是美國(guó)微軟公司的開發(fā)工具包系列產(chǎn)品,是目前最流行的Windows平臺(tái)應(yīng)用程序的集成開發(fā)環(huán)境。本文將說明使用C#語言實(shí)現(xiàn)俄羅斯方塊游戲的主要類代碼,開發(fā)平臺(tái)使用Visual Studio 2013。
當(dāng)用戶單擊開始游戲命令按鈕后,在程序界面的左側(cè)出現(xiàn)游戲面板區(qū)域,是由18行、11列方格組成的長(zhǎng)方形區(qū)域,并設(shè)置兩個(gè)障礙物方格,然后隨機(jī)給出不同的形狀,從正中間一列開始下落,當(dāng)碰到障礙物后,該形狀也變成新的障礙物,若沒有,則下落并填充到相應(yīng)的區(qū)域,在下落的過程中可通過鍵盤上的“↑”按鍵對(duì)形狀進(jìn)行翻轉(zhuǎn)變形,鍵盤上的“↓”按鍵控制形狀加速下落,鍵盤上的“←”、“→”按鍵控制形狀進(jìn)行左右移動(dòng),若填滿游戲面板中的某一行,便消除該行,剩余的方塊向下移動(dòng),并記分。當(dāng)形狀填滿游戲面板首行時(shí),游戲視為結(jié)束。
用戶界面的右側(cè),會(huì)顯示下一個(gè)即將出現(xiàn)的形狀、所得分?jǐn)?shù)、等級(jí)、形狀下落速度等信息。
圖1 游戲開始界面
圖2 游戲結(jié)束界面
游戲主要有三個(gè)類:游戲幫助類,形狀父類,背游戲控制器類。由于篇幅所限,這里只重點(diǎn)介紹形狀父類及其代碼。
3.1 游戲幫助類
提供整個(gè)程序運(yùn)行過程中經(jīng)常要使用的公共變量:游戲面板的行數(shù)、列數(shù),默認(rèn)是18行,11列,小方格的邊長(zhǎng),游戲環(huán)境的初始化,中間列索引,障礙物的顏色,普通背景方格的顏色,游戲速度的設(shè)置,線程鎖(玩家分?jǐn)?shù),玩家等級(jí))。
3.2 形狀父類
這個(gè)抽象類描述的對(duì)象是俄羅斯方塊的七種不同的形狀,是一個(gè)父類,它共有七個(gè)子類(ShapeLine、ShapeLLeft、ShapeLRight、ShapeSquare、ShapeT、ShapeZLeft、ShapeZRight)。每個(gè)子類的形狀都是由四個(gè)小正方形組成。這個(gè)抽象類需要實(shí)現(xiàn)不同形狀實(shí)體所有的屬性和動(dòng)作。包括:形狀的組成,位置,形狀左移,右移,下移,旋轉(zhuǎn)等。
類設(shè)計(jì):
{public ShapeUnit[]units=new ShapeUnit[4];//聲明ShapeU-nit數(shù)組,對(duì)應(yīng)每個(gè)形狀中的4個(gè)小方格
public ShapeDirection shapeDirection=ShapeDirection.Up; //形狀方向,默認(rèn)是向上的
protected CellPosition shapeCenter;//形狀中心點(diǎn)
public Shape(){……}//構(gòu)造函數(shù)用于初始化units數(shù)組,調(diào)用SetUnitsPositon()方法。
{for(int i=0;i {units[i]=new ShapeUnit();} this.SetUnitsPositon();} protected abstract void SetUnitsPositon();//雖然每個(gè)形狀子類對(duì)象都是由4個(gè)小方格組成,但是每個(gè)子類4個(gè)小方格(元素)的位置不同,所以定義一個(gè)抽象方法,而在每個(gè)子類中會(huì)重寫該方法,設(shè)置每個(gè)小方格的位置 public void DrawMe(Graphics g)//畫出形狀的方法 {lock(CommonHelper.lockKey) {foreach(ShapeUnit u in this.units)//遍歷數(shù)組中的每一個(gè)元素,調(diào)用每一個(gè)元素的DrawMe方法 u.DrawMe(g);}} public void WipeMe(Graphics g){……}//擦除形狀的方法,與畫出形狀的方法類似,實(shí)際上就是調(diào)用每個(gè)小方格的WipeMe(g)方法,將小方格自己擦除,可參照上面的DrawMe方法,編寫相應(yīng)代碼,在此省略。 public void MoveDown(Graphics g)//形狀下落的方法 {this.WipeMe(g);//擦除形狀. for(int i=0;i {units[i].Position=new CellPosition(){RowIndex=units[i]. Position.RowIndex+1,ColIndex=units[i].Posi tion.ColIndex};} shapeCenter.RowIndex++; this.DrawMe(g);}//根據(jù)新的位置重新繪制形狀 Interface.IShapeMoveable shapeMoveListener;//形狀下落的線程開始 bool isAive=true;//形狀存活的標(biāo)志 public void StartShapeMoveThread(Interface.IShapeMoveable shapeMoveListener)//開啟形狀移動(dòng)線程 {this.shapeMoveListener=shapeMoveListener; Thread shapeMoveThread=new Thread(MoveDownAuto);//聲明1個(gè)線程對(duì)象,并為這個(gè)線程指定執(zhí)行的方法 shapeMoveThread.IsBackground=true;//設(shè)置線程為后臺(tái)線程 shapeMoveThread.Start();//開啟線程 } private void MoveDownAuto()//線程執(zhí)行方法 {while(isAive) {Thread.Sleep(CommonHelper.GameSpeed);//暫停線程 shapeMoveListener.ShapeMove(this);//移動(dòng)形狀}} public void KillMe(){this.isAive=false;}//結(jié)束線程public void MoveToLeft(Graphics g)//向左移動(dòng) {this.WipeMe(g);//擦除形狀本身 for(int i=0;i {units[i].Position=new CellPosition(){RowIndex= units[i].Position.RowIndex,ColIndex=units [i].Position.ColIndex-1};} shapeCenter.ColIndex--; this.DrawMe(g);//重新繪制}形狀 public void MoveToRight(Graphics g){……}//向右移動(dòng) //可參照向左移動(dòng)方法,編寫向右移動(dòng)代碼,注意向右移動(dòng)時(shí)行坐標(biāo)不變,列坐標(biāo)增加 public void MoveToDown(Graphics g){……}//向下移動(dòng) //可參照向左移動(dòng)方法,編寫向下移動(dòng)代碼,注意向下移動(dòng)時(shí)列坐標(biāo)不變,行坐標(biāo)增加 public abstract void TurnToRight();//形狀右旋轉(zhuǎn),在每個(gè)形狀子類中,重寫該方法 public abstract void TurnToDown();//形狀下旋轉(zhuǎn),在每個(gè)形狀子類中,重寫該方法 public abstract void TurnToLeft();//形狀左旋轉(zhuǎn),在每個(gè)形狀子類中,重寫該方法 public abstract void TurnToUp();//形狀上旋轉(zhuǎn),在每個(gè)形狀子類中,重寫該方法} 左L形狀子類實(shí)現(xiàn)SetUnitsPositon方法的重寫代碼如下: class ShapeLeftL:Shape {protected override void SetUnitsPositon() {base.shapeCenter=new CellPosition(1,CommonHelper.MidCol); base.units[0].Position=new CellPosition(base.shape-Center.RowIndex-1,base.shapeCenter.ColIndex); base.units[1].Position=new CellPosition(base.shape-Center.RowIndex,base.shapeCenter.ColIndex); base.units[2].Position=new CellPosition(base.shape-Center.RowIndex+1,base.shapeCenter.ColIndex); base.units[3].Position=new CellPosition(base.shape-Center.RowIndex+1,base.shapeCenter.ColIndex-1);} 左L形狀子類實(shí)現(xiàn)TurnToRight方法的重寫代碼如下: public override void TurnToRight() {base.units[0].Position=new CellPosition(base.shapeCenter.RowIndex+1,base.shapeCenter.ColIndex+1); base.units[1].Position=new CellPosition(base.shapeCenter.RowIndex+1,base.shapeCenter.ColIndex); base.units[2].Position=new CellPosition(base.shapeCenter.RowIndex+1,base.shapeCenter.ColIndex-1); base.units[3].Position=new CellPosition(base.shapeCenter.RowIndex,base.shapeCenter.ColIndex-1);} 3.3 游戲引擎類 游戲引擎類就如一個(gè)汽車發(fā)動(dòng)機(jī)一樣,可以讓游戲反復(fù)地運(yùn)行。它的主要功能是:當(dāng)用戶單擊“開始游戲”按鈕后,重新畫出游戲背景、初始障礙物、隨機(jī)產(chǎn)生形狀;形狀以一定的速度下落的過程中,對(duì)鍵盤事件做出響應(yīng),實(shí)現(xiàn)左右移動(dòng)、向下加速、旋轉(zhuǎn)。當(dāng)形狀到達(dá)邊界時(shí),結(jié)束形狀的移動(dòng),并將形狀變成新的障礙物。 在Visual Studio 2013環(huán)境下實(shí)現(xiàn)的俄羅斯方塊游戲,可以讓廣大編程愛好者更好地學(xué)習(xí)C#語言的應(yīng)用,提高實(shí)戰(zhàn)能力的同時(shí),也激發(fā)了學(xué)習(xí)興趣,對(duì)自己動(dòng)手編寫應(yīng)用程序的能力會(huì)有很大的幫助。 [1]王文舉.C#語言開發(fā)俄羅斯方塊游戲[J].電腦編程與維護(hù),2013(3):7 3-7 9. [2]付強(qiáng),丁寧,等編著.C#編程實(shí)戰(zhàn)寶典[M].北京:清華大學(xué)出版社,2014. 【Abstract】Tetris is a very popular puzzle game.This paper describes the design of using C#to achieve the game,the main types of knowledge and code. class Shape Using C#to Achieve a Single version of Tetris Wei Limei Zhang Shurong Tetris;C#;class TP311.52 A 1008-6609(2016)10-0055-03 韋立梅(19 77-),女,遼寧凌源人,碩士,講師,研究方向?yàn)閳D形圖象處理、數(shù)據(jù)庫(kù)系統(tǒng)開發(fā)。4 結(jié)束語
(Guangdong Baiyun University,Guangzhou 510450,Guangdong)