MFC 实现俄罗斯方块三

3> 控制
    控制程序比控制我自己 的意识要容易多了. 响应键盘的 上下左右键就万事大吉
    enum {TRANSFORM = 0,DOWN = 2,LEFT = -1,RIGHT = 1,FASTTOBOTOOM = 3};
    先定义好变形和移动代码,在switch case中用到.FASTTOBOTOOM = 3 是什么意思咧?
先它是说不要一格一格的移动而要立即 落到底部滴干活.每按一下 向下的方向键它就下移动一行,但是要按空格键它就会立即下落到底部了.(对急性子和需要炫耀自己反应灵敏的人来说这个定义尤其爽!我属于有时候会炫耀自己反应敏捷的急性子的人!每次按空格键浑身都舒畅无比)....需要很多代码么?不需要.需要的是一点编码技巧
  1. // 移动
  2. // 左右 下
  3. void CRBlock::Move(int to)
  4. {
  5.     int i;
  6.     switch (to)
  7.     {
  8.     case TRANSFORM: // 方向键 向上是变形
  9.         m_nTimesTransform++; // 连续变形的次数
  10.         Transform();
  11.         break;
  12.     case LEFT:
  13.     case RIGHT:
  14.         if (IsBorder(to)) // 到最左或最右边或者物体下面有物体阻挡
  15.         {
  16.             return;
  17.         }
  18.         for (i = 0; i < 4; i++)
  19.         {
  20.             Object.object[i].col += to;
  21.         }
  22.         Object.r += to;
  23.         Object.l += to;
  24.         break;
  25.     case DOWN: // 一行
  26.         MoveDown(FALSE);
  27.         break;
  28.     case FASTTOBOTOOM: // 到底儿
  29.         MoveDown(TRUE);
  30.         break;
  31.     }
  32. }

    技巧在这儿,do while 循环 配合BOOL参数加上break.不需要额外的判断,顺溜的就向<梦想照进现实>中的那男人喝的好酒:冰爪子,从这儿下去到胃里成火线了.冰火两重天,你来试试!

  1. // 向下移动bContinue 代表是一次到底还是移动一行
  2. void CRBlock::MoveDown(BOOL bContinue)
  3. {
  4.     do 
  5.     {
  6.         if (IsBottom()) // 到底了
  7.         {
  8.             SetBlockFlag();
  9.             IsLineFull();  // 是否一行满?
  10.             if (Object.t < 0)  // 组成当前物体的最上面的方块在游戏区域外
  11.                 GameOver();
  12.             Object = NextObject;
  13.             GenerateObject(NextObject);// 产生下一个
  14.             m_nTimesTransform = 0; // 新产生的方块还未变形
  15.             break;
  16.         }
  17.         for (int i = 0; i < 4; i++)
  18.         {
  19.             Object.object[i].row += 1; // 方块下移一行
  20.         }
  21.         Object.b += 1; // 方块边界变了
  22.         Object.t += 1;
  23.     } while (bContinue);
  24. }

在移动物体的时候要注意的事项:
1>不能过界吧
2>不能覆盖已有物体吧

  1. // 检测正在下落的物体下面是否已经存在物体了
  2. // 或者到了最下面
  3. BOOL CRBlock::IsBottom()
  4. {
  5.     if (Object.b >= 17)  // 游戏区域时 10 * 18 转换到数组是 9 17 ,9 是最右,17 是最下
  6.     {
  7.         return TRUE;
  8.     }
  9.     for (int c = 0; c < 4; c++)  // 找出每一个物体的4个方块的位置然后判断
  10.     {
  11.         int i = Object.object[c].row;
  12.         int j = Object.object[c].col;
  13.         if ((i >= 0 && j >= 0) && block[i+1][j].bSet)  // 此处已经有物体了
  14.         {
  15.             return TRUE;
  16.         }
  17.     }
  18.     return FALSE;
  19. }

物体落下后要干什么?当然是保存它落下的位置了?

  1. // 检查现在在游戏区域中最上面的一个物体所在row (0 ~ 17)
  2. // 在物体落下的位置标志为true.表示应该在这个地方画图形
  3. void CRBlock::SetBlockFlag(BOOL bSet)
  4. {
  5.     if (m_topLine > Object.t)
  6.     {
  7.         m_topLine = Object.t;
  8.     }
  9.     // 检测组成物体的4个方块的位置
  10.     for (int c = 0; c < 4; c++)
  11.     {
  12.         int i = Object.object[c].row;
  13.         int j = Object.object[c].col;
  14.         block[i][j].bSet = TRUE; // 设置此处已经被物体占据
  15.         block[i][j].color = Object.color;
  16.     }
  17. }

m_topLine 又是什么东东? 是当前垒的最高的物体所在二维数组的行值.这个值变成 小于0 就算是game over了.....希望你垒的最后一块砖不是 长条.....因为那样就像是囧到极点的老坟! ----- 装上了避雷针的埃及金字塔! <猜火车>中屎霸对马克说:That's fucking nightmare!


物体落下后光记录它落在的位置还不够,还得判断是否一行满了.


  1. // 看一行是否满了,假如某一行都被标记为TRUE就时满了
  2. BOOL CRBlock::IsLineFull()
  3. {
  4.     int s = Object.t;  // 最上
  5.     int topLine = m_topLine;
  6.     for (int e = Object.b; e >= s;)  // e 和 s都有被改变的可能
  7.     {
  8.         int k = 0;
  9.         for (k; k < 10; k++)
  10.         {
  11.             if (!block[e][k].bSet) // 未满
  12.             {
  13.                 break;
  14.             }
  15.         }
  16.         if (k == 10)  // 满了就得删除这一行,并且自这行向上的行都要下移一行
  17.         {
  18.             for (int i = e; i >= m_topLine; i--)
  19.             {
  20.                 for (int j = 0; j < 10; j++)
  21.                 {
  22.                     block[i][j].bSet = block[i-1][j].bSet;
  23.                 }
  24.             }
  25.             for (i = 0; i < 10; i++)
  26.             {
  27.                 block[m_topLine][i].bSet = FALSE;
  28.             }
  29.             m_score += 100;
  30.             m_topLine++;  // 删除一行,则最高行向下移动一行
  31.             s++;  // Object所占的位置最上的一行要下移一行
  32.         }
  33.         else  // 没有满
  34.         {
  35.             e--;  // 则从object所占的位置行自下向上依次检测
  36.         }
  37.     }
  38.     return FALSE;
  39. }


啊...终于说完了...这些函数的实现都不难.看着注释应该能看懂了.

后事大家自己处理吧...吼吼..

byebye之前的一个广告:

c,c++,mfc编程群.欢迎加入:58698324


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值