版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> C#課程實(shí)訓(xùn)報(bào)告</b></p><p> ( 2013 -- 2014 年度第 1 學(xué)期)</p><p> 專業(yè)軟件工程</p><p> 學(xué)生姓名</p><p> 班級</p><p> 學(xué)號</p><p> 指導(dǎo)教師</p&
2、gt;<p> 完成日期</p><p><b> 目 錄</b></p><p><b> 目 錄2</b></p><p><b> 1 設(shè)計(jì)目的1</b></p><p><b> 2 設(shè)計(jì)內(nèi)容1</b><
3、;/p><p><b> 3 實(shí)現(xiàn)方法1</b></p><p> 3.1 程序概述1</p><p> 3.2 游戲的概要設(shè)計(jì)3</p><p> 3.3 游戲的詳細(xì)設(shè)計(jì)及編碼4</p><p> 3.4 開發(fā)環(huán)境33</p><p> 4 小 結(jié)
4、34</p><p><b> C#課程實(shí)訓(xùn)報(bào)告</b></p><p> 1 設(shè)計(jì)目的 </p><p> 本課程設(shè)計(jì)是在學(xué)完教學(xué)大綱規(guī)定的全部內(nèi)容、完成所有實(shí)踐環(huán)節(jié)的基礎(chǔ)上,旨在深化學(xué)生學(xué)習(xí)的C#語言課程基本知識,進(jìn)一步掌握C#語言程序設(shè)計(jì)方法,提高分析問題、解決問題的綜合應(yīng)用能力。</p><p&
5、gt;<b> 2 設(shè)計(jì)內(nèi)容</b></p><p> 俄羅斯方塊游戲的編制。</p><p><b> 3 實(shí)現(xiàn)方法</b></p><p><b> 3.1 程序概述</b></p><p> 3.1.1 游戲的功能 </p><p>
6、 它的基本功能就是要求玩家先登錄窗體輸入用戶名(ldq)和密碼(afafa),如果正確則登錄游戲,如果輸錯三次則退出游戲。</p><p> 登錄游戲后玩家通過移動或旋轉(zhuǎn)自己窗口內(nèi)落下的方塊,方塊在一行堆滿后就可以消掉;如果方塊堆積至窗口頂端,則游戲結(jié)束。</p><p> 系統(tǒng)默認(rèn)設(shè)置使用右邊的窗口,用光標(biāo)操作:左箭頭左移一格,右箭頭右移一格,上箭頭旋轉(zhuǎn)方塊,下箭頭方塊丟下。用戶還可
7、以定義自己習(xí)慣的按鍵來操作游戲。</p><p> 3.1.2 游戲的預(yù)覽</p><p> 游戲運(yùn)行的登錄窗口如圖3-1所示。</p><p><b> 圖3-1 登錄窗體</b></p><p> 游戲運(yùn)行的主操作界面如圖3-2所示。</p><p><b> 圖3-2主操
8、作界面</b></p><p> 單擊[設(shè)置]按鈕,出現(xiàn)一個對話框,可以設(shè)置游戲規(guī)則。在操作設(shè)置界面中可以進(jìn)行鍵盤設(shè)置,還可以進(jìn)行環(huán)境設(shè)置,設(shè)置游戲的難度。操作界面如圖3-3所示。</p><p> 圖3-3 操作設(shè)置界面</p><p> [開始級別](默認(rèn)是一級),級別是1-10,級別越高方塊下落速度越快。</p><p&g
9、t; 3.2 游戲的概要設(shè)計(jì)</p><p> 3.2.1 游戲?qū)崿F(xiàn)方案</p><p> 屏幕上有一個X列Y層的區(qū)域,計(jì)算機(jī)自動產(chǎn)生多重不同形狀的方塊,并出現(xiàn)在區(qū)域的最頂端;然后每過一個固定時間向下落一層,玩家可以使用鍵盤控制方塊向三個方向移動和順(逆)時針旋轉(zhuǎn)90°。不過前提是方塊移動和旋轉(zhuǎn)后的位置是空的,并且碰觸不到提前設(shè)置好的邊界。當(dāng)方塊落到區(qū)域底部或者另一個方塊之
10、上是將停止移動。該方塊降落后檢查每行是否有滿行的現(xiàn)象,如果有,這一行全部取消方塊,將上一層的方塊重新畫到這一層。隨后新的方塊產(chǎn)生,當(dāng)新方塊無處放置時,游戲結(jié)束。</p><p> 3.3.2 游戲邏輯設(shè)計(jì)</p><p> 首先是定義與游戲相關(guān)的數(shù)據(jù)的存儲方法,分為兩個主要的部分:一個是當(dāng)前的方塊,需要保存位置、當(dāng)前的旋轉(zhuǎn)狀態(tài);另一個是屏幕區(qū)域的狀態(tài),這可以用一個二維數(shù)組來表示。<
11、;/p><p> 其次,分析得到按鍵的含義,做出響應(yīng),響應(yīng)模塊:“左”、“右”、“下”、“移動”和“旋轉(zhuǎn)”幾個模塊,負(fù)責(zé)改變當(dāng)前方塊的狀態(tài)的數(shù)據(jù);畫方塊模塊:位置移動后,把方塊畫到新的位置上;檢查模塊:在每次改變狀態(tài)之前,對方塊企圖占用的區(qū)域進(jìn)行檢查。如果無處可放,則此次移動失敗。如果方塊到區(qū)域底端了,則應(yīng)該固定在當(dāng)前位置,這可以調(diào)用前面的畫方塊模塊來實(shí)現(xiàn),同時再再產(chǎn)生一個方塊。這樣還需要寫一個產(chǎn)生方塊的模塊。每次
12、當(dāng)方塊到底的時候,都需要檢查一下是否有新的層排滿了,如果有,則應(yīng)該消層。這就又需要寫兩個模塊,檢車是否排滿和消層。產(chǎn)生新方塊時也需要檢查其產(chǎn)生的位置,如果這個位置已被占用,則游戲結(jié)束,這需要調(diào)用前面的檢查模塊來實(shí)現(xiàn)。</p><p> 最后檢查系統(tǒng)時間,規(guī)定每過一個指定時間間隔就調(diào)用一次方塊下落模塊。</p><p> 3.3 游戲的詳細(xì)設(shè)計(jì)及編碼</p><p&g
13、t; 3.3.1 主界面設(shè)計(jì)編碼</p><p> 主界面的作用就是顯示本游戲所有的功能菜單項(xiàng),提供游戲的而顯示界面。在本界面中共設(shè)計(jì)了5種控件,通過這些控件,玩家可以方便的控制游戲,各個控件的名稱、作用和類型如表3-1所示。</p><p> 表3-1 主界面的控件設(shè)計(jì)</p><p> 另外,在界面中還設(shè)置了1個TextBox控件。在界面操作中,把焦點(diǎn)一
14、直防止在這個控件上,方便用戶用鍵盤操作游戲方塊。</p><p> 在游戲中需要保存用戶自定義的一些設(shè)置,本游戲中把設(shè)置保存到setting.cob文件中,并在游戲加載的時候調(diào)用。主界面Load事件的代碼如例程3-1所示,游戲設(shè)置保存代碼如例程3-2所示。</p><p> 例程3-1 主界面Load代碼,用到Initiate函數(shù)進(jìn)行操作設(shè)置初始化。</p><p&
15、gt; private void Form1_Load(object sender, EventArgs e)</p><p><b> {</b></p><p> this.Initiate();</p><p><b> }</b></p><p> private void Ini
16、tiate()</p><p><b> {</b></p><p><b> try</b></p><p><b> {</b></p><p> XmlDocument doc = new XmlDocument();</p><p>
17、doc.Load("c:\\setting.ini");</p><p> XmlNodeList nodes = doc.DocumentElement.ChildNodes;</p><p> this.startLevel = Convert.ToInt32(nodes[0].InnerText);</p><p> keys = n
18、ew Keys[5];</p><p> for (int i = 0; i < nodes[2].ChildNodes.Count; i++)</p><p><b> {</b></p><p> KeysConverter kc = new KeysConverter();</p><p> this
19、.keys[i] = (Keys)(kc.ConvertFromString(nodes[2].ChildNodes[i].InnerText));</p><p><b> }</b></p><p><b> }</b></p><p><b> catch</b></p>&
20、lt;p><b> {</b></p><p> this.trans = false;</p><p> keys = new Keys[5];</p><p> keys[0] = Keys.Left;</p><p> keys[1] = Keys.Right;</p><p&g
21、t; keys[2] = Keys.Down;</p><p> keys[3] = Keys.Up;</p><p> keys[4] = Keys.Space;</p><p> this.level = 1;</p><p> this.startLevel = 1;</p><p><b>
22、 }</b></p><p> this.timer1.Interval = 500 - 50 * (level - 1);//時鐘</p><p> this.label1.Text = "級別: " + this.startLevel;</p><p> if (trans)</p><p><
23、;b> {</b></p><p> this.TransparencyKey = Color.Black;</p><p><b> }</b></p><p><b> }</b></p><p> [設(shè)置]按鈕是進(jìn)入操作設(shè)置,代碼如下</p><
24、p> private void button2_Click_1(object sender, EventArgs e)</p><p><b> {</b></p><p> if(!paused)</p><p><b> {</b></p><p> this.atPause=D
25、ateTime.Now;</p><p> this.paused=true;</p><p> this.timer1.Stop();</p><p><b> }</b></p><p> sform.SetOptions(this.keys,this.startLevel,this.trans);</
26、p><p> sform.DialogResult=DialogResult.Cancel;</p><p> sform.ShowDialog();</p><p> if(sform.DialogResult==DialogResult.OK)</p><p><b> {</b></p><
27、p> sform.GetOptions(ref this.keys,ref this.startLevel,ref this.trans);</p><p> this.level=this.startLevel;</p><p> this.label1.Text="級別 "+this.level;</p><p> this.
28、timer1.Interval=500-50*(level-1);</p><p> if(this.trans)</p><p><b> {</b></p><p> this.TransparencyKey=Color.Black;</p><p><b> }</b></p&g
29、t;<p><b> else</b></p><p> this.TransparencyKey=Color.Transparent;</p><p><b> }</b></p><p> this.paused=false;</p><p> this.pauseTim
30、e+=DateTime.Now-this.atPause;</p><p> this.timer1.Start();</p><p> this.textBox1.Focus();</p><p><b> }</b></p><p> [開始]按鈕的事件是設(shè)置label的顯示文本、開始計(jì)時和時間間隔,并調(diào)用生
31、成方塊的函數(shù)。主要代碼如例程3-3所示。</p><p> 例程[開始]按鈕事件代碼</p><p> private void Start()</p><p><b> {</b></p><p> this.block = null;</p><p> this.nextBlock
32、= null;</p><p> this.label4.Text = “手速”: 0";</p><p> this.label3.Text = “塊數(shù)”: 0";</p><p> this.label2.Text = “行數(shù)”: 0";</p><p> this.label5.Text = “成
33、績”: 0";</p><p> this.score = 0;</p><p> this.label1.Text = "級別”: " + this.startLevel;</p><p> this.level = this.startLevel;</p><p> this.timer1.Inter
34、val = 500 - 50 * (level - 1);//方塊生成的時間間隔</p><p> this.paused = false;</p><p> this.failed = false;</p><p> this.panel1.Invalidate();</p><p> this.panel2.Invalidate(
35、);</p><p> this.nextShapeNO = 0;</p><p> this.CreateBlock();//生成當(dāng)前方塊</p><p> this.CreateNextBlock();</p><p> this.timer1.Enabled = true;</p><p> this.
36、atStart = DateTime.Now;</p><p> this.pauseTime = new TimeSpan(0);</p><p><b> }</b></p><p> [暫停]按鈕的事件是對計(jì)時器進(jìn)行暫??刂疲绻呀?jīng)處于暫停狀態(tài),則計(jì)時器開始計(jì)時</p><p> private void
37、 button3_Click(object sender, EventArgs e)</p><p><b> {</b></p><p> if (!this.failed)</p><p><b> {</b></p><p> if (paused)</p><p&
38、gt;<b> {</b></p><p> this.pauseTime += DateTime.Now - this.atPause;</p><p> paused = false;</p><p> this.timer1.Start();</p><p><b> }</b>&l
39、t;/p><p><b> else</b></p><p><b> {</b></p><p> this.atPause = DateTime.Now;</p><p> paused = true;</p><p> this.timer1.Stop();<
40、;/p><p><b> }</b></p><p><b> }</b></p><p> this.textBox1.Focus();</p><p><b> }</b></p><p> [其他]還有需要一些函數(shù)輔助這些控件才能完成功能:在
41、Start函數(shù)中,需要調(diào)用一個函數(shù)創(chuàng)建新方塊(creatblock)和如果能夠順利執(zhí)行將調(diào)用的創(chuàng)建下一個方塊(creatnextblock)</p><p> private bool CreateBlock()</p><p><b> {</b></p><p> Point firstPos;</p><p>
42、; Color color;</p><p> if (this.nextShapeNo == 0)</p><p><b> {</b></p><p> Random rand = new Random();</p><p> this.nextShapeNo = rand.Next(1, 8);</
43、p><p><b> }</b></p><p> switch (this.nextShapeNo)</p><p><b> {</b></p><p> case 1://田</p><p> firstPos = new Point(4, 0);</p&g
44、t;<p> color = Color.Turquoise;</p><p><b> break;</b></p><p> case 2://一</p><p> firstPos = new Point(3, 0);</p><p> color = Color.Red;</p>
45、;<p><b> break;</b></p><p> case 3://土</p><p> firstPos = new Point(4, 0);</p><p> color = Color.Silver;</p><p><b> break;</b></p
46、><p> case 4://z</p><p> firstPos = new Point(4, 0);</p><p> color = Color.LawnGreen;</p><p><b> break;</b></p><p> case 5://倒z</p>&l
47、t;p> firstPos = new Point(4, 1);</p><p> color = Color.DodgerBlue;</p><p><b> break;</b></p><p> case 6://L</p><p> firstPos = new Point(4, 0);</
48、p><p> color = Color.Yellow;</p><p><b> break;</b></p><p> default://倒L</p><p> firstPos = new Point(4, 0);</p><p> color = Color.Salmon;<
49、/p><p><b> break;</b></p><p><b> }</b></p><p> if (this.block == null)</p><p><b> {</b></p><p> block = new Block(thi
50、s.panel1, 9, 19, 25, this.nextShapeNo, firstPos, color);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if (!bloc
51、k.GeneBlock(this.nextShapeNo, firstPos, color))</p><p><b> {</b></p><p> return false;</p><p><b> }</b></p><p><b> }</b></p&g
52、t;<p> block.EraseLast();</p><p> block.Move(2);</p><p> return true;</p><p><b> }</b></p><p> private void CreateNextBlock()</p><p&g
53、t;<b> {</b></p><p> Random rand = new Random();</p><p> this.nextShapeNo = rand.Next(1, 8);</p><p> Point firstpos;</p><p> Color color;</p><
54、;p> switch (this.nextShapeNo)</p><p><b> {</b></p><p> case 1://田¬?</p><p> firstpos = new Point(1, 0);</p><p> color = Color.Turquoise;</p&
55、gt;<p><b> break;</b></p><p> case 2://一°?</p><p> firstpos = new Point(0, 1);</p><p> color = Color.Red;</p><p><b> break;</b>
56、</p><p> case 3://土ª¨¢</p><p> firstpos = new Point(0, 0);</p><p> color = Color.Silver;</p><p><b> break;</b></p><p> case
57、 4://z</p><p> firstpos = new Point(0, 0);</p><p> color = Color.LawnGreen;</p><p><b> break;</b></p><p> case 5://倒Ì1z</p><p> first
58、pos = new Point(0, 1);</p><p> color = Color.DodgerBlue;</p><p><b> break;</b></p><p> case 6://L</p><p> firstpos = new Point(0, 0);</p><p&g
59、t; color = Color.Yellow;</p><p><b> break;</b></p><p> default://倒Ì1L</p><p> firstpos = new Point(0, 0);</p><p> color = Color.SaddleBrown;</p
60、><p><b> break;</b></p><p><b> }</b></p><p> if (nextblock == null)</p><p> nextblock = new Block(this.panel4, 3, 1, 20, this.nextShapeNo, firs
61、tpos, color);</p><p><b> else</b></p><p><b> {</b></p><p> nextblock.GeneBlock(this.nextShapeNo, firstpos, color);</p><p> nextblock.EraseLa
62、st();</p><p><b> }</b></p><p><b> }</b></p><p> 3.3.2 游戲控制設(shè)置設(shè)計(jì)編碼 </p><p> 操作設(shè)置界面的作用就是顯示本游戲操作鍵、開始級別設(shè)置和音效、是否運(yùn)行界面為透明的設(shè)置。下面是該界面所需的一些控件及控件實(shí)現(xiàn)所要求功
63、能的源代碼</p><p> 表3-1 主界面的控件設(shè)計(jì)</p><p> public partial class Form2 : Form</p><p><b> {</b></p><p> private bool trans;</p><p> private int lev
64、el;</p><p> private Keys[] keys;</p><p> public Form2()</p><p><b> {</b></p><p> InitializeComponent();</p><p> this.keys = new Keys[5];&l
65、t;/p><p><b> }</b></p><p> private void ChangeKey(TextBox textbox, System.Windows.Forms.KeyEventArgs e, int i)</p><p><b> {</b></p><p> if ((e.
66、KeyValue >= 32 && e.KeyValue <= 40) || (e.KeyValue >= 45 && e.KeyValue <= 46) || (e.KeyValue >= 48 && e.KeyValue <= 57) || (e.KeyValue >= 65 && e.KeyValue <= 90) ||
67、 (e.KeyValue >= 96 && e.KeyValue <= 107) || (e.KeyValue >= 109 && e.KeyValue <= 111) || (e.KeyValue >= 186 && e.KeyValue <= 192) || (e.KeyValue >= 219 && e.KeyValue &l
68、t;= 222))</p><p><b> {</b></p><p> textbox.Text = e.KeyCode.ToString();</p><p> this.keys[i] = e.KeyCode;</p><p><b> }</b></p><p&
69、gt;<b> }</b></p><p> 3.3.3 登陸界面設(shè)計(jì)編碼</p><p> public partial class Form3 : Form</p><p><b> {</b></p><p> public int count=0 ;</p><
70、p> public Form3()</p><p><b> {</b></p><p> InitializeComponent();</p><p><b> }</b></p><p> private void button1_Click(object sender, Eve
71、ntArgs e)</p><p><b> {</b></p><p><b> count++;</b></p><p> if (count <= 3)</p><p><b> {</b></p><p> if (textBox
72、1.Text == "ldq" && textBox2.Text == "afafa")</p><p><b> {</b></p><p> Form1 aform = new Form1();</p><p> aform.Show();</p><p>
73、;<b> }</b></p><p><b> else</b></p><p> MessageBox.Show("用戶名或密碼錯誤", "警告!");</p><p><b> }</b></p><p><b>
74、 else</b></p><p> Application.Exit();</p><p><b> }</b></p><p> 3.3.4 游戲方塊設(shè)計(jì)編碼</p><p> public class Block</p><p><b> {</b&g
75、t;</p><p> private Control con;//繪圖控件</p><p> private int leftBorder;//左邊界</p><p> private int bottomBorder;//下邊界</p><p> private int unitPix;//每塊像素?cái)?shù)</p><
76、;p> private int shapeNo;//形狀號</p><p> private int blockNum = 0;//塊數(shù)</p><p> private int rowDelNum = 0;//消除行數(shù)</p><p> private bool[,] huji;</p><p> private Color
77、[,] iori;</p><p> private Color color;//當(dāng)前塊的顏色</p><p> private Point[] pos;//當(dāng)前位置</p><p> private Point[] lastPos;//上一次位置</p><p> public Block(Control con, int left
78、Border, int bottomBorder, int unitPix, int shapeNo, Point firstPos, Color color)</p><p><b> {</b></p><p> this.con = con;</p><p> this.leftBorder = leftBorder;</p&
79、gt;<p> this.bottomBorder = bottomBorder;</p><p> this.unitPix = unitPix;</p><p> this.SetPos(shapeNo, firstPos);//設(shè)置方塊位置</p><p> this.color = color;</p><p>
80、 this.huji = new bool[leftBorder + 1, bottomBorder + 1];</p><p> this.iori = new Color[leftBorder + 1, bottomBorder + 1];</p><p> this.lastPos = new Point[4];</p><p><b> }
81、</b></p><p> public void EraseLast()</p><p><b> {</b></p><p> foreach (Point p in this.lastPos)</p><p><b> {</b></p><p>
82、 this.con.Invalidate(new Rectangle(p.X * unitPix, p.Y * unitPix, unitPix + 1, unitPix + 1));</p><p><b> }</b></p><p><b> }</b></p><p> private void SetLas
83、tPos()</p><p><b> {</b></p><p> for (int i = 0; i < this.pos.Length; i++)</p><p><b> {</b></p><p> this.lastPos[i] = this.pos[i];</p&g
84、t;<p><b> }</b></p><p><b> }</b></p><p> private void SetPos(int shapeNo, Point firstPos)//設(shè)置位置:形狀、第一個點(diǎn)的位置</p><p><b> {</b></p>
85、<p> this.shapeNo = shapeNo;</p><p> this.pos = new Point[4];</p><p> pos[0] = firstPos;//第一個序號為0,則為第一個方塊的位置</p><p> switch (shapeNo)</p><p><b> {</
86、b></p><p><b> case 1:</b></p><p> pos[1] = new Point(firstPos.X + 1, firstPos.Y);</p><p> pos[2] = new Point(firstPos.X, firstPos.Y + 1);</p><p> pos
87、[3] = new Point(firstPos.X + 1, firstPos.Y + 1);</p><p><b> break;</b></p><p><b> case 2:</b></p><p> pos[1] = new Point(firstPos.X + 1, firstPos.Y);</
88、p><p> pos[2] = new Point(firstPos.X + 2, firstPos.Y);</p><p> pos[3] = new Point(firstPos.X + 3, firstPos.Y);</p><p><b> break;</b></p><p><b> case
89、3:</b></p><p> pos[1] = new Point(firstPos.X + 1, firstPos.Y);</p><p> pos[2] = new Point(firstPos.X + 1, firstPos.Y + 1);</p><p> pos[3] = new Point(firstPos.X + 2, firstP
90、os.Y);</p><p><b> break;</b></p><p><b> case 4:</b></p><p> pos[1] = new Point(firstPos.X + 1, firstPos.Y);</p><p> pos[2] = new Point(first
91、Pos.X + 1, firstPos.Y + 1);</p><p> pos[3] = new Point(firstPos.X + 2, firstPos.Y + 1);</p><p><b> break;</b></p><p><b> case 5:</b></p><p>
92、 pos[1] = new Point(firstPos.X + 1, firstPos.Y);</p><p> pos[2] = new Point(firstPos.X + 1, firstPos.Y - 1);</p><p> pos[3] = new Point(firstPos.X + 2, firstPos.Y - 1);</p><p><
93、;b> break;</b></p><p><b> case 6:</b></p><p> pos[1] = new Point(firstPos.X, firstPos.Y + 1);</p><p> pos[2] = new Point(firstPos.X + 1, firstPos.Y);</p&
94、gt;<p> pos[3] = new Point(firstPos.X + 2, firstPos.Y);</p><p><b> break;</b></p><p><b> default:</b></p><p> pos[1] = new Point(firstPos.X + 1, f
95、irstPos.Y);</p><p> pos[2] = new Point(firstPos.X + 2, firstPos.Y);</p><p> pos[3] = new Point(firstPos.X + 2, firstPos.Y + 1);</p><p><b> break;</b></p><p
96、><b> }</b></p><p><b> }</b></p><p> private bool CanMove(int direction)</p><p><b> {</b></p><p> bool canMove = true;</p&
97、gt;<p> if (direction == 0)</p><p><b> {</b></p><p> foreach (Point p in this.pos)</p><p><b> {</b></p><p> if (p.X - 1 < 0 || th
98、is.huji[p.X - 1, p.Y])</p><p><b> {</b></p><p> canMove = false;</p><p><b> break;</b></p><p><b> }</b></p><p><
99、b> }</b></p><p><b> }</b></p><p> else if (direction == 1)</p><p><b> {</b></p><p> foreach (Point p in this.pos)</p><p
100、><b> {</b></p><p> if (p.X + 1 > this.leftBorder || this.huji[p.X + 1, p.Y])</p><p><b> {</b></p><p> canMove = false;</p><p><b>
101、; break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b
102、> {</b></p><p> foreach (Point p in this.pos)</p><p><b> {</b></p><p> if (p.Y + 1 > this.bottomBorder || this.huji[p.X, p.Y + 1])</p><p>&l
103、t;b> {</b></p><p> canMove = false;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b&
104、gt; }</b></p><p> return canMove;</p><p><b> }</b></p><p> private bool CanRotate(Point[] pos)</p><p><b> {</b></p><p>
105、 bool canRotate = true;</p><p> foreach (Point p in pos)</p><p><b> {</b></p><p> if (p.X < 0 || p.X > this.leftBorder || p.Y<0||p.Y>this.bottomBorder||th
106、is.huji[p.X,p.Y])</p><p><b> {</b></p><p> canRotate = false;</p><p><b> break;</b></p><p><b> }</b></p><p><b&g
107、t; }</b></p><p> if (canRotate == true)</p><p> this.SetLastPos();</p><p> return canRotate;</p><p><b> }</b></p><p> private void
108、DelRows()</p><p><b> {</b></p><p> int count = 0;</p><p> int highRow = 20;</p><p> int lowRow = -1;</p><p> int[] delRow = { -1, -1, -1,
109、-1 };</p><p> foreach (Point p in this.pos)</p><p><b> {</b></p><p> if (p.Y == highRow || p.Y == lowRow)</p><p><b> continue;</b></p>
110、<p><b> int i;</b></p><p> for (i = 0; i < this.huji.GetLength(0); i++)</p><p> if (huji[i, p.Y] == false)</p><p><b> break;</b></p><
111、;p> if (i == this.huji.GetLength(0))</p><p><b> {</b></p><p> delRow[count] = p.Y;</p><p> if (p.Y < highRow)</p><p> highRow = p.Y;</p>&
112、lt;p> if (p.Y > lowRow)</p><p> lowRow = p.Y;</p><p><b> count++;</b></p><p><b> }</b></p><p><b> }</b></p><p&
113、gt; if (count > 0)</p><p><b> {</b></p><p> //------------------------------------------------------</p><p> Graphics gra = con.CreateGraphics();</p><p
114、> foreach (Point p in this.lastPos)</p><p><b> {</b></p><p> gra.FillRectangle(new SolidBrush(con.BackColor), p.X * this.unitPix, p.Y * unitPix, 25, 25);</p><p>&l
115、t;b> }</b></p><p> foreach (Point p in this.pos)</p><p><b> {</b></p><p> this.DrawOne(p.X,p.Y,this.color,gra);</p><p><b> }</b>&l
116、t;/p><p> foreach(int i in delRow)</p><p><b> {</b></p><p><b> if(i>0)</b></p><p><b> {</b></p><p> for(int j =0;j
117、<this.huji.GetLength(0);j++)</p><p><b> {</b></p><p> gra.FillRectangle(new SolidBrush(Color.FromArgb(60, Color.Black)), j * this.unitPix, i * unitPix, 25, 25);</p><p
118、><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> System.Threading.Thread.CurrentThread.Join(180);</p><p> //------------
119、-----------------------------------------------</p><p> if (count == 2 && lowRow - highRow > 1)</p><p><b> {</b></p><p> for (int i = lowRow; i > highRo
120、w + 1; i--)</p><p><b> {</b></p><p> for (int j = 0; j < this.huji.GetLength(0); j++)</p><p><b> {</b></p><p> this.huji[j, i] = this.huj
121、i[j, i - 1];</p><p> this.iori[j, i] = this.iori[j, i - 1];</p><p><b> }</b></p><p><b> }</b></p><p> for(int i=highRow;i>=count;i--)<
122、/p><p><b> {</b></p><p> for(int j=0;j<this.huji.GetLength(0);j++)</p><p><b> {</b></p><p> this.huji[j,i+1]=this.huji[j,i-1];</p>&l
123、t;p> this.iori[j,i+1]=this.iori[j,i-1]; }</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><
124、;p> else if(count==3 && lowRow-highRow>2)</p><p><b> {</b></p><p> int midRow=-1;</p><p> foreach(int row in delRow)</p><p><b> {&l
125、t;/b></p><p> if(row != highRow && row != lowRow)</p><p><b> {</b></p><p> midRow=row;</p><p><b> break;</b></p><p>
126、<b> }</b></p><p><b> }</b></p><p> for(int j=0;j<this.huji.GetLength(0);j++)</p><p><b> {</b></p><p> this.huji[j,lowRow]=th
127、is.huji[j,lowRow+highRow-midRow];</p><p><b> }</b></p><p> for(int i=highRow;i>=count;i--)</p><p><b> {</b></p><p> for(int j=0;j<this
128、.huji.GetLength(0);j++)</p><p><b> {</b></p><p> this.huji[j,i+2]=this.huji[j,i-1];</p><p> this.iori[j,i+2]=this.iori[j,i-1];</p><p><b> }</b&
129、gt;</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> for(int i=lowRow;i&
130、gt;=count;i--)</p><p><b> {</b></p><p> for(int j=0;j<this.huji.GetLength(0);j++)</p><p><b> {</b></p><p> this.huji[j,i]=this.huji[j,i-c
131、ount];</p><p> this.iori[j,i]=this.iori[j,i-count];</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> for
132、(int i=0;i<count;i++)</p><p><b> {</b></p><p> for(int j=0;j<this.huji.GetLength(0);j++)</p><p><b> {</b></p><p> this.huji[j,i]=false
133、;</p><p><b> }</b></p><p> //Helpers1.PlaySound();</p><p><b> }</b></p><p> con.Invalidate(new Rectangle(0,0,con.Width,( lowRow+1) * this.un
134、itPix));</p><p> this.rowDelNum += count;</p><p> /* Cnum = count;*/</p><p><b> }</b></p><p> public void FixBlock()</p><p><b> {<
135、;/b></p><p> this.blockNum++;</p><p> foreach (Point p in this.pos)</p><p><b> {</b></p><p> this.huji[p.X, p.Y] = true;</p><p> this.i
136、ori[p.X, p.Y] = this.color;</p><p><b> }</b></p><p> this.DelRows();</p><p><b> }</b></p><p> public bool GeneBlock(int shapeNo, Point first
137、Pos, Color color)</p><p><b> {</b></p><p> this.SetLastPos();</p><p> this.EraseLast();</p><p> this.SetPos(shapeNo, firstPos);</p><p> if
138、 (!this.CanRotate(this.pos))</p><p><b> {</b></p><p> this.pos = null;</p><p> return false;</p><p><b> }</b></p><p><b>
139、 else</b></p><p><b> {</b></p><p> this.color = color;</p><p> return true;</p><p><b> }</b></p><p><b> }</b>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c課程設(shè)計(jì)--俄羅斯方塊
- c_課程設(shè)計(jì)-俄羅斯方塊
- c++俄羅斯方塊課程設(shè)計(jì)
- c#俄羅斯方塊課程設(shè)計(jì)
- c++俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)-- 用c++實(shí)現(xiàn)的俄羅斯方塊程序設(shè)計(jì)
- 俄羅斯方塊c++課程設(shè)計(jì)報(bào)告
- c語言課程設(shè)計(jì)報(bào)告-俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 簡單俄羅斯方塊課程設(shè)計(jì)
- java俄羅斯方塊課程設(shè)計(jì)
評論
0/150
提交評論