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