C#實(shí)現(xiàn)簡單俄羅斯方塊
最近在看《.NET游戲編程入門經(jīng)典 C#篇》 第一章介紹了如何制作俄羅斯方塊,自己試了試按照書上的步驟,可算是完成了。
于是寫下這篇文章留作紀(jì)念。
1.類的設(shè)計(jì)
在充分分析游戲的特點(diǎn)后,游戲大概可以分為3個(gè)類:Square 小正方形,Block 由4個(gè)小正方形組合成的一個(gè)圖形, GameField 游戲的驅(qū)動引擎
2.代碼的編寫
按照從小到大,從簡單到復(fù)雜的順序,先完成Square類,Square很簡單,只需要提供Show,Hide方法以及Size,Location屬性。
接下來是Block,Block相對比較復(fù)雜,分為以下幾種:

它應(yīng)該有4個(gè)Square 編號可以按照個(gè)人習(xí)慣,當(dāng)然之后計(jì)算坐標(biāo)的時(shí)候也要根據(jù)個(gè)人的編號來進(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ù)組,對每一行的檢查(是否消去得分)以及消去所有方塊下移操作。
這些類完成后就可以簡單的寫游戲邏輯了,因?yàn)樘唵尉筒徽f了,簡單的貼一下代碼
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è)簡單的游戲,可謂是剛好適合新手??梢詫W(xué)到?jīng)_突檢測(CheckLines),游戲中基本元素與游戲驅(qū)動的理解。
更多俄羅斯方塊精彩文章請點(diǎn)擊專題:俄羅斯方塊游戲集合 進(jìn)行學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#采用HttpWebRequest實(shí)現(xiàn)保持會話上傳文件到HTTP的方法
這篇文章主要介紹了C#采用HttpWebRequest實(shí)現(xiàn)保持會話上傳文件到HTTP的方法,很實(shí)用的功能,需要的朋友可以參考下2014-08-08
通過?C#/VB.NET?代碼將?Excel?工作表拆分為單獨(dú)的文件
這篇文章主要介紹了通過C#/VB.NET代碼將Excel工作表拆分為單獨(dú)的文件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
C#計(jì)算輸入漢字GBK編碼后十六進(jìn)制數(shù)輸出的方法
這篇文章主要介紹了C#計(jì)算輸入漢字GBK編碼后十六進(jìn)制數(shù)輸出的方法,涉及C#編碼操作相關(guān)技巧,需要的朋友可以參考下2015-04-04
詳解C#中HttpClient的用法及相關(guān)問題的解決方法
相信大家在使用 HttpClient 的時(shí)候遇到過 遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接 的錯(cuò)誤。本文就來說說它的解決方法以及HttpClient的正確用法,需要的可以參考一下2022-11-11

