基于Agg的扫雷程序实现(下)

      初始化了雷盘之后,玩家开始点击雷盘中的小格子,我们暂且称之为Cell,这时候初始化雷盘,要保证当前点击的地方不为炸弹,否则,一开始玩就被KO了。

      1、初始化雷盘。初始化代码主要放在InitInstance 函数中,如下:

 

Code

 

 

init_map函数中,我们采用srandrand函数来产生随机数,因为rand函数实际上产生的是伪随机数,srand去得的种子如果相同,rand产生的随机数就相同,所以我们采用系统时间的秒数来初始化srand, 初始化雷盘没什么,不是有雷就是没雷,因为随机函数产生的雷太多,而且过于集中,所以我们做些混淆,撒雷的时候每次隔6列,做六次,对雷数也有限制。

 

init_count_map计算每个区域周围有几个雷,然后保存起来。方法就是对于每个区域,扫描周围的8个位置,看是否为雷,如果是,就将数值加一,最后的值就是count_map保存的值,也是到时候我们显示的值。

 

check_map是为了自动展开功能而写的,如果一个区域周围的雷都已探明,此时应该将周围的数字全部展开。方法是对于每一个像素都检查周围的8个相邻区域,递归进行,直到不满足条件。对于一次点击要判断此处是不是雷,如果是则game over,否则显示数字,并探测是否需要自动展开。

 

如果是右键点击,首先判断是否是雷,如果是雷,则将is_bomb位激活,下次自动检测时可以将此位归为一个雷。如果第二次点击,则将标志位都归为,重新给区域画上背景色。给人一个悔过的机会。这部分代码在鼠标事件处。

 

 

 

Code

 

 

在Main函数中,去掉了Windows的消息循环,用SDL的窗口系统代替,代码如下:

 

Code

 

这个程序做得并不好 ,只是简单的做了些功能进去,当时只是为了熟悉Agg随便做着玩的,好了 最后上一张游戏GameOver的图。

 

posted @ 2009-06-23 21:37  超大狗  阅读(949)  评论(2编辑  收藏  举报