怎么在vps上建网站,磁力多多,空间 网站都有 肿么做网站,北京seo网站内部优化在上篇降落函数中使用到了判断游戏是否结束的功能#xff0c;因此这篇先从判断游戏是否结束开始
判断游戏是否结束
void failCheck(void){if(!moveable(START_X,START_Y,MOVE_DOWN,BLOCK_UP)){setcolor(WHITE);setfont(45,0,_T(隶体));outtextxy(75,300,_T(因此这篇先从判断游戏是否结束开始
判断游戏是否结束
void failCheck(void){if(!moveable(START_X,START_Y,MOVE_DOWN,BLOCK_UP)){setcolor(WHITE);setfont(45,0,_T(隶体));outtextxy(75,300,_T(GAME OVER!));Sleep(1000);system(pause);closegraph();exit(0);}
}判断游戏是否结束最主要的判断条件是方块是否可以移动如果方块刚产生就无法移动则可以作为游戏结束的判断条件。如果游戏结束则显示游戏结束的字样。
由于游戏的运行应该不断判断方块能否移动以及游戏是否结束。这里的思路是这样的在主函数中不断循环新方块函数在新方块函数中调用移动函数在移动函数中判断游戏是否结束。相当于游戏不断调用移动函数并且不断判断游戏是否结束。
如果游戏没有结束则方块持续降落
在降落过程中要判断用户是否有键盘的输入由于降落是持续循环的相当于判断键盘输入也是持续循环的。
判断方块是否可以移动
//如果在指定位置可以在指定方向移动就返回1否则就返回0
int moveable(int x0,int y0,move_dir_t moveDir,block_dir_t blockDir){//计算当前方块的左上角在30*15的游戏区中的位置第多少行第多少列int x(y0-minY)/UNIT_SIZE;int y(x0-minX)/UNIT_SIZE;int idBlockIndex*4blockDir;int ret1;if(moveDirMOVE_DOWN){for(int i0;i5;i){for(int j0;j5;j){if(block[id][i][j]1 (xi130 || (xi0 xi30 yj0 yj15 visit[xi1][yj]1))){ret0;}}}}else if(moveDirMOVE_LEFT){for(int i0;i5;i){for(int j0;j5;j){if(block[id][i][j]1 (yj0 || (xi0 xi30 yj-10 yj-115 visit[xi][yj-1]1))){ret0;}}}}else if(moveDirNOVE_RIGHT){for(int i0;i5;i){for(int j0;j5;j){if(block[id][i][j]1 (yj115 || (yj115 || (xi0 xi30 yi10 yj115 visit[xi][yj1]1)))){ret0;}}}}return ret;
}首先找到需要判断的方块的位置判断这个位置在指定方向上的下一个位置是否越界如果没有越界则判断该位置在指定方向的下一个位置是否被占用。
如果位置越界或被占用则返回不能向指定方向移动的结果。
这里我当初有个疑问就是如果一个方块的几个格子连在一起岂不是会判断不能移动。后面发现假如指定方向是向右则这个形状方块的最右边的方块是可以移动的最右边的方块移动之后次右边的方块也可以移动了这样依次移动即可。
但是又有一个问题判断方块是否可以移动的时候是按照顺序判断的最边上的方块不一定是最先判断的除非这个判断的动作不断的循环否则只判断一轮的话是无法满足移动方块的需求的。那这个判断是否是循环进行的呢?
根据前面的描述游戏是否结束会循环判断而是否可以移动函数在判断游戏是否结束函数中被调用因此判断是否可以移动函数也是会被循环调用的。
这样一来方块下落的功能就基本上完成了。只需要在移动函数的判断语句之后加上对方块坐标的修改即可。具体代码如下
void move(void){int x START_X;int y START_Y;int k 0;block_dir_t blockDir BLOCK_UP;int curSpeed speed;// 检测游戏是否结束failCheck();// 持续向下降落while (1) {if (_kbhit()) {int key _getch();if (key KEY_SPACE) {_getch();}}// 清除当前方块clearBlock(x, k, blockDir);if (_kbhit()) {int key _getch();if(key KEY_UP) {} else if (key KEY_DOWN) {} else if (key KEY_LEFT) {} else if (key KEY_RIGHT) {}}k 20;// 绘制当前方块drawBlock(x, yk, BlockIndex, blockDir);wait(curSpeed);//k 20;// 方块的“固化”处理}
}