C#培训2019-10-23第七课方块移动 Form控制方块移动2 — 老师问题讲解
2020-02-02 09:07
543 查看
1、首先借用了上一题的代码:为了存方向信息,用了一个数组。这样所有方块的方向信息就得用一个二维数组,如下:
其次这个名称中的
综合上面,这个名称可能就会理解为:
尤其是结合
这样的话下面这行代码就不需要了:
解决意见:
这样的话,用
MovingDirection[] m_DirectionArray = new MovingDirection[ 4 ]; MovingDirection[][] m_AllObjtctDirectionArray = new MovingDirection[ m_nObjectNumber ][];
然而,实际上此题存方向信息,根本用不到数组。因为此题中,方向信息在一个Timer触发时候,只有一个方向!所以根本不用拿数组去装它,也就没有二维数组了。
2、Light.cs这个类命名不是很合适
第一次看到这个 new的时候,会觉着这个是一个灯,而实际上我在这边是表达一个灯组。
m_smallPanel = new Light( nObjectI );
那么单独看这一行,这里的
nObjectI信息就容易误导,到底是和大方块的
PositionIndex一致呢,还是灯组中每个小方块都有一个
Index。造成理解误导。 3、
m_smallPanel这个对象的名称不合适
只有我们在New这个类的对象时候:
Light m_smallPanel;才知道
m_smallPanel是代表灯。其余的时候我都是调用这个对象名称(m_smallPanel),这个时候就没有
灯这个信息了,我只知道
小方块信息,表达就很不明确。 4、
nMovingPanelX以及
nMovingPanelY这两个变量名称不合适
这两个变量设计上代表的是方块左上角的坐标,如下:
int nMovingPanelX = this.Left; int nMovingPanelY = this.Top;
首先这个名称中的
Moving,容易让人联想到
移动量,移动距离之类,而不是本意的
正在移动的。
其次这个名称中的
X和
Y,也有可能联想到
差值X、Y,而不是本意的
方块的坐标值。
综合上面,这个名称可能就会理解为:
移动量的X/Y值。
尤其是结合
bCanMoveUp = CanMoveUp( Direction, ref nMovingPanelY );中,有
ref nMovingPanelY,能不能向上移动,能的话就返回移动距离值。 5、
bCanMoveUp = CanMoveUp( Direction, ref nMovingPanelY );这一段中,“能不能向上移动”,为什么要丢“方向信息”进去
个人理解:“能不能向上移动”本身只和当前坐标以及边界条件相关,至于移动的方向是向上和向下与我这个方法没有关系。
因此可以改为:首先判断
移动方向是UP的时候,在判断“能不能向上移动”。改成:
bCanMoveUp = CanMoveUp( ref nMovingPanelY );,此时如果
bCanMoveUp是
true的时候,就直接会返回移动后的坐标值
nMovingPanelY。
这样的话下面这行代码就不需要了:
if( bCanMoveUp ) { nMovingPanelY -= m_nMovingUpSpeed; }
改成:
if( bCanMoveUp == false ) { //修改方向为向下 }6、在判断能否移动后,读者的第一反应是,我下面会移动了。但是我下面的代码却是对亮哪个灯的判断。这样会造成逻辑上的不连贯。建议更改顺序。 7、Size类型的
MoveDistanceSize的存在是否合适
如下:
// size difference after moved Size MoveDistanceSize = MoveAfterSize - MoveBeforeSize;
问题:
没有必要用Size来存的话,就尽量不用Size存。现在用一个
Size类型的变量,但是我们后面并没有用到
Size的整体概念。而是用它的
Width和
Height属性来进行判断。
解决意见:
这样的话,用
int类型的变量来存这个数据就更合适,还能取更容易理解的名称:
“垂直移动量”或者
“向上移动的量”、“向下移动量”。这样后面做逻辑判断的时候会更明确。阅读性会更强。 8、注释问题:对移动量的判断中,注释了:
// right light on,这样读者会以为下一行的代码就执行了亮灯的操作,会对后面的
EventCenter.LightOn( KeyStateLight, PositionIndex );代码部分产生疑惑:“既然已经亮灯了,为什么还要再亮一次呢?”
// horizontal direction move if( MoveDistanceSize.Width > 0 ) { // right light on KeyStateLight[ 2 ] = MovingDirection.RIGHT; } else if( MoveDistanceSize.Width < 0 ) { // left light on KeyStateLight[ 1 ] = MovingDirection.LEFT; }9、
KeyStateLightArray = KeyStateLight;这行代码将亮灯信息存起来没有用到,去掉。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- C#培训2019-10-30 数独问题 老师讲解
- C#控制方块的移动windows
- C#培训2019-11-20 ChatRoom作业——老师提出的问题总结
- Unity C#中常用类的讲解和移动的控制
- (转)c# winform 键盘按键控制操作移动控件,linkLabel,获取按键值,一个俄罗斯方块源码
- DB2界面中文乱码问题(控制中心菜单显示为方块)
- 关于c#的问题,执行application.exit();的时候会触发Form1_FormClosing
- vs2003 asp.net中直接输出wml,并利用C#做动态页面的控制,不使用微软的移动控件
- C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
- C# 中在Form控件创建以外的线程操作控件问题
- C# winform 多form传递数据问题
- C#将另一个应用程序的窗口移动到前端的问题
- 并发问题及控制手段(VFP深入讲解)
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- C# Form窗体的功能操作,无边框窗体的移动,无边框窗体的尺寸缩放,保存和恢复窗体的尺寸和坐标信息
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- C#中新建一个form实例后调用this.close,都关闭的问题
- 逐步讲解用C#实现俄罗斯方块之核心代码[上]
- 18—解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)
- C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作