3> 控制
控制程序比控制我自己 的意识要容易多了. 响应键盘的 上下左右键就万事大吉
enum {TRANSFORM = 0,DOWN = 2,LEFT = -1,RIGHT = 1,FASTTOBOTOOM = 3};
先定义好变形和移动代码,在switch case中用到.FASTTOBOTOOM = 3 是什么意思咧?
先它是说不要一格一格的移动而要立即 落到底部滴干活.每按一下 向下的方向键它就下移动一行,但是要按空格键它就会立即下落到底部了.(对急性子和需要炫耀自己反应灵敏的人来说这个定义尤其爽!我属于有时候会炫耀自己反应敏捷的急性子的人!每次按空格键浑身都舒畅无比)....需要很多代码么?不需要.需要的是一点编码技巧
技巧在这儿,do while 循环 配合BOOL参数加上break.不需要额外的判断,顺溜的就向<梦想照进现实>中的那男人喝的好酒:冰爪子,从这儿下去到胃里成火线了.冰火两重天,你来试试!
控制程序比控制我自己 的意识要容易多了. 响应键盘的 上下左右键就万事大吉
enum {TRANSFORM = 0,DOWN = 2,LEFT = -1,RIGHT = 1,FASTTOBOTOOM = 3};
先定义好变形和移动代码,在switch case中用到.FASTTOBOTOOM = 3 是什么意思咧?
先它是说不要一格一格的移动而要立即 落到底部滴干活.每按一下 向下的方向键它就下移动一行,但是要按空格键它就会立即下落到底部了.(对急性子和需要炫耀自己反应灵敏的人来说这个定义尤其爽!我属于有时候会炫耀自己反应敏捷的急性子的人!每次按空格键浑身都舒畅无比)....需要很多代码么?不需要.需要的是一点编码技巧
- // 移动
- // 左右 下
- void CRBlock::Move(int to)
- {
- int i;
- switch (to)
- {
- case TRANSFORM: // 方向键 向上是变形
- m_nTimesTransform++; // 连续变形的次数
- Transform();
- break;
- case LEFT:
- case RIGHT:
- if (IsBorder(to)) // 到最左或最右边或者物体下面有物体阻挡
- {
- return;
- }
- for (i = 0; i < 4; i++)
- {
- Object.object[i].col += to;
- }
- Object.r += to;
- Object.l += to;
- break;
- case DOWN: // 一行
- MoveDown(FALSE);
- break;
- case FASTTOBOTOOM: // 到底儿
- MoveDown(TRUE);
- break;
- }
- }
技巧在这儿,do while 循环 配合BOOL参数加上break.不需要额外的判断,顺溜的就向<梦想照进现实>中的那男人喝的好酒:冰爪子,从这儿下去到胃里成火线了.冰火两重天,你来试试!
- // 向下移动bContinue 代表是一次到底还是移动一行
- void CRBlock::MoveDown(BOOL bContinue)
- {
- do
- {
- if (IsBottom()) // 到底了
- {
- SetBlockFlag();
- IsLineFull(); // 是否一行满?
- if (Object.t < 0) // 组成当前物体的最上面的方块在游戏区域外
- GameOver();
- Object = NextObject;
- GenerateObject(NextObject);// 产生下一个
- m_nTimesTransform = 0; // 新产生的方块还未变形
- break;
- }
- for (int i = 0; i < 4; i++)
- {
- Object.object[i].row += 1; // 方块下移一行
- }
- Object.b += 1; // 方块边界变了
- Object.t += 1;
- } while (bContinue);
- }
在移动物体的时候要注意的事项:
1>不能过界吧
2>不能覆盖已有物体吧
- // 检测正在下落的物体下面是否已经存在物体了
- // 或者到了最下面
- BOOL CRBlock::IsBottom()
- {
- if (Object.b >= 17) // 游戏区域时 10 * 18 转换到数组是 9 17 ,9 是最右,17 是最下
- {
- return TRUE;
- }
- for (int c = 0; c < 4; c++) // 找出每一个物体的4个方块的位置然后判断
- {
- int i = Object.object[c].row;
- int j = Object.object[c].col;
- if ((i >= 0 && j >= 0) && block[i+1][j].bSet) // 此处已经有物体了
- {
- return TRUE;
- }
- }
- return FALSE;
- }
物体落下后要干什么?当然是保存它落下的位置了?
- // 检查现在在游戏区域中最上面的一个物体所在row (0 ~ 17)
- // 在物体落下的位置标志为true.表示应该在这个地方画图形
- void CRBlock::SetBlockFlag(BOOL bSet)
- {
- if (m_topLine > Object.t)
- {
- m_topLine = Object.t;
- }
- // 检测组成物体的4个方块的位置
- for (int c = 0; c < 4; c++)
- {
- int i = Object.object[c].row;
- int j = Object.object[c].col;
- block[i][j].bSet = TRUE; // 设置此处已经被物体占据
- block[i][j].color = Object.color;
- }
- }
m_topLine 又是什么东东? 是当前垒的最高的物体所在二维数组的行值.这个值变成 小于0 就算是game over了.....希望你垒的最后一块砖不是 长条.....因为那样就像是囧到极点的老坟! ----- 装上了避雷针的埃及金字塔! <猜火车>中屎霸对马克说:That's fucking nightmare!
物体落下后光记录它落在的位置还不够,还得判断是否一行满了.
- // 看一行是否满了,假如某一行都被标记为TRUE就时满了
- BOOL CRBlock::IsLineFull()
- {
- int s = Object.t; // 最上
- int topLine = m_topLine;
- for (int e = Object.b; e >= s;) // e 和 s都有被改变的可能
- {
- int k = 0;
- for (k; k < 10; k++)
- {
- if (!block[e][k].bSet) // 未满
- {
- break;
- }
- }
- if (k == 10) // 满了就得删除这一行,并且自这行向上的行都要下移一行
- {
- for (int i = e; i >= m_topLine; i--)
- {
- for (int j = 0; j < 10; j++)
- {
- block[i][j].bSet = block[i-1][j].bSet;
- }
- }
- for (i = 0; i < 10; i++)
- {
- block[m_topLine][i].bSet = FALSE;
- }
- m_score += 100;
- m_topLine++; // 删除一行,则最高行向下移动一行
- s++; // Object所占的位置最上的一行要下移一行
- }
- else // 没有满
- {
- e--; // 则从object所占的位置行自下向上依次检测
- }
- }
- return FALSE;
- }
啊...终于说完了...这些函数的实现都不难.看着注释应该能看懂了.
后事大家自己处理吧...吼吼..
byebye之前的一个广告:
c,c++,mfc编程群.欢迎加入:58698324