还记得大笨兔以前在博客发的几篇关于如何使用C语言写俄罗斯方块游戏的文章吗?
当时大笨兔已经将基本的逻辑写完了,但还有两个功能没有加进去:游戏结束和游戏暂停。
所以这次大笨兔抽空就将这两个功能加进去了。上一张图:
打开源代码自己吓了一跳,没有分文件,所以的数据和函数都在一个文件里面。代码可读性太差,不过还好其它的逻辑不需要改动,只需要在Game_Main()函数添加一些东西就可以了。下面就说下大笨兔是怎么实现这两个功能的:
1> 游戏结束,再来一盘
这里的逻辑是:
当游戏状态为GAME_OVER的时候,停止动画,弹出对话框询问是否再来一盘,如果再来一盘则调用Game_Again(),否则设置游戏状态为GAME_EXIT(当游戏状态为GAME_EXIT的时候便结束程序)。具体的代码如下:
if(GAME_OVER == game_state){ //游戏结束 KillTimer(hwnd,TIMER_ID); result = MessageBox(hwnd,"GAME OVER AGAIN?","OVER",MB_YESNO); if(IDYES == result){//重新来一次? Game_Again(hwnd); } else{ //结束游戏 game_state = GAME_EXIT; }
Game_Again()函数的逻辑很简单:
先清空屏幕,然后设置所有的全局变量为初始状态,再设置游戏状态为GAME_INIT。就OK了。这里不得不提一下这个策略,将游戏状态分为几个,然后根据不同的状态执行不同的代码。类似下面这样:
if(GAME_INIT == game_state){ //游戏初始状态 } else if(game_state == GAME_RUN){ //处理按键信息 } else if(GAME_OVER == game_state){ //游戏结束处理 } else if(GAME_EXIT == game_state){ //退出程序 }
这里处理使得整个游戏的逻辑清晰,而且十分方便。顺便说一下我实在《windows游戏编程大师技巧》中学到的。:)
2> 游戏暂停
其实我对这个功能一直把握不准,不知道自己是不是能实现这个功能。但仔细想想的话,其具体逻辑也比较简单,像下面这样:
当按下暂停键(这个自己定义,我定义Esc是暂停键)时,停止动画。再次按下时,恢复动画。起初我还担心这中间会不会改变了什么数据从而导致恢复后与恢复前不一致。但这个担心是多余的,因为上面的框架已经帮我解决了这个问题。其代码如下:
if(KEY_UP(VK_ESCAPE)){ if(1 == pause_state){//暂停按下了 if(0 == flag_pause){//暂停画面 KillTimer(hwnd,TIMER_ID); flag_pause = 1; } else if(1 == flag_pause ){//再一次按下暂停键表示恢复 使用pause通知GAME_RUN恢复画面 pause = 1; } pause_state = 0; } }
在GAME_RUN里的第一个就是测试是否要恢复暂停,代码像下面这样:
if(1 == pause){ SetTimer(hwnd,TIMER_ID,speed,NULL); pause = 0; flag_pause = 0; }
就这样这两个动能就添加好了。还有一个小故事,在Game_Again()函数里面需要先清屏,就是将整个屏幕涂黑(请原谅我用这个词 :)。我忘了怎么使用画刷了,就一个个像素去涂。当然你知道这会大大的降低速度,但是如果你真的使用的话你会发现效果还不错(从左到右平滑擦除)。新的程 序代码在这里可以下载,点击下载。
自己使用C语言写完这个俄罗斯方块后真的有一种只要你的逻辑真确,代码就会按照你的命令执行啊! : )
(全文完)
本文链接地址: C语言自己写俄罗斯方块(完整版)
转载于:https://blog.51cto.com/dabentu/921823