C#课程设计俄罗斯方块.doc
《C#课程设计俄罗斯方块.doc》由会员分享,可在线阅读,更多相关《C#课程设计俄罗斯方块.doc(21页珍藏版)》请在沃文网上搜索。
1、C#程序设计实训报告1 系统设计要求1.1 需求分析本系统为一个用C#实现的为我们所熟悉的简单的俄罗斯方块游戏,该系统的具体功能如下:1) 能简便的开始游戏,游戏中的方块的功能与日常我们所熟悉的游戏的功能一致,各种块的设置也一致,包括块的旋转,加速下降,平移,满行消去,到顶游戏结束功能;2) 能够自定义游戏中功能键的具体按键,设置游戏的级别,即方块下降的速度等,并在设置后立即生效,在游戏中立刻体现,在下次程序运行时读取上次设置的游戏环境;3) 显示下一方块提示信息,以及游戏数据的统计,如速度,按键速度,分数行者等等;4) 游戏有级别设置,级别越高,方块下降的速度越快,当到达一定分数后进入下一级
2、别;1.2 界面要求要求界面简洁美观,简单易用。1.3 设计环境本程序选择Visual Studio 2008作为实验环境。2 设计思路2.1 用面向对象的方法分析系统对于俄罗斯方块来说,我们可以定义一个类,专门来描述俄罗斯方块,在这个类中,包含与之相关的方法、属性和字段,通过封装,实现其业务逻辑。其中,每一个俄罗斯方块都有相同的特征,由4个小正方形构成,有旋转,移动,下落的动作,行被填满除去构成行的小正方体块。基中块的形状类型有7种:田、一、L、倒L、Z、倒Z、上。在主窗口中,通过调用俄罗斯方块类来实现程序的表示层,在该窗口中通过两个Panel控件来实现方块叠放窗口和下一方块信息窗口;调用设
3、置窗口,保存设计窗口类传回的信息,并设置到游戏中去,保存在配置文件中;在设置窗口中,以良好的界面提供用户自定义快捷键的接口,保存相应设置参数,以提供给调用窗口。2.2 概要设计根据设计思路,可以为系统设计三个类,实现俄罗斯方块其本块的类RussiaBlock继承Object类,主窗体类MainForm类,设置窗体类SettingForm类。1) RussiaBlock类字段 private int shapeNO;/形状号 private Control con;/绘图控件 private Point pos;/当前位置 private Point lastPos;/最后位置 private
4、int leftBorder;/左边界 private int bottomBorder;/下边界 private int unitPix;/每块象素数 / / 当前块总个数 / private int blockNum = 0;/当前块总个数 private int rowDelNum = 0;/已构成满行被消去的行数 private bool, aroundExist;/周边的位置是否有块 private Color, aroundColor;/周边的着色 private Color color;/当前块颜色属性 public int RowDelNum/当前块总个数 public int
5、 BlockNum/当前块总个数私有方法private void SetLastPos()/设置方块的最后位置private void SetPos(int shapeNO, Point firstPos)/设置方块的当前位置,shapeNO方块号,firstPos初始位置 private bool CanMove(int direction)/块是否还可继续移动包括下和左右 private bool CanRotate(Point pos)/判断当前块是否是可以进行翻转,位置确定则不能,还没确定则可以 private void DelRows()/一行中所有格填满,删除该行. private
6、 void DrawOne(int x, int y, Color color, Graphics gra)/在指定的位置绘制方块中的一块 公共方法public void EraseLast()/最后方块位置的显示.原理:将显示的窗口方块位置无效,强制发生重绘事件 public void FixBlock()/填补行 public bool GeneBlock(int shapeNO, Point firstPos, Color color)/产生下一方块public bool Rotate()/旋转动作 public bool Move(int direction)/移动 public vo
7、id Drop()/直落 public void DrawBlocks(Rectangle rec)/在指定的位置绘制方块,包括块小块 2) MainForm类主要字段private RussiaBlock block;/ 方块实例private RussiaBlock nextBlock;/ 下一基本块实例private int nextShapeNO;/ 下一基本块形状号private bool paused;/已暂停private DateTime atStart;/开始时间private DateTime atPause;/暂停时间private TimeSpan pauseTime;
8、/暂停间隔时间private Keys keys;/按键private int startLevel;/ 开始级别private bool trans;/ 改变级别主要方法private void MainForm_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) / 按键事件private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) / 游戏窗格绘制void timer1_Tick(object sender, System
9、.EventArgs e) / 定时时钟处理函数,使基本块自动下降private void panel2_Paint / 下一块窗格绘制btnPause_Click(object sender, System.EventArgs e)/ 暂停游戏btnSetting_Click(object sender, System.EventArgs e) / 设置环境label5_MouseEnter(object sender, System.EventArgs e) / 显示帮助private void btnStart_Click / 开始游戏private void Initiate()/ 初
10、始化环境private void Start()/ 开始游戏private void Fail()/ 游戏失败private bool CreateBlock()/ 建立基本块private void CreateNextBlock()/ 建立下一基本块private void FixAndCreate()/ 填补方块视图并建立新块private void SaveSetting()/ 保存设置SettingForm类主要方法:private void ChangeKey (TextBox textBox,System.Windows.Forms.KeyEventArgs e,int i)3
11、系统功能模块图3.1 方块类RussiaBlock3.2 主窗口类MainForm3.3 设置窗口类SetttingForm3个类图放在一起,如下所示4 系统流程图、类的层次图4.1 流程图4.2 类的结构图5 调试过程5.1 程序主界面5.2 设置界面5.3 开始游戏5.4 游戏结束5.5 暂停游戏6 关键程序代码6.1 RussiaBlock类以下涉及的词语基本块指的是由四个小方块构成的实体,四个小方块指的是小正方形。方块与基本块同义。1) 构造函数,通过给定的参数:控件实例,左边界,底边界,小方块(一个基本块由4个小方块构成)单位象素,形状号,起始位置,颜色。public RussiaB
12、lock(Control con,int leftBorder,int bottomBorder,int unitPix,int shapeNO,Point firstPos,Color color)/构造一个游戏中方块实例的构造函数,如Z形块等this.con=con;this.leftBorder=leftBorder;this.bottomBorder=bottomBorder;this.unitPix=unitPix;this.SetPos(shapeNO,firstPos);this.color=color;this.aroundExist=new boolleftBorder+1,
13、bottomBorder+1;this.aroundColor=new ColorleftBorder+1,bottomBorder+1;this.lastPos=new Point4;/每一个基本块中都相同的拥有N(4)个方格,通过N个方格的左上角位置可以确定块在视图中的位置2) 设置方块的最后位置,用来保存上次方块的位置private void SetLastPos()/设置方块的最后位置 for (int i = 0; i this.pos.Length; i+) this.lastPosi = this.posi; 3) 是否能移动,如果移动后与其他小方块重叠,则不能移动,可通过类的私
14、有成员aroundExist数组来确定,该数组保存的就是现方块图中各个位置是否已存在小方块,true表示存在。private bool CanMove(int direction)/块是否还可继续移动包括下和左右 bool canMove = true; if (direction = 0)/左 foreach (Point p in this.pos) if (p.X - 1 this.leftBorder | this.aroundExistp.X + 1, p.Y) canMove = false; break; else/下 foreach (Point p in this.pos)
15、if (p.Y + 1 this.bottomBorder | this.aroundExistp.X, p.Y + 1) canMove = false; break; return canMove; 4) 当前块是否是可以进行翻转,如果已靠底或到达边界,或者翻转后是与已有的小方块重叠则不能进行翻转。private bool CanRotate(Point pos)/判断当前块是否是可以进行翻转,位置确定则不能,还没确定则可以 bool canRotate = true; foreach (Point p in pos) if (p.X this.leftBorder | p.Y this.
16、bottomBorder | this.aroundExistp.X, p.Y) canRotate = false; break; if (canRotate = true) this.SetLastPos(); return canRotate; 5) 在指定的位置绘制方块中的一块private void DrawOne(int x, int y, Color color, Graphics gra)/在指定的位置绘制方块中的一块 gra.FillRectangle(new SolidBrush(color), x * unitPix + 1, y * unitPix + 1, this.
17、unitPix - 1, this.unitPix - 1); gra.DrawRectangle(new Pen(Color.Black, 1), x * unitPix, y * unitPix, unitPix, unitPix); 6) 最后的一块方块位置的显示.原理:将窗口显示的方块位置无效,强制发生重绘事件public void EraseLast()/最后方块位置的显示.原理:将显示的窗口方块位置无效,强制发生重绘事件foreach(Point p in this.lastPos)this.con.Invalidate(new Rectangle(p.X*unitPix,p.Y*
18、unitPix,unitPix+1,unitPix+1);7) 填补方块图,如果发生满行情况则删去满行public void FixBlock()/填补方块图this.blockNum+;foreach(Point p in this.pos)this.aroundExistp.X,p.Y=true;this.aroundColorp.X,p.Y=this.color;this.DelRows();8) 产生下一方块public bool GeneBlock(int shapeNO, Point firstPos, Color color)/产生下一方块this.SetLastPos();th
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 课程设计 俄罗斯方块
![提示](http://www.wodocx.com/images/bang_tan.gif)