C#实现简单俄罗斯方块
最近在看《.NET游戏编程入门经典C#篇》第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。
于是写下这篇文章留作纪念。
1.类的设计
在充分分析游戏的特点后,游戏大概可以分为3个类:Square小正方形,Block由4个小正方形组合成的一个图形,GameField游戏的驱动引擎
2.代码的编写
按照从小到大,从简单到复杂的顺序,先完成Square类,Square很简单,只需要提供Show,Hide方法以及Size,Location属性。
接下来是Block,Block相对比较复杂,分为以下几种:
它应该有4个Square编号可以按照个人习惯,当然之后计算坐标的时候也要根据个人的编号来进行。
Block应该有Hide,Show,Left,Right,Rotate一些方法,属性的话为了计算坐标应该有Square的大小,还有Color
要注意的是Rotate方法将Block顺时针旋转90°,图上已经标出旋转的中心。
最后剩下的就是GameField了,他应该有一个数组,保存背景中所有的Square,以及哪些位置有Square的位标志数组,对每一行的检查(是否消去得分)以及消去所有方块下移操作。
这些类完成后就可以简单的写游戏逻辑了,因为太简单就不说了,简单的贴一下代码
privateBlockcurrentBlock; privateBlocknextBlock; privateintscore; privateboolblockFalling; privatevoidbutton1_Click(objectsender,EventArgse) { pictureBox1.Refresh(); currentBlock=newBlock(newPoint(GameField.Width/2*GameField.SquareSize,0),Block.BlockTypes.Undefined); currentBlock.Show(GameField.WinHandle); nextBlock=newBlock(newPoint(15,15),Block.BlockTypes.Undefined); nextBlock.Show(pictureBox2.Handle); timer1.Enabled=true; button1.Enabled=false; Focus(); score=0; } privatevoidForm1_Load(objectsender,EventArgse) { GameField.WinHandle=pictureBox1.Handle; GameField.BackColor=pictureBox1.BackColor; } privatevoidForm1_KeyDown(objectsender,KeyEventArgse) { if(currentBlock==null) { return; } switch(e.KeyCode) { caseKeys.W: currentBlock.Rotate(); break; caseKeys.S: currentBlock.Down(); break; caseKeys.A: currentBlock.Left(); break; caseKeys.D: currentBlock.Right(); break; } } privatevoidtimer1_Tick(objectsender,EventArgse) { if(!currentBlock.Down()) { blockFalling=false; //塞满了游戏结束00 if(currentBlock.Top()==0) { timer1.Enabled=false; button1.Enabled=true; GameField.Reset(); MessageBox.Show("恭喜你跪了"); return; } } else { blockFalling=true; } if(!blockFalling) { //检查得分 intearseCount=GameField.CheckLines(); if(earseCount>0) { score+=earseCount*20; label1.Text=score.ToString(); //使图片框重绘清楚Block pictureBox1.Invalidate(); Application.DoEvents(); GameField.Redraw(); } pictureBox2.Invalidate(); Application.DoEvents(); currentBlock=newBlock(newPoint(GameField.Width/2*GameField.SquareSize,0),nextBlock.BlockType); currentBlock.Show(GameField.WinHandle); nextBlock=newBlock(newPoint(15,15),Block.BlockTypes.Undefined); nextBlock.Show(pictureBox2.Handle); blockFalling=true; } } privatevoidForm1_Activated(objectsender,EventArgse) { GameField.Redraw(); if(nextBlock!=null)nextBlock.Show(pictureBox2.Handle); }
3.总结
这个简单的游戏,可谓是刚好适合新手。可以学到冲突检测(CheckLines),游戏中基本元素与游戏驱动的理解。
更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合 进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。