很高兴又在每天的这个时间和大家一起分享自己的学习见解,今天我看了一下大话设计模式里面的单一职责原则,现在就跟大家一起分享一下自己的学习成果:
单一职责的定义:
就一个类而言,应该只有一个引起它变化的原因。
为什么要使用单一职责模式呢:
如果一个类承担的职责过多,就等于把这些职责耦合在了一起,一个职责的变化可能会削弱或者抑制这个类完成他职责的能力。这种耦合会导致脆弱的设计,设计会遭到意想不到的破坏。
现在用俄罗斯方块游戏的设计思路为例:
设计逻辑:
俄罗斯方块方块下落动画原理是画4个小方块,擦掉,然后在在下一行画4个小方块,不断的绘制和擦除就形成了动画效果,所以要有绘制和擦除的代码,除此之外,还有左移,右移,下移,翻转的代码,这些都是函数,当然左移和右移要考虑碰撞问题,下移要考虑消层和堆积问题。
界面设计:
建立一个winform窗体,添加一个用于游戏框的控件,比如一个panel,一个按钮来控制开始,再放一个Timer用于分时动画编程。写代码就是编写Timer_Tick来绘制和擦除方块,并做出消层和堆积判断,再编写控件的键盘事件,控制方块的动作,还需要用些GDI+的技术来绘制和擦除方块。
现在就要考虑如何分层编程了,这也是这一款游戏的关键所在
方块的可移动区域可以用一个二维数组来表示坐标,宽10,高20;比如:int[,]=new int[10,20];那么整个方块移动就只是数组下标的变换,比如原方块在arraysquery=[3,5];上,则下移就变成了arraysquery=[3,6];左移就变成了arraysquery=[2,5];右移就是arraysquery=[4,5];每个数组的值就是是否存在方块的标识,存在为1,不存在为0,这下你该明白了,所谓的碰撞其实是什么。
是否能左移,就是判断arraysquery[x-1,y]是否为1,否则就撞墙了,arraysquery[x,y+1]是否为1,则说明堆积了,所谓堆积只不过是判断arraysquery[x,y+1]是否为1的过程,如果为一,则arraysquery[x,y]=1,那么消层其实就是arraysquery[x,y]中循环x由0到9,判断arraysquery[x,y]是否为1,是则此行数据清零,将上一层的数组值遍历下移一位。
现在你也许明白了,所谓的游戏逻辑,其实就是数组中每一项值变化的问题,下落,旋转,左移,右移,堆积,碰撞其实都只是数组值的变化,而界面逻辑,不过是窗体类根据数组值进行绘制和擦除,或者根据键盘事件调用数组相应的方法进行变换。由此可见至少应该将该程序分两个类,一个游戏逻辑类,一个窗体类,这样以后如果更换界面,只用重新编写窗体类即可。
由于时间已晚,源码我将在我整理完毕以后通知大家,供大家下载进行研究
感谢大家对Darren博客的支持,大家也可以评论大家一起交流学习,学无止境
源码已经整理完毕,请大家下载源码进行研究: