您的位置:首页 > 编程语言 > C#

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;
这行代码将亮灯信息存起来没有用到,去掉。
  • 点赞
  • 收藏
  • 分享
  • 文章举报
桃花换小鱼干儿 发布了84 篇原创文章 · 获赞 3 · 访问量 3368 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐